命名管道创建

时间:2011-06-06 02:21:26

标签: c unix named-pipes

我正在尝试使用命名管道。我有一个读取信息的过程和另一个将信息写入管道的过程。

这是我读者流程的简化代码:

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)永远,我真的不明白为什么。

如果你知道哪个手册页说明了这里发生了什么,请告诉我:)。

3 个答案:

答案 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时,当前进程将不会继续。