读取FIFO,资源暂时不可用

时间:2015-01-22 18:41:11

标签: c multithreading fifo

我遇到了多线程程序的问题。 基本上我使用fifos在线程之间传递消息

这是从管道中读取的线程:

thread_args args = (thread_args) *arguments;
char* fifo_buffer = calloc (FIFO_SIZE, sizeof(char));
int flag;
int fifo_win_to_send = open(args.fifo_names[FIFO_WTS], O_RDONLY);
if (fifo_win_to_send < 0) {
    perror("fifo: error opening fifo");
    exit(1);
}

flag = fcntl(fifo_win_to_send, F_GETFL);
fcntl(fifo_win_to_send, F_SETFL, flag | O_NONBLOCK | O_NDELAY);

if (read( fifo_win_to_send, fifo_buffer, FIFO_SIZE) <= 0) {
            perror("fifo: error reading window to sender fifo");
            exit(1);
}
if (VERBOSE_SENDER) {
            printf("Read %s from fifo window_to_sender", fifo_buffer);
            fflush(stdout);
}

和#34;写作帖子&#34;:

char * fifo_buffer = calloc(FIFO_SIZE, sizeof(char));
thread_args args = (thread_args) *arguments;
int fifo_win_to_send = open(args.fifo_names[FIFO_WTS], O_WRONLY);
    if (fifo_win_to_send < 0) {
        perror("fifo: error opening fifo");
        exit(1);
    }

*fifo_buffer = 'A';
memcpy(fifo_buffer+1, &sequence_number, sizeof(int));
write( fifo_win_to_send, fifo_buffer, FIFO_SIZE);
if (VERBOSE_FIFO) {
    printf("From window to send:%s\n", fifo_buffer);
    fflush(stdout);
}

在生成线程之前,在main()中创建了fifo文件:

mkdir("temp",0777);
char * fifo_id[6];
for(i=0;i<6;i++)  {
    fifo_id[i]=calloc(100,sizeof(char));
}
fifo_id[FIFO_WTS] = strcpy(fifo_id[FIFO_WTS], "temp/window_to_sender");
if(mkfifo(fifo_id[FIFO_WTS], 0777)) {
    if(errno!=EEXIST) {
        perror("fifo: Cannot create named pipe");
        exit(1);
    }
}

尝试从fifo读取时,错误运行程序。控制台读取&#34; fifo:错误读取窗口到发送者fifo:资源暂时不可用&#34;读取应该是&#34;非阻塞&#34;但我不知道它是否正确或似乎是什么问题。 (第一次尝试使用线程和fifos,所以我可能会弄得一团糟......)

1 个答案:

答案 0 :(得分:2)

我想我发现了这个问题。 由于在没有数据时非阻塞,因此返回错误EAGAIN,所以写了类似

的内容
if (read( fifo_win_to_send, fifo_buffer, FIFO_SIZE) <= 0 && errno != EAGAIN) {
            perror("fifo: error reading window to sender fifo");
            exit(1);
}

解决了这个问题!