有没有最简单的方法在子进程中等待,直到标志/事件发生变化?

时间:2015-06-23 09:42:32

标签: c linux

这是我的示例程序但是它作为标志不会影响子进程甚至sem_wait,sem_trywait也不会工作,除了信号和fcntl还有其他任何方式等待特定事件触发。

#include "header.h"
void main()
{
    int flag = 1;
    pid_t cpid;
    sem_t semobj;
    int value;
    cpid = fork() ;
    sem_init ( &semobj, 0, 2);
    if ( cpid == 0)
    {
        printf ("Chile Process id = %d, PPID= %d\n",getpid(),getppid());
        while ( FLAG ); // here i need to wait until parent process disables the flag
        //sem_trywait ( &semobj);
        //sem_getvalue ( &semobj, &value );
        printf ( "After Wait =%d\n", FLAG );
        sleep(10);
    }
    else
    {
        printf( "Parent Process id =%d\n",getpid() );
        sleep(3);
        printf( "Setting Flag value\n" );
        FLAG = 0; // here i need to set a flag
        sleep(7);

    }
}

3 个答案:

答案 0 :(得分:2)

我想没有“最简单的方法”。

问题是你在这里处理两个单独的进程。如果你想在两者之间进行任何通信,你必须使用某种IPC(进程间通信)机制。我建议你在这个主题上阅读类似this的内容并选择一个。

您的代码无法正常工作,因为一旦您fork()编辑,您就有两个地址空间,每个地址空间都有自己的变量集(包括信号量变量)。因此,父进程在其地址空间中执行的任何操作都不会影响子地址空间中的任何变量,因此不会发生通信。

答案 1 :(得分:1)

我建议阅读this page上“命名信号量”部分中的内容。

您的问题是您没有命名您的信号量,因此您的信号量会被复制用于子进程。 这意味着,正如Igor在他的回答中已经解释的那样,信号量变量对于子进程和父进程是不一样的。

命名信号量可以在两个进程之间共享,因此您的父进程可以发出子进程的信号。

答案 2 :(得分:0)

查看http://www.yendor.com/programming/unix/apue/ch8.html,同步库部分。

基本上你想要

TELL_WAIT
TELL_PARENT
TELL_CHILD
WAIT_PARENT
WAIT_CHILD

功能

链接的示例使用信号来实现它们,但您还应该能够使用管道共享内存+ posix信号量 SysV信号量来实现它们

如果你想使用Posix信号量,信号量需要在共享内存(shm_open)中,并在分叉之前初始化为0.

另外,这不是你使用fork的方式 - 看看我的答案(并减去exec部分): How to start process on Linux OS in C, C++