[英]Implementing pipe in my own shell with two child process
我正在編寫自己的shell。 下面是它的一部分。 我想用兩個子進程來實現管道。 但是,當我執行以下代碼時,某些命令有效,而有些則無效。 誰 排序”,“ ls | 排序”工作,但“會” 排序”,“貓文件| 排序”使我的外殼停止運行。 我必須'cntrl + c'逃脫我的外殼。 我不明白為什么有些命令可以工作而有些卻不能。 請有人指出我所缺少的是什么?
int pipefd[2];
int pipePos = checkPipePos(argc, argv); //find '|' command position in argv
if (pipe(pipefd) == -1) {
printf("Creating pipe failed\n");
return;
}
if (fork() == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
execlp(argv[0], argv[0], NULL);
}
if (fork() == 0) {
close(pipefd[1]);
dup2(pipefd[0], 0);
execlp(argv[pipePos + 1], argv[pipePos + 1], NULL);
}
close(pipefd[0]);
close(pipefd[1]);
while (wait(NULL) >= 0);
我在這里看到一個可能的問題,它可能會也可能不會解釋不確定的結果。
在子進程中,復制管道的文件描述符之一后,您不會關閉原始文件描述符。
dup2(oldfd, newfd)
將oldfd
復制到newfd
,但oldfd
仍處於打開狀態。 現在, oldfd
和newfd
文件描述符都指向同一文件。 請參見dup2手冊頁。
通常,在dup2()-文件描述符之后,您需要關閉() oldfd
。
因此,這里要發生的是,一個子進程在stdout
上將具有相同的文件描述符,而在其他隨機文件描述符上將具有相同的文件描述符,而另一個子進程在stdin
上將具有相同的情況。
這可能會或可能不會導致問題,具體取決於子進程的作用。 不能肯定地說,但是您一定要解決此問題,看看是否有幫助。
您的管道邏輯是正確的。
ll | sort
ll | sort
不起作用,因為ll
不是可執行文件。
cat file | sort
cat file | sort
不起作用,因為您沒有傳遞file
參數。
Sam Varshavchik的改進是有效的。 這是一個很好的解決方法,但不會造成任何嚴重的問題。 造成的全部浪費是浪費了一個文件描述符插槽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.