Comment faire pour qu’un processus continue son exécution quand il attend un signal avec pause () et qu’il ne le reçoit pas

Je suis nouveau sur le forum et j’ai cherché sur Google mon problème mais je ne l’ai pas trouvé. Quoi qu’il en soit, je ne suis pas très expert en recherche sur le forum, veuillez donc m’excuser si cela a déjà été répondu. Ok, allons droit au but: je fais un petit projet pour le collège où j’ai le code suivant écrit en C:

#include  #include  #include  #include  int ARB,A,B,X,Y,Z,i; void senyal(){ //signal USR1 method if(getpid()==A){ printf("I'm A process, I've received the signal\n"); system("pstree"); } else if(getpid()==B){ printf("I'm B process, I've received the signal\n"); system("pstree"); } else if(getpid()==X){ printf("I'm X process, I've received the signal\n"); execlp("ls", "ls", "-al", "*.c", NULL); } else if(getpid()==Y){ printf("I'm Y process, I've received the signal\n"); execlp("ls", "ls", "-al", "*.c", NULL); } } int main (int argc, char *argv[]){ char p=argv[1][0]; int num=(int)p; pid_t pid; pid_t pid2; pid_t pid3; ARB=getpid(); pid=fork(); //Creates father ARB and A child if(pid==-1){ printf ("Error"); } else if(pid==0){ // A child printf ("I'm A process: my pid is %d. My father is %d \n",getpid(), ARB); A=getpid(); if(num==65||num==97){ num=A;} pid2=fork(); //A is the father and creates B child if(pid2==-1){ printf ("Error2");} else if(pid2==0){// B child B=getpid(); if(num==66||num==98){ num=B;} printf("I'm B process , my pid is %d. My father is %d. My grandfather is %d \n",getpid(),getppid(),ARB); pid3=fork();//Creates X switch(pid3){ case -1: printf("Error3"); break; case 0: printf("I'm X process, my pid is %d. My father is %d. My grandfather is %d. My great grandfather is %d\n",getpid(),getppid(),A,ARB); X=getpid(); if(num==88||num==120){ num=X;} signal(10,senyal); printf("I'm X (%d) and I die\n",X); exit(X); break; default: break; } pid3=fork();//Creates Y switch(pid3){ case -1: printf("Error no he podido crear el proceso hijo\n"); break; case 0: printf(I'm Y process, my pid is %d. My father is %d. My grandfather is %d. My great grandfather is %d\n",getpid(),getppid(),A,ARB); Y=getpid(); if(num==89||num==121){ num=Y;} signal(10,senyal); printf("I'm Y (%d) and I die\n",Y); exit(Y); break; default: break; } pid3=fork();//Creates Z switch(pid3){ case -1: printf("Couldn't create children proccess\n"); break; case 0: printf("I'm Z process, my pid is %d. My father is %d. My grandfather is %d. My great grandfather is %d\n",getpid(),getppid(),A,ARB); Z=getpid(); printf("I'm Z (%d) and I die\n",Z); sleep(argc); // kill(num,SIGUSR1);//sends a signal to any of the other process (A/B/X/Y) exit(Z); break; default: break; } wait();//wait for the childrens' death wait(); wait(); printf("I'm B(%d) and I die\n",B); exit(B);//B's death } else{//Father A signal(10,senyal); wait();//await B's death printf("I'm A (%d) and I die\n",A); exit(A); //A's death } } else{//Padre ARB printf ("\nI'm the process arb: my pid is %d\n",getpid()); signal(10,senyal); wait(); //await A's death } wait(); printf("I'm arb (%d) and I die\n",ARB); exit (0);//ARB's death } 

Donc, fondamentalement, le code est censé créer un arbre de traitement et ensuite recevoir un paramètre qui indique le PID du processus qui doit recevoir le signal de type USGR1 que le processus Z envoie. Mon problème ici est que je veux que chaque processus soit préparé pour recevoir le signal, mais dans le cas où le processus ne le reçoit pas (par exemple, le processus A attend et est prêt à recevoir le signal de Z mais Z l’envoie à B). ) Je ne sais pas comment dire ce processus pour continuer et ne pas restr coincé pour toujours. En gros, désolé si je commettais des erreurs de grammaire ou d’explication, mais je viens d’espagne. Merci à tous ceux qui sont prêts à répondre!

Depuis la page de manuel de pause ():

LA DESCRIPTION

pause () provoque la mise en veille du processus appelant (ou du thread ) jusqu’à ce qu’un signal soit envoyé qui termine le processus ou provoque l’appel d’une fonction de capture de signal.

Donc, vous avez besoin d’un autre thread qui retarde avec sleep () ou similaire et envoie le signal quand même après un certain temps. Ou utilisez autre chose que de faire une pause, comme dormir.

Pour attendre un signal ou un délai, utilisez select , pselect , poll ou ppoll .

Les versions p sont utilisées pour les masques de signal personnalisés, ce qui peut être quelque chose dont vous avez besoin, mais dans ce cas probablement pas.

Ces fonctions sont conçues pour prendre des ensembles de descripteurs de fichiers, mais elles fonctionnent parfaitement sans descripteur de fichier.

cela fait longtemps. Désolé d’avoir pris le temps de répondre et merci encore à tous ceux qui ont répondu, vos conseils ont été très utiles. Donc, j’ai finalement trouvé un moyen de résoudre mon problème. Après avoir essayé avec pause, sumil et beaucoup de choses sans vraiment arriver où je voulais, j’ai réalisé que je pouvais utiliser le signal «alarme». J’ai utilisé la commande pause () pour que les processus attendent un signal, mais cette fois-ci, je mets un signal SIGALARM dans le processus Z, qui a pour but de lancer un signal aux autres. Ainsi, dans tous les cas où Z a lancé le signal et qu’il est sur le sharepoint mourir, il déclenche une alarme qui réveille chaque processus de son état de pause. Cela a résolu mon problème, alors j’espère que ce post aidera quiconque avec ce problème. Merci encore à tous les gars!