我想寫一個測試程序,它使用管道在3個linux命令之間傳遞信息。相當於「ls | wc | wc」的bash。以下是我的代碼 我得到的唯一輸出是。該程序停留在那裏而不退出。管道沒有得到EOF
./a.out starting main creating pipe first
在bash的預期結果是一樣的東西
ls | wc | wc 1 3 24
編輯:在運行strace的我看得出來,主要工藝是wait4,兩個衛生間進程停留在讀(0)。正如我猜測的那樣,因爲wc沒有獲得EOF。爲什麼這樣?能有人幫我找出問題嗎?
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int p[2];
int p1[2];
int r=0;
int fork1(void)
{
int pid;
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
return pid;
}
int main (int argc, char const* argv[])
{
printf("starting main\n");
printf("creating pipe first\n");
if(pipe(p)<0) {
perror("pipe");
exit(1);
}
if(pipe(p1)<0) {
perror("pipe");
exit(1);
}
if(fork1()==0) {
//send output to p
close(1);
dup(p[1]);
close(p[0]); close(p[1]);
execlp("ls","ls",NULL);
exit(0);
}
if(fork1() == 0) {
close(1);//write to p1
dup(p1[1]);
close(p1[1]); close(p1[0]);
close(0);//read from p
dup(p[0]);
close(p[0]); close(p[1]);
execlp("wc","wc",NULL);
exit(0);
}
if(fork1() == 0)
{
close(0);//read from p1
dup(p1[0]);
close(p1[0]); close(p1[1]);
execlp("wc","wc",NULL);
exit(0);
}
close(p[0]); close(p[1]); close(p1[0]); close(p1[1]);
wait(&r);wait(&r);wait(&r);
printf("parent done\n");
return 0;
}
如何在系統上聲明'wait()'?在我的,我必須'#include',然後它不會編譯,因爲wait()接受一個參數,你沒有提供。這是未定義的行爲。用-Wall或編譯器的等價物編譯以啓用警告。 –
2014-10-09 08:08:20
我包括#include #include 文件,它給了我一個錯誤。我用等待的參數修改了代碼。 –
woodstok
2014-10-09 08:12:31
只需在strace -f下運行它,看看哪個進程正在做什麼。 – Useless 2014-10-09 08:21:19