gpt4 book ai didi

c - 由于某种原因,向子进程发送信号丢失了。 sleep 功能的改变导致了一种奇怪的结果

转载 作者:行者123 更新时间:2023-12-02 17:43:38 25 4
gpt4 key购买 nike

我是一名 C 开发初学者。我试图了解 C 如何管理杀戮、信号和 sleep 。请参阅:

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]...

我认为在击杀之间使用 sleep 来改变:

kill(son1, SIGUSR1);
sleep(1);
kill(son2, SIGUSR2);

但令人惊讶的是结果是:[SON2]:[SON2]:[SON2]:[SON2]:[SON2]....

我想我一定是对 sleep 、杀戮或信号有什么误解。你有什么想法?真的提前致谢。

最佳答案

这是因为进程调度。

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

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

sleep 只是允许操作系统“切换上下文”,即允许其他程序运行。所以,在这种情况下

kill(son1, SIGUSR1);
sleep(1);
kill(son2, SIGUSR2);

您向 son1 发送信号,然后让父进程进入休眠状态。但是,son1 进程不必再次调度在父进程之前。这取决于操作系统的进程调度程序。如果您想实现像您提到的那样的同步,您需要使用某种互斥机制,例如信号量。

希望事情能够解决。

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

关于c - 由于某种原因,向子进程发送信号丢失了。 sleep 功能的改变导致了一种奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com