C linux中子进程与父进程之间的通信:父进程不阻塞

Posted

技术标签:

【中文标题】C linux中子进程与父进程之间的通信:父进程不阻塞【英文标题】:communication between child and parent processes in C linux: parent process not blocking 【发布时间】:2014-03-19 09:58:52 【问题描述】:

我希望父进程和子进程在 C linux 中使用管道进行通信。首先,我希望父母传递一个字符串,然后让孩子承认它。我创建了两个文件描述符。一个用于父到子,即读管道和其他写管道,反之亦然。 问题是它没有将我的数据作为输入。此外,我希望打印一次诸如“输入您的数据”之类的 printf 语句,但由于在 fork 之后,有两个进程,因此它们被显示两次。有什么替代方案吗??

 //readpipe[0] = child read
 //readpipe[1]= parent write

 //writepipe[0]=parent read
 //writepipe[1]=child write

 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <string.h>

 int main(void)
 
     pid_t pid;
     int r;
    /* Hope this is big enough. */
     char buf[1024];
     char cp[50];
     char ans;
     int readpipe[2];
     int writepipe[2];
     int a;
     int b;
     a=pipe(readpipe);
     b=pipe(writepipe);
     if (a == -1)  perror("pipe"); exit(EXIT_FAILURE); 
     if (b == -1)  perror("pipe"); exit(EXIT_FAILURE); 

     printf("\nSEND SOMETHING TO CHILD PROCESS\t");
     scanf(" %c",&ans);
     pid=fork();
     if(pid==-1)
     
         printf("pid:main");
         exit(1);
     

     while(ans=='y' || ans=='Y')
     
        printf("\nEnter data\t"); //printed twice
        fgets(cp, 50, stdin);     //not taking data
        printf("\n%s",cp);        
        if(pid==0)
         //CHILD PROCESS
            close(readpipe[1]);
            close(writepipe[0]);
            read(readpipe[0],buf,sizeof(buf));
            printf("\nSENT\n %s",buf);
            write(writepipe[1],cp,strlen(cp)+1);
        
        else
         //PARENT PROCESS
            close(readpipe[0]);
            close(writepipe[1]);
            write(readpipe[1],cp,strlen(cp)+1);
            read(writepipe[0],buf,sizeof(buf));
            printf("\nRECEIVED\n %s",buf);
        
        printf("\nSEND SOMETHING TO CHILD PROCESS\t");
        scanf(" %c",&ans);
   
  close(readpipe[1]);
  close(writepipe[0]);
  close(readpipe[0]);
  close(writepipe[1]);

 return 0;

谢谢:)

【问题讨论】:

只是一个建议。不要尝试从刚刚关闭的管道中读取。 close(writepipe[0]) 后跟 read(writepipe[0],ch1,sizeof(ch1));... 不会这么热。 您可能会发现something like this 更容易理解,尤其是在与readpipewritepipe 等助记符打架时。 谢谢@WhozCraig。我对我的代码做了一些更改。仍然有2个问题。你能帮帮我吗?非常感谢:) 【参考方案1】:

你的代码有几个问题:

1.

close(writepipe[1]);

你不应该关闭你以后需要的文件描述符。

2.

read(readpipe[0],ch,sizeof(ch));

chNULL,这意味着你没有分配任何空间让它指向。

3.

ch1="YES";
write(writepipe[1],ch1,sizeof(ch1));

您应该使用strlen(ch)+1 而不是sizeof(ch) 来确定需要写入多少字节。

4.

您的父进程代码中存在类似问题。


这里是基于这个问题中的代码的固定版本:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(void)

    pid_t pid;
    int r;
    /* Hope this is big enough. */
    char buf[1024];
    char *cp;

    int readpipe[2];
    int writepipe[2];
    int a;
    int b;
    a=pipe(readpipe);
    b=pipe(writepipe);
    // check a and b

    pid=fork();
    // check pid

    if(pid==0)
     //CHILD PROCESS
        close(readpipe[1]);
        close(writepipe[0]);
        read(readpipe[0],buf,sizeof(buf));
        printf("\nREAD = %s",buf);
        close(readpipe[0]);
        cp="YES\n";
        write(writepipe[1],cp,strlen(cp)+1);
        close(writepipe[1]);
    
    else
     //PARENT PROCESS
        close(readpipe[0]);
        close(writepipe[1]);
        cp="HI!! YOU THERE";
        write(readpipe[1],cp,strlen(cp)+1);
        close(readpipe[1]);
        read(writepipe[0],buf,sizeof(buf));
        printf("\nACK RECEIVED %s",buf);
        close(writepipe[0]);
    
    return 0;

【讨论】:

非常感谢。这真的很有帮助..:) 我做了一些改动。又是一个问题。你能检查一下吗 @user3436838 这个printf("Enter data\n"); fgets(cp, 50, stdin); 将由父进程和子进程执行。这是新代码的主要问题。

以上是关于C linux中子进程与父进程之间的通信:父进程不阻塞的主要内容,如果未能解决你的问题,请参考以下文章

Linux 面试

linux vfork的子程序与父进程共享内存,那为啥子进程执行exec就不会覆盖父进程呢?

linux vfork的子程序与父进程共享内存,那为啥子进程执行exec就不会覆盖父进程呢?

Linux 中 Python 父进程和 C 子进程之间的通信

通过 c 中的半双工管道在父进程和 2 个子进程之间进行通信的问题

为啥 $$ 返回与父进程相同的 id?