Создание именованной трубы - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь использовать именованные каналы.У меня есть процесс, который читает информацию, и другой, который записывает информацию в канал.

Это сокращенный код моего процесса чтения:

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 ]

3 голосов
/ 06 июня 2011

FIFO немного странные;open() как писатель будет блокировать, пока не появится читатель, и наоборот.Хуже того, как настоящий канал, когда писатель закрывает свой конец, конец чтения будет возвращать EOF навсегда;Вы должны закрыть и снова открыть (блокировка для следующего читателя).Или вы open(fifo, O_RDWR), а затем вам нужен какой-то способ узнать, когда писатель завершен, например, использовать только одну строку или иметь пакет EOF внутри полосы.

2 голосов
/ 07 июня 2011

Вот код:

Читатель:

#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, но после того, как я это пойму.

Большое спасибо за вашу ценную помощь!

0 голосов
/ 06 июня 2011

Есть ли процесс записи в FIFO?Если нет, то это ожидаемое поведение, так как вы открыли FIFO RDONLY в режиме блокировки, текущий процесс не будет продолжаться, пока не произойдет процесс записи в FIFO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...