基本上我想在C(和無緩衝)與此相同的bash腳本做:C:如何重定向命名管道標準輸入/輸出子進程的
#!/bin/sh
cat ./fifo_in | myprogram > ./fifo_out
換句話說,我想exec「myprogram」並將其stdin和stdout重定向到之前創建的兩個管道。
另一個程序是將數據送入fifo_in並讀出fifo_out。
當然,它會很容易從./fifo_in
剛讀,緩衝它在父和寫入myprogram的標準輸入(和反向stdout和./fifo_out
),但我認爲有可能是一個辦法,讓「myprogram」讀/寫直接從/到fifos而不在父進程中緩衝。
編輯:
尤金的答案似乎是正確的,但我不能得到它的工作。
我用在C端這個功能,這似乎是正確的對我說:
pid_t execpipes(const char *wd, const char *command, const char *pipename)
{
char pipename_in[FALK_NAMESIZE];
char pipename_out[FALK_NAMESIZE];
strcpy(pipename_in, FALKPATH);
strcat(pipename_in, "/");
strcat(pipename_in, FALK_FIFO_PATH);
strcat(pipename_in, "/");
strncat(pipename_in, pipename, FALK_NAMESIZE-2);
strcpy(pipename_out, pipename_in);
strcat(pipename_out, "R");
pid_t pid;
pid = fork();
if (pid < 0)
{ //Error occured
perror("fork");
exit(1);
}
if (pid == 0)
{
chdir(wd);
d("execpipes: pipename_in=\"%s\"\n", pipename_in);
d(" pipename_out=\"%s\"\n", pipename_out);
freopen(pipename_in,"r",stdin);
freopen(pipename_out,"w",stdout);
d("execpipes: command=\"%s\"\n", command);
execl("/bin/sh", "sh", "-c", command, (char *)NULL); // using execv is probably faster
// Should never get here
perror("execl");
exit(1);
}
return pid;
}
我讀寫從PHP腳本管道(僅相關部分發布):
$pipe_in = fopen($fp.$pipename, "w");
$DEBUG .= "Write to pipe_in\n";
$ret = fwrite($pipe_in, $in);
$pipe_out = fopen($fp.$pipename.'R', "r");
$DEBUG .= "Read from pipe_out\n";
$atext = fread($pipe_out, 200000); // Program hangs here
程序啓動正確,通過$pipe_in
正確接收輸入,正確處理數據並且(因爲它運行良好很多個月)我假設它將數據正確地輸出到標準輸出,但是當我嘗試從$pipe_out
讀取數據時,它掛起。我知道管道本身設置正確,因爲如果我不打開$pipe_out
,程序沒有得到任何輸入 - 這是有道理的,因爲沒有$pipe_out
的閱讀器,因此管道不完整。所以我可以打開$pipe_out
,但我無法從中讀取任何內容,這很奇怪。
EDIT2:
計劃現在工作,感謝你們 - 出於某種原因,第一管有,然後才能從第二管道讀取被關閉:
$pipe_in = fopen($fp.$pipename, "w");
$pipe_out = fopen($fp.$pipename.'R', "r");
$DEBUG .= "Write to pipe_in\n";
$ret = fwrite($pipe_in, $in);
fclose($pipe_in);
$DEBUG .= "Read from pipe_out\n";
$atext = fread($pipe_out, 200000);
fclose($pipe_out);
unlink($fp.$pipename);
unlink($fp.$pipename.'R');
你是在寫'myprogram'或者其他一些「調用」'myprogram'的程序嗎? – pmg 2011-12-27 16:04:28
任何濫用「貓」的理由?爲什麼不使用:'myprogram < ./fifo_in >。/ fifo_out'? – 2011-12-27 16:22:12
沒有理由使用貓,bash腳本只是爲了澄清C程序應該做什麼。 – Robby75 2011-12-28 07:20:52