gpt4 book ai didi

c - 使用 Unix C 将数据从父级传递给子级并返回

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:53 25 4
gpt4 key购买 nike

我是 C 的新手,正在尝试学习如何在 Unix 环境中使用管道将数据从父进程传输到子进程,反之亦然。在下面的代码中,我收到一个命令行参数并根据参数值构建一个字符数组。然后我使用管道将 char 数组传递给将执行名为 vc 的程序的 child 。该程序返回基于 char 数组的数字结果。我的问题是如何使用第二个管道将结果返回给父级?另外,一旦 parent 拥有它,由于 parent 设置为将输出发送给 child ,我如何将其打印到屏幕上?谢谢。

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

int main(int argc,char *argv[])
{
int
pfildes[2],
pid,
argNumber;
char
buffer[256],
charString[1024];
//Check for arguments
if(argc != 2) {
printf("No command line arguements given.\n");
argNumber=10; //default
}
else
argNumber=atoi(argv[1]);

//***********************************
//Build charString based on argNumber
//***********************************

//create pipes
if(pipe(pfildes) == -1) {
//error occured when creating pipe
perror("demo");
exit(1);
}
//create child process
if((pid=fork()) < 0) {
//error occured when forking child
perror("demo");
exit(1);
}
else if(pid > 0) {
//parent process
close(pfildes[0]);
dup2(pfildes[1],1);
printf("%s", charString);

close(pfildes[1]);

perror("demo");
_exit(1);
}
else {
//child process
close(pfildes[1]);
dup2(pfildes[0],0);
execlp("/usr/bin/vc","vc", NULL);
close(pfildes[0]);

perror("demo");
exit(1);
}

while(wait(NULL) >0);
return 0;
}

最佳答案

您可以使用 socketpair()代替 pipe() 在父进程和子进程之间生成双向通信 channel :

//...
if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfildes) == -1) {
//error occured when socket pair
perror("demo: socketpair");
exit(1);
}
//..

在子进程中,您可以在调用exec() 之前dup() 一对输入和输出:

//...
else {
//child process
close(pfildes[1]);
dup2(pfildes[0],0);
dup2(pfildes[0],1);
dup2(pfildes[0],2);
close(pfildes[0]);
execlp("/usr/bin/vc","vc", NULL);
perror("demo: child exec");
exit(1);
}
//...

在父进程中,您可以使用 fdopen() 从文件描述符创建 FILE * ,因此您无需对现有的 stdout 文件描述符进行 dup():

//...
else if(pid > 0) {
//parent process
close(pfildes[0]);
FILE *to_child = fdopen(dup(pfildes[1]), "w");
FILE *from_child = fdopen(dup(pfildes[1]), "r");
close(pfildes[1]);
fprintf(to_child, "%s", charString);
while (fgets(buf, sizeof(buf), from_child) != NULL) {
//...do something with output
}
//...
} else { //...

关于c - 使用 Unix C 将数据从父级传递给子级并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18728956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com