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