执行后关闭(管道[1])

时间:2015-04-23 22:37:49

标签: c pipe exec

我有一根烟斗。

int anotherPipe[2];
make(anotherPipe);

以下两个进程都可以访问此管道。

流程A:

close(anotherPipe[0]);
dup2(anotherPipe[1], 1); //redirect stdout to pipe
execl("/usr/bin/who", "usr/bin/who", NULL);
close(anotherPipe[1]); //this is never executed

流程B:

close(anotherPipe[1]);
read(anotherPipe[0], stringbuffer, bytestoread);
printf("%s\n", buffer);
printf("checkpoint\n");
close(anotherPipe[0]);

"谁" execl的命令输出通过管道重定向到进程B,在那里打印它。但是现在我的进程B没有终止,尽管打印了检查点。

不要终止'我的意思是终端中没有显示以下内容:

myusername@ubuntucomputer:~$

这里发生了什么以及如何解决?

编辑:解决了非终止进程B的问题。它终止了,但我的顶级进程在A和B之前完成,所以

myusername@ubuntucomputer:~$

早就打印了很多。我使用waitpid(),现在一切都很好。

1 个答案:

答案 0 :(得分:3)

如果function checkCookie() { var src=getCookie("src"); if (src!="") { FIREuni:'TRUE' var TrackObject = { 'CJ' : { 'CID': '12346', 'TYPE': '7865', 'OID': 'ORDERNUMBER', 'CURRENCY':'USD', 'DISCOUNT': '', 'COUPON': '', PRODUCTLIST : [ { 'ITEM': 'item.variant.sku', 'AMT': 'OTOTAL', 'QTY': 'OTY' }, { 'ITEM': 'item.variant.sku', 'AMT': 'OTOTAL', 'QTY': 'OTY' } ] }}; } else { FIREuni:'FALSE' var TrackObject ={ 'UNI' : { 'CID': '', 'TYPE': '', 'OID': '', 'CURRENCY': '', 'DISCOUNT': '', 'COUPON': '', PRODUCTLIST : [ { 'ITEM': '', 'AMT': '', 'QTY': '' } ] } }; } } 成功,则原始程序中的任何内容都不会运行,因为它会将您要求运行的程序替换为该过程的内容。您需要在 execl()之前关闭管道

execl

另外,在致电close(anotherPipe[0]); dup2(anotherPipe[1], 1); //redirect stdout to pipe close(anotherPipe[1]); execl("/usr/bin/who", "usr/bin/who", (char*)NULL); 时,请不要忘记NULL(char*)。由于它是一个变量参数函数,它不会自动转换类型。