[英]Signal Handler Behavior
我對系統調用信號,終止和信號處理程序有一些疑問。 我有以下代碼:
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會在...之前返回-1而沒有sleep(1)...似乎是在孩子開始之后執行了處理程序。
2)當一個孩子被殺時,此后,調度程序對孩子起作用還是繼續對父親起作用?
3)當發送終止消息或調度程序在子進程上運行時,執行處理程序?
在fork()
,父進程和子進程處於競爭狀態。 無法保證在孩子到達printf()
調用之前,父母有機會向孩子發出kill()
printf()
調用。
如果有多個處理器,則兩個進程可以同時運行。 否則,如果子進程當前未在運行,則Linux將設置一些內部狀態,以便在下次運行子進程時將信號傳遞給該子進程,並且如果該子進程尚未運行,則將其標記為可運行。
如果孩子當前正在跑步,則信號將立即得到處理。 否則,它將在下一個孩子運行時進行處理。 處理程序作為處理信號的結果而運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.