2015-01-06 36 views
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]接收到來自子進程的信號時讀取數據? 我想通知父母數據已寫入共享內存,父母可以讀取它。從子進程獲取信號後從共享內存中獲取數據

+0

當父的信號處理程序返回時,家長可以簡單地讀取數據。這可能意味着使用'等待信號'調用('pause()','sigwait()'等),或者可能父母還有其他工作要做。在某些時候,它需要檢查信號處理程序中設置的標誌,以指示數據已準備就緒。 –

+0

我的建議:鬆開所有的信號處理。使用一個互斥鎖,在共享內存中有兩個數據項,一個表示數據是可用的,由孩子設置並由父母讀取。第二個包含實際數據'mem [0]'/ parent在開始孩子之前清除存儲位置。孩子準備好後,鎖定互斥鎖,設置數據,設置'可用'標誌,解鎖互斥鎖。父鎖互斥,檢查標誌,如果標誌設置,讀數據endif,解鎖互斥 – user3629249

回答

0

在您的父母中,您可以只讀取信號處理程序中的共享數據。但是,根據您想要處理的數據,您可能需要採用不同的策略。例如:

  • 增加信號處理程序中的全局靜態變量(使其成爲volatile sig_atomic_t)。然後在你的程序的主循環中測試這個,並採取適當的行動。

  • 更好,使用自管。解釋here。實質上創建一個非阻塞的pipe()並從你的信號處理程序向它寫入一個字符。 select()在管道的讀取側以正常方式在主循環中。

  • 如果您的父進程是多線程的,請考慮放棄信號處理程序並使用信號量或類似信號。