基本上我有兩個代碼。 其中之一必須在shell中打印「TIME!」每次它收到一個SIGUSR1信號。 我們稱之爲exercici.cC,fork和exec進程,併發送信號
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
char buffer[1000];
void captura_signal(int signum){
if(signum == SIGUSR1){
sprintf(buffer,"TIME! %d\n",getpid());
write(1,buffer,strlen(buffer));
}
}
int main(int argc, char *argv[]){
signal(SIGUSR1, captura_signal);
while(1){
pause();
}
}
另一種,必須創建三個子進程(只有一個父和三個孩子的)和execlp exercici.c上的每個孩子。然後,父母每秒都必須向一個孩子發送一個SIGUSR1,每秒遞增一個。我稱之爲exercici2.c
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
bool ready = 1;
void sigAlarm(int sig){
if (sig == SIGALRM){
ready = 1;
}
}
int main(int argc, char *argv[]){
int pid[3];
signal(SIGALRM,sigAlarm);
for(int i = 0; i<3;i++){
if((pid[i]=fork()) == 0){
execlp("./exercici","exercici",(char*)NULL);
}
}
int j =0;
while(1){
if(ready){
ready = 0;
kill(pid[j],SIGUSR1);
j = ((j+1)%3);
alarm(1);
}
}
}
的問題是,當我執行exercici2.c它將只創建2個進程,我只接收時間!其中2個。它跳過一個pid [0]。
你可以在'fork'(測試fork()== -1')中測試錯誤,並使用'perror'打印出任何錯誤嗎? (小貼士:考慮一個switch語句,其中'default'是父進程)...哦。並測試'execlp',而你在...;-) – Myst
另外,在某些時候用'SIGINT'殺死孩子不是一個好主意嗎? – Myst