将管道作为参数传递给exec
我正在尝试将管道传递给另一个使用execv创建的进程。到目前为止,这是我的代码,但它不起作用。我到处寻找信息,但我找不到任何具体的关于通过管道vie exec。任何帮助表示赞赏。谢谢
int fd[2];
pipe(fd);
char passwrite[1];
sprintf(passwrite, "%d", fd[0]);
char arg[1];
arg[1]=passwrite;
int x;
x=fork();
if (x==0) {
execv("NewProg",arg);
}
没有找到相关结果
已邀请:
4 个回复
镀建啼
然后,
需要是一个指针数组,而不是一个字符数组,它还需要更大:
你需要在args中放入特定的东西:
我系统上
的手册页更详细地解释了这一点: execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,...,argn。它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。按照惯例,第一个参数应指向与正在执行的文件关联的文件名。参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针(char *)NULL。
届甸衬丝蚕
来创建管道。 拨打
创建一个孩子。 子进程(从
返回值0):
管道的写入端
管道的读取端到标准输入
管道的读取端
将从管道读取的子进程(其标准输入) 父进程(从
返回值> 0)执行:
管道的读取端
管道的写入端到标准输出。
管道的写入端
将写入管道的过程(其标准输出) 请注意,在这种情况下,您最终会关闭
调用返回的文件描述符,并关闭它们两次(一次在父级中,一次在子级中)。 如果父进程应该通过文件流写入子进程,请在写文件描述符上使用
调用(并且不要在其上使用
,或者
它 - 在
返回的文件流上用
关闭它,或退出)。 如果你想告诉子进程它可以读取哪个文件描述符号来从管道获取输入,那么你不需要在子进程中执行
;你可以简单地格式化一个字符数组中的字符串(复数 - 你至少需要字符,并且应该允许十几个,因为它非常便宜),然后你可以安排将参数传递给
函数。请记住,孩子至少需要三个指针:一个用于argv [0],程序名称;一个用于文件描述符号;和一个用于终止空指针。这就是
何时知道它何时到达参数列表的末尾。如果您仅使用
,则同样的评论适用;你只是无法确定孩子的环境(例如,它收到的环境变量列表);它将获得与父流程在
时相同的环境。 ¶3和¶4各自的第一步是关键步骤。如果省略它们,管道将无法正常工作。
蹄寄噬非芹
咳累录酬
} 在上面的代码中,你需要替换token [0],token [2]和token [1],它们是你想要运行的命令的字符串指针(在我的shell中)的元素。我已经完成了对cumand的解析因此我的shell中的行必须使用Token [0/1/2]来获取各种命令行参数。但是你可以用它们代替它们来完成这项工作