![](/img/trans.png)
[英]Pipes and fork() - How to write an array of int throught a pipe in C?
[英]How to write to the pipe fork?
我有以下功能,通过fork和execvp执行命令。 我在fork中启动的脚本正在侦听输入数据。 如何将数据发送到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", (int) rxed, buffer);
if (t == -1) return -1;
free(*value);
*value = strdup(c);
free(c);
}
// how to write to the pipe fork?
}
管道是单向的。 调用两次pipe
,以获取一对文件描述符(用于从子级读取数据)(如您所拥有的),以及另一对文件描述符,以将数据发送至子级(这将是新的)。 您需要像已经做的一样执行相同的dup2
并close
魔术,以便将该新管道设置为孩子的stdin。
我猜你是说要从父进程写入子进程stdin
? 为此,您需要创建两个管道。 像您现在一样,其中一个用作孩子的stdout
,另一个必须用作stdin
,与您现在使用的方式大致相同(但索引当然会颠倒)。
当然,您不能wait
孩子之后再写它,因为如果孩子需要输入才能继续,则可能会陷入僵局。
管道基础
请研究这段代码,以便您了解自己在做什么
int fd[2]; /*write(fd[1],buffer,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("\n\tFORK ERROR\n");
exit(1);
}
if(cpid==0){ /*SON*/
close(fd[0]);
/********CODE******/
if((write(fd[1],final2,strlen(final2)))<0){
perror("\n\tWRITE ERROR");
}
close(fd[1]);
}else{ /*FATHER*/
close(fd[1]);
if((read(fd[0],aler,NN))<0){
perror("\n\tREAD ERROR");
}
wait(NULL);
/********CODE******/
close(fd[0]);
}
在这种情况下,父进程(父亲)从new(son)进程中读取()信息
如果您想进行BI方向的 read()write()创建2个管道(fd1 [2],fd2 [2])
使用与上述相同的逻辑,父亲读,关闭写端fd1 [1],儿子写,关闭读端fd1 [0]
反之亦然
父亲写,关闭读端fd2 [0],儿子读,关闭写端fd2 [1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.