信号处理程序行为
Signal Handler Behavior
我有一些关于系统调用 signal、kill 和信号处理程序的问题。
我有这个代码:
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) 不明白为什么第一个child, return -1中的第一个printf没有sleep(1) before...好像handler是在child.
的开头
2) 当 child 被杀死时,此后,调度程序在 child 上工作或继续在父亲上工作?
3) 处理程序在发送 kill 或调度程序在 child?
上运行时执行
在fork()
之后,parent和child进程处于竞争状态。无法保证 parent 有机会在 child 到达 printf()
调用之前向 child 发出对 kill()
的调用。
如果有多个处理器,两个进程可以同时 运行ning。否则,如果 child 当前不是 运行ning,Linux 将设置一些内部状态,以便在下一次 运行 时将信号传递给 child 进程]s,它会将进程标记为 运行nable(如果尚未启用)。
如果 child 当前为 运行ning,信号会立即得到处理。否则,在child下一个运行时处理。作为处理信号的结果,处理程序是 运行。
我有一些关于系统调用 signal、kill 和信号处理程序的问题。 我有这个代码:
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) 不明白为什么第一个child, return -1中的第一个printf没有sleep(1) before...好像handler是在child.
的开头
2) 当 child 被杀死时,此后,调度程序在 child 上工作或继续在父亲上工作?
3) 处理程序在发送 kill 或调度程序在 child?
在
fork()
之后,parent和child进程处于竞争状态。无法保证 parent 有机会在 child 到达printf()
调用之前向 child 发出对kill()
的调用。如果有多个处理器,两个进程可以同时 运行ning。否则,如果 child 当前不是 运行ning,Linux 将设置一些内部状态,以便在下一次 运行 时将信号传递给 child 进程]s,它会将进程标记为 运行nable(如果尚未启用)。
如果 child 当前为 运行ning,信号会立即得到处理。否则,在child下一个运行时处理。作为处理信号的结果,处理程序是 运行。