Unix 子进程与父进程之间的进程间通信

Unix 子进程与父进程之间的进程间通信,unix,process,signals,pid,Unix,Process,Signals,Pid,我正在编写一个Unix程序,其中父进程分叉子进程p1。父进程处理SIGUSR1。 子进程每隔1秒生成一个介于1到9之间的随机数,并使用管道发送给父进程。父进程接收该数字并将其打印到控制台。当父进程捕获到SIGUSR1信号时,他开始只打印奇数,当接收到的数字为11时,他通过发送SIGTERM信号杀死子进程。父亲等待状态,然后终止孩子 #include<stdio.h> #include<unistd.h> #include<stdlib.h> #define R

我正在编写一个Unix程序,其中父进程分叉子进程p1。父进程处理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;
}
#包括
#包括
#包括
#定义读取结束0
#定义WRITE_END 1
易失性sig_原子令牌;
无效句柄(内部符号)
{
令牌=0;
}
int main(int argc,char*argv[]){
pid_t child1;
令牌=1;
int pipe1[2],状态;
无符号整数bufChild1,bufChild2;
如果(管道(管道1)=-1)
{
fprintf(标准“管道故障”);
}
child1=fork();
if(child1<0)
{
fprintf(标准“Fork Failed”);
返回0;
}
else if(child1==0)
{
printf(“pid为%d的子项\n”,getpid());
printf(“父pid为%d\n”,getppid());
而(1)
{
bufChild1=(无符号整数)rand()%9+1;
fprintf(标准输出,“生成:%u\n”,bufChild1);
关闭(管道1[读取结束]);
写入(pipe1[write_END],&bufChild1,sizeof(bufChild1));//写入父级
关闭(管道1[写入结束]);
} 
}
其他的
{
信号(SIGUSR1,手柄);
printf(“父进程”);
而(!令牌)
{
关闭(管道1[读取结束]);
读取(pipe1[read_END],&bufChild2,sizeof(bufChild2));//写入父级
fprintf(标准输出,“接收:%u\n”,bufChild2);
关闭(管道1[写入结束]);
}
}
等待(&状态);
返回1;
}
我想知道当父亲进程捕捉到SIGUSR1信号时,他开始只打印奇数,当接收到的数字为11时,他通过发送sigterm信号杀死孩子时,如何实现这个条件

我使用了一个全局变量,如果SIGUSR1被其父捕获,则可以设置该变量。

如果有人能帮助我,我将非常感激。

该程序包含一些错误

  • 您忘记了包含
  • 要让子进程每1秒执行一次工作,必须在子进程的
    while
    循环中放入
    睡眠(1)
  • 子级不能
    关闭(管道1[WRITE_END])否则它将无法再写入父级
  • 父级不能
    关闭(管道1[READ_END])否则它将无法再从子级读取
我想知道当父进程捕获时如何实现此条件 SIGUSR1信号他开始只打印奇数

您已经实现了在捕获信号时清除变量
标记
,因此可以将父部件更改为e。g

            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之间的随机数”。

程序包含一些错误

  • 您忘记了包含
  • 要让子进程每1秒执行一次工作,必须在子进程的
    while
    循环中放入
    睡眠(1)
  • 子级不能
    关闭(管道1[WRITE_END])否则它将无法再写入父级
  • 父级不能
    关闭(管道1[READ_END])否则它将无法再从子级读取
我想知道当父进程捕获时如何实现此条件 SIGUSR1信号他开始只打印奇数

您已经实现了在捕获信号时清除变量
标记
,因此可以将父部件更改为e。g

            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之间的随机数”