我正在编写一个Unix程序,其父进程分叉子p1.the父进程处理SIGUSR1。
子进程每1秒生成一个1到9之间的随机数,并使用管道发送给父亲父亲接收数字并将其打印到控制台。当父进程捕获SIGUSR1信号时,他开始只打印奇数,当收到的号码是11他通过发送SIGTERM信号杀死孩子。父亲等待状态,然后终止孩子。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#define READ_END 0
#define WRITE_END 1
volatile sig_atomic_t token;
void handle_me(int signum)
{
token=0;
}
int main(int argc, char *argv[]){
pid_t child1;
token=1;
int pipe1[2],status;
unsigned int bufChild1,bufChild2;
if (pipe(pipe1) == -1)
{
fprintf(stderr, "Pipe failed");
}
child1 = fork();
if (child1 < 0)
{
fprintf(stderr, "Fork Failed");
return 0;
}
else if (child1 == 0)
{
printf(" child with pid %d\n", getpid());
printf("The Parent pid is %d\n", getppid());
while(1)
{
bufChild1 = (unsigned int)rand()%9 +1;
fprintf(stdout, "generated: %u\n", bufChild1);
close(pipe1[READ_END]);
write(pipe1[WRITE_END],&bufChild1,sizeof(bufChild1)); //write into the Parent
close(pipe1[WRITE_END]);
}
}
else
{
signal(SIGUSR1,handle_me);
printf(" Parent Process\n");
while(!token)
{
close(pipe1[READ_END]);
read(pipe1[READ_END],&bufChild2,sizeof(bufChild2)); //write into the Parent
fprintf(stdout, "Received: %u\n", bufChild2);
close(pipe1[WRITE_END]);
}
}
wait(&status);
return 1;
}
我想知道当父进程捕获SIGUSR1信号时他是如何实现这个条件的,他开始只打印奇数,当收到的数字是11时,他通过发送sigterm信号来杀死孩子。
我使用了一个全局变量,如果SIGUSR1被父亲捕获,可以设置 如果有人可以帮助我,我将非常感激。
答案 0 :(得分:0)
该程序包含一些错误。
#include <signal.h>
。sleep(1)
放入子进程的while
循环中。close(pipe1[WRITE_END]);
否则就不能再写给父母。close(pipe1[READ_END]);
,否则无法再从孩子那里读取。我想知道如何在父进程捕获时实现这个条件 SIGUSR1信号他开始只打印奇数......
您已经实现了在捕获信号时清除变量token
,因此您可以将父项更改为e。克。
close(pipe1[WRITE_END]);
while (read(pipe1[READ_END], &bufChild2, sizeof bufChild2) > 0)
if (token || bufChild2&1)
fprintf(stdout, "Received: %u\n", bufChild2);
......当收到的号码是11时,他会通过发送来杀死孩子 sigterm信号。
这永远不会发生,因为程序会生成“ 1到9之间的随机数”。