c - 信号处理程序行为
问题描述
我对系统调用信号、杀死和信号处理程序有一些疑问。我有这个代码:
int figlio=-1;
int main(int argc,char* argv[])
int pid1,pid2,dormi,numero;
float reciproco;
signal(SIGUSR1,gestore);
signal(SIGUSR2,gestore);
numero=atoi(argv[1]);
printf("Numero %d\n\n",numero);
fflush(stdout);
pid1=fork();
if(pid1>0) //PADRE
{
pid2=fork();
if(numero%2 == 0)
kill(pid1,SIGUSR1);
else
kill(pid2,SIGUSR2);
wait(NULL);
wait(NULL);
}
if(pid1 == 0) //FIGLIO1
{
//sleep(1);
printf("%d\n",figlio);
if(figlio == 1)
{
numero=numero*numero*numero;
fflush(stdout);
printf("Ho eseguito il cubo %d\n",numero);
}
else
{
pause();
if(figlio == 1) //Se il gestore di SIGUSR1 è partito
{
fflush(stdout);
printf("Ciao dal figlio 1\n");
}
}
printf("Figlio1 termina\n\n");
exit(0);
}
if(pid2 == 0) //FIGLIO2
{
if(figlio == 2)
{
dormi=numero;
reciproco=(float)numero;
reciproco=1/reciproco;
fflush(stdout);
printf("Ho eseguito il reciproco %f\n",reciproco);
sleep(dormi);
fflush(stdout);
printf("Mando un segnale a mio fratello %d\n",pid1);
kill(pid1,SIGUSR1);
}
else
printf("Arrivederci e grazie\n");
printf("Figlio2 termina\n\n");
exit(0);
}
return 0;
}
void gestore(int signo)
{
if(signo == SIGUSR1)
figlio=1;
else
figlio=2;
}
1)我不明白为什么第一个孩子中的第一个 printf 在没有 sleep(1) 的情况下返回 -1 ......似乎处理程序是在孩子开始之后执行的。
2)当一个孩子被杀时,在这之后,调度程序对孩子工作还是继续对父亲工作?
3)处理程序是在发送kill时执行还是在调度程序对孩子工作时执行?
解决方案
之后
fork()
,父进程和子进程处于竞争状态。不能保证父母有机会在孩子接听电话kill()
之前给孩子printf()
打电话。如果有多个处理器,则两个进程可以同时运行。否则,如果子进程当前未运行,Linux 将设置一些内部状态,即在下一次运行时应将信号传递给子进程,如果该进程尚未运行,则将其标记为可运行。
如果孩子当前正在运行,则立即处理该信号。否则,它会在孩子下次运行时处理。处理程序作为处理信号的结果运行。
推荐阅读
- c++ - 如何防止函数释放局部变量的内存?
- typeclass - 使用接口在 Type 上定义偏函数
- npm - TeamCity 和 NPM 通过 OAuth 令牌登录
- java - 如何在java中创建数组并传入graphviz java方法?
- python - 插入查询: ' ' 处或附近的语法错误
- c# - 将nodejs HMAC转换为c#
- excel - 将数据从一张表复制到另一张表的最有效的 vba 方法
- scip - 在与根节点具有相同参数的节点处求解 MIP
- web-scraping - 使用 rvest 抓取:出现错误 HTTP 502
- python-3.x - 3D 绘图仪仅适用于某些形状