パイプ上のノンブロッキングI/Oを行うことはできますか? fcntlはO_NONBLOCKの設定に失敗します。 Linuxプログラミングインタフェースの918ページには、 'パイプまたはFIFOからnバイトを読み込むセマンティクス(p)'という表が含まれています。この表は、O_NONBLOCKが有効になっている1つの列を持つパイプとFIFOの動作をリストしていますか?これは、パイプにO_NONBLOCKフラグを設定できることを意味します。これは正しいです?次のコードはフラグを設定できませんが、fcntl(2)はエラーを報告しません。パイプ上のノンブロッキング読み取り
#include <fcntl.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define SLEEP 1
int
main(int argc, char *argv[]) {
pid_t childPid;
int pfd[2];
int nread, flags;
int c = 'a';
setbuf(stdout, NULL);
if (pipe(pfd) == -1) {
printf("error: pipe");
exit(EXIT_FAILURE);
}
switch (childPid = fork()) {
case -1:
printf("error: fork");
exit(EXIT_FAILURE);
case 0: /* child */
if (close(pfd[0]) == -1) {
printf("child: close pfd read");
exit(EXIT_FAILURE);
}
sleep(SLEEP);
_exit(EXIT_SUCCESS);
default:
break;
/* parent falls through */
}
if (close(pfd[1]) == -1) {
printf("parent: close pipe write");
exit(EXIT_FAILURE);
}
flags = fcntl(pfd[0], F_GETFD);
flags |= O_NONBLOCK;
if (fcntl(pfd[0], F_SETFD, flags))
perror("fcntl");
/* verify flags set correctly */
flags = fcntl(pfd[0], F_GETFD);
if (!(flags & O_NONBLOCK)) {
printf("failed to set O_NONBLOCK\n");
exit(EXIT_FAILURE);
}
wait(NULL);
exit(EXIT_SUCCESS);
}
これは 'F_GETFD'操作のバグのようです。私はこれが実際に記述子を非ブロックに設定し、操作がブロックしないことを確認しましたが、 'F_GETFD'はまだゼロを返します。 –