C与家长和孩子沟通,增加和打印计数器

C与家长和孩子沟通,增加和打印计数器,c,process,operating-system,pipe,C,Process,Operating System,Pipe,我正在尝试编写一个程序,以便父进程和子进程可以在彼此之间来回通信。父进程和子进程应该打印1-100之间的值,其中每个进程打印每次递增1的值。现在我面临的问题是,我对管道知之甚少。我从网上阅读材料中得到的信息是,我可以使用管道来读取和写入值。我利用它在子进程中打印一些内容,并将一些内容发送回父进程。现在,我不知道如何让家长在自己打印后返回给孩子?我知道我的代码可能全错了,但我真的不确定该怎么办 #include <sys/wait.h> #include <stdio.h>

我正在尝试编写一个程序,以便父进程和子进程可以在彼此之间来回通信。父进程和子进程应该打印1-100之间的值,其中每个进程打印每次递增1的值。现在我面临的问题是,我对管道知之甚少。我从网上阅读材料中得到的信息是,我可以使用管道来读取和写入值。我利用它在子进程中打印一些内容,并将一些内容发送回父进程。现在,我不知道如何让家长在自己打印后返回给孩子?我知道我的代码可能全错了,但我真的不确定该怎么办

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

int main(int argc, const char * argv[]) {
    int fd[2];
    if (pipe(fd)== -1){
        printf("An error occured while opening the pipe\n");
    }
    int id  = fork();
    int i = 0;
    if (id == 0){
        close(fd[0]);
        printf("In child: %d", i);
        i ++;
        write(fd[1], &i, sizeof(int));
        close(fd[1]);
    } else {
        wait(NULL);
        close(fd[1]);
        int y;
        read(fd[0],&y, sizeof(int));
        close(fd[0]);
       
    }
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]{
int-fd[2];
如果(管道(fd)=-1){
printf(“打开管道时出错\n”);
}
int id=fork();
int i=0;
如果(id==0){
关闭(fd[0]);
printf(“在子项中:%d”,i);
i++;
写入(fd[1],&i,sizeof(int));
关闭(fd[1]);
}否则{
等待(空);
关闭(fd[1]);
int-y;
读取(fd[0],&y,sizeof(int));
关闭(fd[0]);
}
}

为了保持简单,您可以检查返回值并处理错误。这将只在
0-9之间进行,您必须扩展数学

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

int main(int argc, char *argv[])
{
    int pipefd_1[2];
    int pipefd_2[2];   
    pid_t cpid;

    pipe(pipefd_1);
    pipe(pipefd_2);

    cpid = fork();

    if (cpid == 0) {    /* Child reads from pipe 1, writes to pipe 2*/
       char cval[] = {'0'};
       close(pipefd_1[1]);          /* Close unused write and read ends */
       close(pipefd_2[0]);
       
       while (atoi(cval) != 9) {
           read(pipefd_1[0], cval, 1);
         
           printf("Child print %d\n", atoi(cval));
           
           cval[0] += 1;
           write(pipefd_2[1], cval, 1);
       }


    } else {         
        char cval[] = {'0'};   /* Parent writes buf to pipe 1 */
        close(pipefd_1[0]);          /* Close unused read end */
        close(pipefd_2[1]);
        
        while (atoi(cval) != 9) {
             write(pipefd_1[1], cval, 1);
             read(pipefd_2[0], cval, 1);
             printf("Parent print %d\n", atoi(cval));
             cval[0] += 1;
        }
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int pipefd_1[2];
int pipefd_2[2];
pid_t cpid;
管道(管道1);
管道(管道FD_2);
cpid=fork();
如果(cpid==0){/*Child从管道1读取,则写入管道2*/
char cval[]={0'};
关闭(pipefd_1[1]);/*关闭未使用的写入和读取端*/
关闭(pipefd_2[0]);
while(atoi(cval)!=9){
读取(pipefd_1[0],cval,1);
printf(“子打印%d\n”,atoi(cval));
cval[0]+=1;
写入(pipefd_2[1],cval,1);
}
}否则{
char cval[]={0'};/*父级将buf写入管道1*/
关闭(pipefd_1[0]);/*关闭未使用的读取端*/
关闭(pipefd_2[1]);
while(atoi(cval)!=9){
写入(pipefd_1[1],cval,1);
读取(pipefd_2[0],cval,1);
printf(“父打印%d\n”,atoi(cval));
cval[0]+=1;
}
}
}
输出


管道是单向的。如果需要双向通信,则需要两个管道。一个用于parent->child,另一个用于child->parent.Right,但是如何从父级向子级发送消息呢?您需要两个管道,并且让父级在侦听另一个管道的响应之前写入管道。我将在5分钟内添加一个示例。@Tony非常感谢!不过这还需要几分钟:)理论上,您应该始终在循环中调用
read
,因为它可能返回的比请求的少。但在这种有限的情况下,它可能是好的。同样的
write
嘿,那么我应该先读,然后在父对象和子对象中写入吗?@user1234否。你应该在
child
中执行
read-write
,然后在
parent
中执行
write-read
,我想我对如何来回感到困惑。就像你的代码对我来说很有意义,但我不知道如何来回打印1-100之间的所有值。谢谢!我们使用char数组而不仅仅是读写int,这有什么原因吗?