我有一個程序,我正在處理,我使用select從管道中選擇要讀取。C使用選擇和從管道讀取
的問題是,我使用if(FD_ISSET(pfd[i][0], &read_set))
因爲FD_ISSET是返回0,它沒有通過檢驗,但如果我嘗試使用read(pfd[i][0],&c,sizeof(c))
讀它會正常工作,並從管PFD內容[0]從PFD [不同1]就像我想要的。
我想知道這到底是怎麼回事,因爲FD_ISSET返回0,但實際上,我可以讀的內容從它
編輯
全局變量內核將控制我是多麼的進程創建 的下一個代碼將創建管道並使用FD_SET設置位
for(i=0; i<CORES; i++)
{
if(pipe(pfd[i])==-1)
perror("Ocorreu um erro a criar um pipe");
FD_SET(pfd[i][0], &read_set);
}
read_set在main()啓動後立即定義。我用()上面的代碼之後,立刻使用fork創建X進程()(X = CORES)
然後這部分在父進程中運行:
while (x<CORES){
int selec = select(pfd[CORES-1][0]+1, &read_set, NULL, NULL, NULL);
if(selec>0)
{
if(FD_ISSET(pfd[x][0], &read_set))
{
close(pfd[x][1]);
if(read(pfd[x][0],&c,sizeof(c))==-1)
perror("Ocorreu um erro a ler do pipe");
printf("c= %f \n",c);
c_final+=c;
x++;
}
else
printf("\nFile descriptor pfd[%d][0] is not set\n",x);
}
else if(selec == -1)
perror("Ocorreu um erro no select");
}
與此問題是FD_ISSET(pfd[x][0], &read_set)
將沒有通過,因爲它不用於PFD [0]設置,但它可以是PFD [1]或反之亦然(因爲我不知道它是否將失敗0或1)
EDIT2:
select()返回一個int read_set中的文件描述符數量。我將CORES設置爲2,因此它創建2個進程和2個管道,並在read_set中設置2個位。我的select()返回int 1.它是否應該返回int 2或0計數(所以它會是0和1 = 2)?
你做錯了什麼事,顯示代碼。 – nos
在調用'select'之前,'fd_set'必須包含所有需要等待的文件描述符,然後在'select'返回後,只有那些準備好的文件將被設置。我猜你以某種方式搞砸了。 –
你是否在使用非阻塞式讀取來做這件事?如果沒有,那麼閱讀將等待輸入,這將使它看起來像你在選擇時有輸入,即使你沒有輸入。 –