我正在制作一个应用程序,它一开始就分为两个进程。简化后,一个进程不断地从 fifo 文件中读取数据,另一个进程偶尔将通知写入 fifo 文件。现在,一切正常,除非写入过程 write 连续快速调用它的写入方法。然后只有第一个通知会从 fifo 文件中写入(或读取?)。
这是fifo读取过程的代码:
void logging(){
int fd1;
char * myfifo = "/home/jens/Desktop/CLion_projects/Labo9/logfifo";
mkfifo(myfifo, 0666);
char str1[20];
while(1) {
pthread_mutex_lock(&lock_fifo);
fd1 = open(myfifo,O_RDONLY);
read(fd1, str1, 1000);
printf("%s\n", str1);
close(fd1);
pthread_mutex_unlock(&lock_fifo);
}
}
这是写入 fifo 文件的方法(在另一个进程中):
void write_to_fifo(char * string_to_write){
int fd;
char * myfifo = "/home/jens/Desktop/CLion_projects/Labo9/logfifo";
// mkfifo(myfifo, 0666); (should this be on or not?)
char * arr2 = string_to_write;
fd = open(myfifo, O_WRONLY);
write(fd, arr2, strlen(arr2)+1);
close(fd);
}
这是两个使用 write_to_fifo(..) 方法的调用:
write_to_fifo("Connection to SQL server established.\n");
// sleep(1);
write_to_fifo("New table "TO_STRING(TABLE_NAME)" created.\n");
第一个始终正确打印,第二个仅在 sleep(1) 未注释时有效。因此,我猜它与时间有关。如果我没有同时运行多个线程,那么将 sleep(1) 留在其中不会有问题。我想运行多个线程会使时间不可预测,并且您不能在不同线程的函数调用之间添加 sleep(1) 行。
- 为什么这个程序只有在引入延迟时才起作用?
- 这是应该的吗?
- 如果没有,我该如何克服?