Я пытался создать простую программу, которая использует именованный канал для связи между процессами. Я пробовал сделать это в 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)
Мне нужно было запустить две программы (из связанного кода) одновременно. Почувствуйте себя немного глупо!