Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 由于某种原因,无法向子进程发送信号。睡眠功能的改变以一种奇怪的方式产生_C_Unix_Ipc_Sleep - Fatal编程技术网

C 由于某种原因,无法向子进程发送信号。睡眠功能的改变以一种奇怪的方式产生

C 由于某种原因,无法向子进程发送信号。睡眠功能的改变以一种奇怪的方式产生,c,unix,ipc,sleep,C,Unix,Ipc,Sleep,我是C开发的初学者。我试图了解C是如何管理杀戮、信号和睡眠的。见: void son1_handler(int sig) { printf("[SON1]:"); fflush(stdout); } void son2_handler(int sig) { printf("[SON2]:"); fflush(stdout); } int main(int argc, char **argv) { pid_t son1, son2; son1 =

我是C开发的初学者。我试图了解C是如何管理杀戮、信号和睡眠的。见:

void son1_handler(int sig)
{
    printf("[SON1]:");
    fflush(stdout);
}

void son2_handler(int sig)
{
    printf("[SON2]:");
    fflush(stdout);
}

int main(int argc, char **argv)
{
    pid_t son1, son2;
    son1 = fork();
    if (son1 == 0)
    {
        while (1)
        {
            signal(SIGUSR1, son1_handler);
        };
    }

    son2 = fork();
    if (son2 == 0)
    {
        while (1)
        {
            signal(SIGUSR2, son2_handler);
        };
    }

    while (1)
    {
        sleep(1);
        kill(son1, SIGUSR1);
        kill(son2, SIGUSR2);
    }
}
我的目标是打印:[SON1]:[SON2]:[SON1]:[SON2]。。。。 使用上面的代码,有时会得到,有时会得到[SON2]:[SON1]:[SON2]

我想在两次杀人之间改变睡眠方式:

kill(son1, SIGUSR1);
sleep(1);
kill(son2, SIGUSR2);
但令人惊讶的是结果是:[SON2]:[SON2]:[SON2]:[SON2]:[SON2]:[SON2]


我想我一定是对睡眠、杀戮或信号产生了误解。你有什么想法吗?真的,先谢谢你

这是因为进程调度

当您“发送”信号时,PCB()中的相应位被设置。 然后,当信号发送到的进程被调度时,它检查信号并运行处理程序

在上面的示例中,父进程一个接一个地发送信号,但不能保证“son1”将在“son2”之前执行

睡眠只允许操作系统“切换上下文”,即允许其他程序运行。那么在这种情况下,

kill(son1, SIGUSR1);
sleep(1);
kill(son2, SIGUSR2);
您向son1发送一个信号,然后将父进程置于睡眠状态。但是,son1进程不必再次排在父进程之前。这取决于操作系统的进程调度器。如果您想像您提到的那样实现同步,您需要使用某种互斥机制,比如信号量

希望能把事情弄清楚

编辑:
此外,在Linux中,信号处理程序即使在后续调用之后也会保持注册状态,而在Unix中,信号处理程序在一次调用后会取消注册。这意味着您只需在子程序中调用signal()一次,而不必在while()循环的每次迭代中调用。

非常感谢。我现在明白多了。惊人的反应。