2013-12-11 171 views
1

我需要調用pause()後恢復,從我讀的手冊,它應該恢復後,它收到一個信號,但顯然不是爲我工作,我也使用信號量,以確保程序註冊信號處理程序,然後再發送信號以恢復它如何在暫停()通話後恢復?

void child(){ 
    fprintf(stdout,"Hello!\n"); 
    exit(0); 
} 

int main(int argc, char **argv){ 
    sem_t sem; 
    sem_init(&sem,0,0); 
    int pid = fork(); 
    if(pid == 0){ 
     signal(SIGCONT, child); 
     sem_post(&sem); 
     pause(); 
    } else { 
     sem_wait(&sem); 
     kill(pid, SIGCONT); 
     int status; 
     waitpid(pid,&status, 0); 
    } 
    return EXIT_SUCCESS; 
} 

這不是我正在處理的實際程序,但它具有它的結構。

正在發生的事情是父掛起,在waitpid()和孩子永遠不會離開pause()電話,我知道這是因爲它從來沒有打印消息"Hello!"

+0

如果它不工作,發生了什麼? – Xymostech

+0

我忘了補充一點,謝謝:) –

+1

檢查'sem_init'的返回值。也許在您的系統上不支持未命名的信號量。我在OS X機器上遇到過這種情況。編輯:另外,不應該你的第二個參數是非零? 「如果pshared參數具有非零值,那麼信號量將在進程之間共享;在這種情況下,任何可以訪問信號量sem的進程都可以使用sem執行sem_wait(),sem_trywait(),sem_post()和sem_destroy()操作「。 – tangrs

回答

1

它看起來像你實際上犧牲品的失敗共享信號量。如果您按照this answer的步驟,將信號共享內存,那麼你的程序正常工作:

#include <sys/mman.h> 

... 

sem_t *sem = mmap(NULL, sizeof(sem), 
    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 
    -1, 0); 

(顯然取代&sem s的sem

+0

非常感謝你的快速回復:) –