我正在尝试使用命名管道。我有一个读取信息的过程和另一个将信息写入管道的过程。
这是我读者流程的简化代码:
main (int argc, char *argv[]) {
int fd, mkn;
char message[100];
if(unlink("aPipe") == -1) {
perror("Error unlinking:");
}
if((mkn = mknod("aPipe", S_IFIFO, 0)) < 0){
perror("Error mknod:");
}
if(chmod("aPipe", 0660)) {
perror("Error chmod:");
}
if(fd = open("aPipe", O_RDONLY) < 0) {
perror("Error abriendo el PIPE");
}
printf("going to read..\n");
close(fd);
}
但是它被困在这一行:if(fd = open("aPipe", O_RDONLY) < 0)
永远,我真的不明白为什么。
如果你知道哪个手册页说明了这里发生了什么,请告诉我:)。
答案 0 :(得分:3)
FIFO有点奇怪;作为作家的open()
将阻止,直到有读者,反之亦然。更糟糕的是,就像一个真正的管道,当作者关闭它的结束时,阅读结束将永远返回EOF;你必须关闭并重新打开(阻止下一个读者)。或者您open(fifo, O_RDWR)
然后您需要一些方法来了解编写器何时完成,例如只使用一行或使用带内EOF数据包。
答案 1 :(得分:2)
以下是代码:
阅读器:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
readline(int fd, char *str) {
int n;
do {
n = read(fd, str, 1);
if(n == -1){
perror("Error reading:");
}
}
while(n > 0 && (str++) != NULL);
return(n > 0);
}
main (int argc, char *argv[]) {
int fd, mkn;
char message[100];
if(unlink("aPipe") == -1) {
perror("Error unlinking:");
}
if((mkn = mknod("aPipe", S_IFIFO, 0)) < 0){
perror("Error mknod:");
}
if(chmod("aPipe", 0660)) {
perror("Error chmod:");
}
if(fd = open("aPipe", O_RDONLY) < 0) {
perror("Error abriendo el PIPE");
}
printf("going to read..\n");
while(readline(fd,message))
printf("%s\n", message);
close(fd);
}
作者:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
main (int argc, char *argv[]) {
int fd, messagelen,i;
char message[100];
sprintf(message, "Hello from PID %d", getpid());
messagelen = strlen(message) + 1;
do {
fd = open("aPipe", O_WRONLY|O_NDELAY);
if (fd == -1) {
perror("opening aPipe:");
sleep(1);
}
}
while(fd == -1);
for (i = 1; i < 4; i++) {
if(write(fd, message, messagelen) == -1) {
perror("Error writing:");
}
sleep(3);
}
close(fd);
}
我也必须学习makefifo,但在我理解之后。
非常感谢你的宝贵帮助!
答案 2 :(得分:0)
是否有任何进程写入FIFO? 如果不是,这是因为您在阻塞模式下打开FIFO RDONLY后的预期行为,则当有进程实际写入FIFO时,当前进程将不会继续。