【发布时间】:2021-12-20 12:12:31
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
static void sigusr(int iSig) //SIGUSER are the user defined signals
{
if (iSig == SIGUSR1)
{
printf("Received SIGUSR1 signal, going to sleep for 2 seconds\n");
sleep(2);
}
}
int main ()
{
int pid;
signal(SIGUSR1, sigusr);
pid = fork();
if (pid > 0) //Parent process created
{
for(int i=0; i<=1000;i++)
{
printf("%d\n",i);
usleep(70);
}
}
else //Child process created
{
sleep(5);
kill(pid,SIGUSR1);
exit(0);
}
}
使用 fork() 创建 2 个进程,一个父进程和一个子进程。
父级打印从 0 到 1000 的“i”值,然后退出。
同时子进程在创建后休眠 5 秒,
向父级发送 SIGUSR1 信号,然后退出。
父级应捕获该信号,在标准输出上打印“收到 SIGUSR1 信号,
睡 2 秒”,睡 2 秒,然后继续打印数字。
但是子进程终止后我无法继续该进程。
【问题讨论】:
-
我不确定 printf() 和 sleep() 是否可重入。不要从 sig 处理程序中调用它们。改为设置一个变量并从打印循环中检查该变量。
-
很多事情都在制造问题。你不在父亲里面等孩子,孩子里面pid的值是什么?顺便说一句 printf 不是信号安全的。
标签: c operating-system signals fork parent-child