微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何写入pipe叉?

我有以下通过fork和execvp执行命令的function。 我在fork中启动的脚本正在侦听input数据。 我如何发送数据到myscript?

int external_command() { int pfds[2]; if (pipe(pfds) < 0) return -1; if ((uproc.pid = fork()) == -1) return -1; if (uproc.pid == 0) { /* child */ const char *argv[4]; int i = 0; argv[i++] = "/bin/sh"; argv[i++] = "myscript.sh"; argv[i++] = NULL; close(pfds[0]); dup2(pfds[1],1); close(pfds[1]); execvp(argv[0],(char **) argv); exit(ESRCH); } else if (uproc.pid < 0) return -1; /* parent */ close(pfds[1]); int status; while (wait(&status) != uproc.pid) { DD("waiting for child to exit"); } char buffer[64]; ssize_t rxed; char *c; int t; //read from fork pipe *value = NULL; while ((rxed = read(pfds[0],buffer,sizeof(buffer))) > 0) { if (*value) t = asprintf(&c,"%s%.*s",*value,(int) rxed,buffer); else t = asprintf(&c,"%.*s",buffer); if (t == -1) return -1; free(*value); *value = strdup(c); free(c); } // how to write to the pipe fork? }

执行shell命令并在C程序中读取其输出

谁在fork()之后首先执行:parent还是child?

为什么我必须为subprocess“wait()”?

在Linux上的进程,叉值除以零

在C中实现一个shell

管道是单向的。 调用pipe两次,获取一对文件描述符来读取孩子的数据(如你已经有的),另一个发送数据给孩子(这将是新的)。 你需要做和你一样的dup2和close魔法,以便为孩子设置新的管道作为标准输入。

我想你的意思是你要写入从父进程的子进程stdin ? 为此,您需要创建两个管道。 一个用作stdout的孩子,就像现在一样,另一个用于stdin ,与现在的方式大致相同(但当然索引颠倒了)。

当然,在你写信给孩子之前,你不能wait孩子,因为如果孩子需要继续输入的话,你可能会陷入僵局。

管道的基本知识

请学习这一点的代码,所以你知道你在做什么

int fd[2]; /*write(fd[1],strlen) / read(fd[0],buffer2,SIZE)*/ pid_t cpid; if(pipe(fd)==-1){ perror("pipe"); exit(EXIT_FAILURE); } if((cpid=fork())<0){/* FORK INIT */ printf("ntFORK ERRORn"); exit(1); } if(cpid==0){ /*SON*/ close(fd[0]); /********CODE******/ if((write(fd[1],final2,strlen(final2)))<0){ perror("ntWRITE ERROR"); } close(fd[1]); }else{ /*FATHER*/ close(fd[1]); if((read(fd[0],aler,NN))<0){ perror("ntREAD ERROR"); } wait(NULL); /********CODE******/ close(fd[0]); }

在这种情况下父进程(父)从新(子)进程读取()信息

如果你想双向读取()write()创建2个管道(fd1 [2],fd2 [2])

使用与上面相同的逻辑,父亲读取,关闭写入结束fd1 [1],子写入,关闭读取结束fd1 [0]

反之亦然

父亲写入,关闭读取结束fd2 [0],子读取,关闭写入结束fd2 [1]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐