基本上我有两个代码。 其中之一必须在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