0
int *sharedmem(key_t *key,char k,int size){
int shmid;
int *segptr;
*key=ftok('.',k);
if((shmid=shmget(*key,size,IPC_CREAT|IPC_EXCL|0666))==-1){
printf("Shared memory segment exists - opening as client\n");
if((shmid = shmget(*key, size, 0)) == -1){
perror("bad shmget");
exit(1);
}
}
else
printf("Creating new shared memory segment\n");
if((segptr = shmat(shmid, 0, 0)) == NULL){
perror("bad shmat");
exit(1);
}
return segptr;
}
int main(){
...
mem=sharedmem(&key,'a',2);
fpid=getpid();
signal(SIGHUP,sighup);
if(pid=fork()==0){
...
mem[0]=1;
kill(fpid,SIGHUP);
}
else {//parent
//read data from mem[0] when receiving the signal.
}
如何從父進程中的mem [0]接收到來自子進程的信號時讀取數據? 我想通知父母數據已寫入共享內存,父母可以讀取它。從子進程獲取信號後從共享內存中獲取數據
當父的信號處理程序返回時,家長可以簡單地讀取數據。這可能意味着使用'等待信號'調用('pause()','sigwait()'等),或者可能父母還有其他工作要做。在某些時候,它需要檢查信號處理程序中設置的標誌,以指示數據已準備就緒。 –
我的建議:鬆開所有的信號處理。使用一個互斥鎖,在共享內存中有兩個數據項,一個表示數據是可用的,由孩子設置並由父母讀取。第二個包含實際數據'mem [0]'/ parent在開始孩子之前清除存儲位置。孩子準備好後,鎖定互斥鎖,設置數據,設置'可用'標誌,解鎖互斥鎖。父鎖互斥,檢查標誌,如果標誌設置,讀數據endif,解鎖互斥 – user3629249