0
我一直在處理這段代碼一段時間,由於某種原因民意調查返回零,即使有數據要從outFds管道讀入。由於某些原因,如果我讀入一些數據,然後運行poll,它會返回適當的值,但這不是解決方案。有沒有人看過這個,知道我該怎麼做?民意調查返回0但讀不阻止
#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>
int main(void)
{
int outFds[2];
pipe(outFds);
if(!fork()) {
dup2(outFds[1], 1);
close(outFds[0]);
close(outFds[1]);
// disable printf buffering
setvbuf(stdout, NULL, _IONBF, 0);
sleep(1);
char buf[32];
printf("blah");
exit(0);
}
close(outFds[1]);
char c;
// Read 'b' into c. If this next line is not commented poll returns 1
//read(outFds[0], &c, 1);
struct pollfd outFd;
outFd.fd = outFds[0];
outFd.events = POLLIN;
printf("%d\n", poll(&outFd, 1, 0)); // poll returns 0 for some reason
}
似乎就像你在孩子寫入管道之前進行「輪詢」。在「民意調查」之前,您是否嘗試過再次安排「睡眠」? – 5gon12eder
「即使有數據要從outFds管道讀入,輪詢返回零」。你怎麼知道有數據要被讀取?你的代碼中沒有任何東西可以保證子'printf'在父'poll'之前執行。特別是因爲你在調用'printf'之前在孩子中有一個'睡眠'。所以我的錢是在「投票」行爲正確,你的假設不正確。 – kaylum
謝謝艾倫!我現在看到我在錯誤的地方睡了一覺,這就解釋了爲什麼閱讀一個字節解決了問題。我不知何故忘了閱讀塊哈哈。 – Daniel