暂停()呼叫后如何恢复?

时间:2013-12-11 03:49:07

标签: c fork semaphore

我需要在调用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!"

1 个答案:

答案 0 :(得分: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替换sem