【问题标题】:Reading FIFOs, resource temporary unavailable读取 FIFO,资源暂时不可用
【发布时间】:2015-01-22 18:41:10
【问题描述】:

我有一个多线程程序的问题。 基本上我使用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);
}

和“写作线程”:

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);
}

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

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 读取时,运行程序时发生错误。控制台读取“fifo:错误读取窗口到发件人 fifo:资源暂时不可用”读取应该是“非阻塞”,但我不知道它是否正确或似乎是什么问题。 (第一次尝试同时使用线程和fifos,所以我可能弄得一团糟......)

【问题讨论】:

  • 为什么要设置非阻塞模式?如果你这样做了,但还没有数据要读取,你会发生什么?
  • 读取在实际程序中处于循环中,我希望继续前进并稍后检查是否有数据
  • 好的,那就这样做吧!如果读取失败,请检查 errno,如果是 EAGAIN,则继续执行其他操作,稍后再尝试读取。
  • 谢谢,我完全错过了 EAGAIN 在使用非阻塞 FIFO 中的重要性

标签: c multithreading fifo


【解决方案1】:

我想我找到了问题所在。 由于没有数据时是非阻塞返回错误EAGAIN,所以写类似

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

解决问题!

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2018-08-04
    • 2021-05-07
    • 2018-02-24
    相关资源
    最近更新 更多