Именованный канал приводит к бесконечному циклу / без вывода

Я пытался создать простую программу, которая использует именованный канал для связи между процессами. Я пробовал сделать это в OS X Yosemite, а также в Ubuntu Linux 14.04 (виртуализированный на Parallels), и ниже приведен код программы, которая должна иметь 3 процесса, которые взаимодействуют через один и тот же именованный канал.

Мой код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

void proc1(char *named_pipe) {

  printf("Proc 1\n");

  int fd;
  char *mess1;

  mess1 = "Message from \"proc1\".";
  fd = open(named_pipe, O_WRONLY);
  if(fd == -1) {
    printf("error : opening\n");
    exit(-1);
  }
  printf("Opened\n");
  if(write(fd, mess1, sizeof(mess1)) == -1) {
    perror("error : writing\n");
    exit(-1);
  }
  close(fd);

  printf("End of Process 1.\n");

}

void proc2(char *named_pipe) {

  int fd;
  char buf[50];
  char *mess2;

  fd = open(named_pipe, O_RDONLY);
  read(fd, buf, 50);
  printf("Received : %s\n", buf);
  close(fd);

  mess2 = "Message from \"proc2\".";
  fd = open(named_pipe, O_WRONLY);
  write(fd, mess2, sizeof(mess2));
  close(fd);

  printf("End of Process 2.\n");

}

void proc3(char *named_pipe) {

  int fd;
  char buf[50];

  fd = open(named_pipe, O_RDONLY);
  read(fd, buf, 50);
  printf("Received : %s\n", buf);
  close(fd);

  printf("End of Process 3.\n");

}

int main() {

  char tube[4] = "tube";

  printf("### Start of program ###\n");

  if(mkfifo(tube, 0600) == -1) {
    perror("Problem creating named pipe.\n");
    exit(99);
  }

  proc1(tube);
  proc2(tube);
  proc3(tube);

  printf("### End of program ###\n");

  return 0;
}

Мой вывод

### Start of program ###
Proc 1

И тогда ничего не происходит, кроме мигания курсора, указывающего (?), Что программа все еще работает. Таким образом, кажется, что код бесконечно зацикливается каждый раз, когда я запускаю эту программу, даже не сообщая мне почему.

Мой вопрос

Что меня действительно озадачивает, так это то, что даже проверенный как работающий фрагмент кода, который я нашел на этом сайте при исследовании этой проблемы также, приводит к тому же бесконечному циклу / без вывода; см. этот код здесь. Может быть, это проблема в моей операционной системе? Имейте в виду, что точно такой же результат наблюдается как в OSX, так и в Ubuntu.

обновить

Решение

(Спасибо @Sami Kuhmonen)

Мне нужно было запустить две программы (из связанного кода) одновременно. Почувствуйте себя немного глупо!


person daire16    schedule 08.01.2016    source источник
comment
У вас есть только один процесс, поэтому нет IPC   -  person Sami Kuhmonen    schedule 08.01.2016
comment
трубка должна быть char [5] для окончания 0, иначе имя файла будет беспорядочным   -  person Kai Iskratsch    schedule 08.01.2016
comment
@SamiKuhmonen Привет, огромное спасибо за комментарий. Мой единственный вопрос: почему код в связанном вопросе тоже не работает? Должен ли я запускать две программы одновременно?   -  person daire16    schedule 08.01.2016
comment
@ daire16 Модуль записи и считыватель должны запускаться одновременно, в противном случае они будут заблокированы, если не используется неблокирующее открытие.   -  person Sami Kuhmonen    schedule 08.01.2016
comment
@KaiIskratsch, спасибо за это, мне было интересно, почему у трубки такое забавное название?   -  person daire16    schedule 08.01.2016
comment
@SamiKuhmonen ... яйцо на моем лице, запустил 2 программы одновременно, и это сработало без проблем. Бесконечно благодарен!   -  person daire16    schedule 08.01.2016