【问题标题】:Interprocess Communication Between Child And Parent C子与父C之间的进程间通信
【发布时间】:2015-09-04 00:26:23
【问题描述】:

我正在编写一个 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;
}

我想知道如何实现这个条件,当父进程捕获 SIGUSR1 信号时,他开始只打印奇数,当收到的数字是 11 时,他通过发送 sigterm 信号杀死孩子。

我使用了一个全局变量,如果 SIGUSR1 被父亲捕获,则可以设置该变量。
如果有人可以帮助我,我将非常感激。

【问题讨论】:

    标签: unix process signals pid


    【解决方案1】:

    程序包含一些错误。

    • 你忘了#include &lt;signal.h&gt;
    • 要让子进程每 1 秒完成一次工作,您必须将 sleep(1) 放入子进程的 while 循环中。
    • 孩子不能close(pipe1[WRITE_END]);,否则它不能再写信给父母。
    • 父级不能close(pipe1[READ_END]);,否则它不能再从子级读取。

    我想知道当父进程catch时如何实现这个条件 SIGUSR1 信号他开始只打印奇数...

    您已经实现了在捕获信号时清除变量token,因此您可以将父部分更改为 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 之间的随机数”。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多