1

昨日select、非常に便利なツールである を発見しましたが、機能させることができません。これは私の全コードの一部です:

/* Code here */
FD_ZERO(&fifo_set);
printf("%d\n", num_proc);
for(i = 0; i < num_proc; ++i)
    FD_SET(proc[i].fifowfd, &fifo_set);

/* More code here */
while(1)
{
    if(select(FD_SETSIZE, &fifo_set, NULL, NULL, NULL) < 0)
    {
        log_event(5, "Could not block.");
        exit(1);
    }
    printf("FD_SETSIZE: %d\n", FD_SETSIZE);
    for(i = 0; i < FD_SETSIZE; ++i)
        printf("ISSET %d: %d\n", i, FD_ISSET(i,&fifo_set));

    log_event(1, "Actions to be done.");
/* More code */

配列 proc は、その PID と読み取りおよび書き込み FIFO が指定されたプロセスの配列です。FIFO へのファイル記述子がチェックされ、有効です。問題は、fifowfd の値が 5、7、9 の 3 つのプロセス (num_proc) があることです。FD_SETSIZE の値は 1024 です。

@muxが指摘したように、このFIFOは「書き込み用FIFO」のような名前が付けられています。問題は、プロセス側から見た「読み取り/書き込み用の FIFO」を表す「name.r.fifo」と「name.w.fifo」がたくさんあることです。私が示しているコードは、「.w.fifo」を読み取り、「.r.fifo」に書き込むコントローラーからのコードです。

何か不足していますか?

4

2 に答える 2

2

select が呼び出されたときにすべての記述子にデータがない場合、少なくとも 1 つの記述子が読み取り可能になるまでブロックされます。おそらく、記述子 5 が最初にチェックされ、他のパイプが読み取るデータを持つ前に出口を選択します。

選択したビット数が含まれているため、選択の実際の結果も確認する必要があります。

于 2013-08-11T10:40:00.677 に答える