2016-09-12 4 views
1

zu senden Ich erstelle Prozessbaum mit fork() (etwa 3 Kind). Ich kann einfach ein Signal an alle senden, indem ich kill (-getpgrp(), signal_number), aber wie mache ich dasselbe mit sigqueue? Die sigqueue() - Funktion sendet ein Signal an einen Prozess oder eine Gruppe von Prozessen, aber im Gegensatz zu kill() kann ich sigqueue() nicht verwenden, um ein Signal an eine ganze Prozessgruppe zu senden, indem a angegeben wird negativer Wert in pid.sigqueue() um ein Signal an die Prozessgruppe

Also, wie geht das?

EDIT:

Code:

s1.c ist ein Programm, in dem i "fangen" die Signale Kontrolle über sie zu übernehmen. Also wartet das Paar von s1 (mit der gleichen Gruppen-ID) auf das Signal von sigqueue().

int main (int argc,char *argv[]) 
{ 

    int i=0; 
    char *do=argv[1]; 
    int b=atoi(argv[2]); 
    int y=fork(); 
    if(argc !=3) 
    { 
     printf("wrong arg number\n"); 
     exit(0); 
    } 

do{ 

switch(fork()) 
    { 
    case -1: 
      perror("error \n"); 
      exit(1); 
      break; 
    case 0: 
      execl("s1","s1.c",argv[1],argv[2], NULL); 
      break; 
    default: 
      sleep(2); 
      break; 
} 
i++; 
} 
while(i<3); 
    sleep(2); 
    printf("ssignal %d send to gpid : %d\n",b,getpgrp()); 

    union sigval value; 
    value.sival_int = 0; 
    value.sival_ptr = 0; 

    if(sigqueue(getpgrp(), b, value) == 0) { 
      printf("signal sent successfully!!\n"); 
    } else { 
      perror("SIGSENT-ERROR:"); 
    } 
    return 0; 


while(wait(0) != -1){} 

return 0; 
}  
+1

"Die' sigqueue() 'Funktion sendet ein Signal an einen Prozess ** oder eine Gruppe von Prozessen ** ..." Wo kann man mit 'sigqueue()' ein Signal senden? eine ganze Prozessgruppe? Die [POSIX-Spezifikation] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigqueue.html) und [Linux-Manpage] (http://man7.org/linux/man-pages/man3/sigqueue .3.html) beide können nur einen einzigen Prozess signalisieren. –

+0

[link] (https://www.mkssoftware.com/docs/man3/sigqueue.3.asp), hier. Ok, wie kann ich das machen? Es ist möglich? Viele Beiträge sagen mir, dass kill() und sigqueue() ziemlich gleich sind ... – Baal

Antwort

0

Wenn Ihre Implementierung in der Tat Unterstützung Prozessgruppe Signalisierung in sigqueue, dann müssen Sie wahrscheinlich genau what you would do for the pid argument to kill tun:

sigqueue(-getprgp(), signo, value); // Nonstandard. Remember to _negate_ the PGID 
sigqueue(0, signo, value);   // Nonstandard. Shorthand to signal my own PGID 

Durch den strengen Standard, aber Sie sind kein Glück. sigqueuesupports neither the null signal (0) nor the ability to signal groups of processes:

Die Standard-Entwickler erforderlich, dass sigqueue() die gleiche Semantik in Bezug auf das Nullsignal als töten(), und dass die gleiche Erlaubnis Prüfung verwendet werden. Aber wegen der Schwierigkeit, die "Broadcast" -Semantik von kill() (zum Beispiel, um Gruppen zu verarbeiten) und die Interaktion mit Ressourcenzuweisung zu implementieren, wurde diese Semantik nicht angenommen. Die Funktion sigqueue() stellt ein Signal für einen einzelnen Prozess bereit, der durch das Argument pid angegeben wird.

+0

Meine Implementierung von 'sigqueue' ist von also keine Chance ... Aber es gibt keinen anderen Weg dies zu tun? Irgendwie pid out pid von jedem Kind, das ich erstelle? – Baal

+0

@Baal, mit "Implementierung" meine ich die Plattform/Umgebung, auf der Sie laufen. Wie für andere Möglichkeiten, um zu tun, was Sie wollen ... Ich würde vorschlagen, dass Sie eine separate Frage auf dieser Website stellen. – pilcrow

Verwandte Themen