【发布时间】: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