- 论坛徽章:
- 0
|
父子进程互送信号的源程序中的一个问题
Pls try my pg: 
Pls don't look the comm. I write it in French. I' m so lazy, I'd not 2 translate in English.
------------------------------------------------------------------
#include <stdio.h>;
#include <sys/sem.h>;
#include <sys/shm.h>;
#include <sys/ipc.h>;
#include <sys/types.h>;
#include <stdlib.h>;
#include <time.h>;
#include <errno.h>;
#include <wait.h>;
#include <string.h>;
int main()
{
int drap; /* pour la creation de la cle IPC */
int mode;
int clem;
int res; /* pour verifier les codes retour */
int fils; /* pour la gestion du pere-fils */
int status;
int memp; /* descripteur de la memoire partagee */
int taille; /* taille de la memoire partagee */
struct shmid_ds shminfo; /* pour recuperer des informations sur la memoire partagee */
char *test, *ntest; /* pour les tests sur la memoire partagee (on y stocke une chaine) */
char alphabet[40];
drap=IPC_CREAT|IPC_EXCL; /* la cle IPC ne doit pas exister */
mode=0666; /* les droits sur la ressource */
clem=ftok("memp1.c",'b'); /* generation de la cle IPC */
taille=2000; /* initialisation de la taille de memoire partagee */
memp=shmget(clem,taille,drap|mode); /* creation du descripteur de ressources */
if (memp==-1)
{ perror("creation de la memoire partagee " ;
}
else { printf("idf de la memoire partagee %d\n",memp);
res=shmctl(memp,IPC_STAT,&shminfo); /* recuperation d'informations */
if (res==-1)
perror("stat avant attachement " ;
else { /* affichage des informations recuperees */
printf("----------0--taille en octets %d\n",shminfo.shm_segsz);
printf("----------0--pid proprietaire %d\n",shminfo.shm_cpid);
printf("----------0--nombre d'attachements %d\n",shminfo.shm_nattch);
/* attachement de la memoire partagee (sur la variable test) */
test=(char *)shmat(memp,(char *)0,0);
if (test==(char *)-1)
perror("premier attachement de la memoire partagee " ;
else { printf("resultat sur le premier attachement %s\n",test);
/* initilaisation et remplissage de la variable test */
bzero(test,taille);
strcpy(alphabet,"aaaaaaaaaaaaaaaaaaaaa" ;
memcpy(test,alphabet,20);
printf("valeur de la variable test avant le fork %s\n",test);
res=shmctl(memp,IPC_STAT,&shminfo); /* recuperation d'informations */
if (res==-1)
perror("stat apres le premier attachement \n" ;
else {
printf("----------1--taille en octets %d\n",shminfo.shm_segsz);
printf("----------1--pid proprietaire %d\n",shminfo.shm_cpid);
printf("----------1--nombre d'attachements %d\n",shminfo.shm_nattch);
/* creation du processus fils */
fils=fork();
if (fils==0)
{ /* programme fils */
printf(">;>; debut du fils\n" ;
printf("valeur de memp dans le fils %d\n",memp);
/* attachement de la memoire partagee (sur la variable ntest) */
ntest=(char *)shmat(memp,(char *)0,0);
if (ntest==(char *)-1)
perror("second attachement" ;
else { printf("resultat sur le second attachement %s\n",ntest);
/* recuperation d'informations */
res=shmctl(memp,IPC_STAT,&shminfo);
if (res==-1)
perror("stat apres second attachement \n" ;
else { printf("----------2--taille en octets %d\n",shminfo.shm_segsz);
printf("----------2--pid proprietaire %d\n",shminfo.shm_cpid);
printf("----------2--nombre d'attachements %d\n",shminfo.shm_nattch);
printf("valeur initiale de la variable ntest dans le fils %s\n",ntest);
/* ecriture dans la variable partagee */
strcpy(alphabet,"bbbbbbbbbb" ;
memcpy(ntest,alphabet,10);
printf("valeur modifiee de la variable testnum dans le fils %s\n",ntest);
printf(">;>; fin du fils\n" ;
return(0);
}
}
}
else
{ /* programme pere */
sleep(10);
printf("pg principal: apres fork le pid du fils est %d\n",fils);
/* modification de la variable partagee */
strcpy(alphabet,"ccccc");
memcpy(test,alphabet,5);
printf("valeur de la variable test en fin de pere %s\n",test);
/* suppression de la ressource IPC */
res=shmctl(memp,IPC_RMID, &shminfo);
/* fin du pere */
res=wait(&status);
}
}
}
}
}
return(0);
} |
|