2013-12-11 63 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

非常感谢你的快速回复:) –