C 由于某种原因,无法向子进程发送信号。睡眠功能的改变以一种奇怪的方式产生
我是C开发的初学者。我试图了解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 =
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()循环的每次迭代中调用。非常感谢。我现在明白多了。惊人的反应。