这是我想做的事情:
我试图制作一个程序,用两个子节点创建父节点,父节点创建未命名的管道,写入它并且子节点应该从中读取(每1个字节),然后在两个不同的终端窗口中输出结果。我不知道的是如何同步它们。
我在一个终端窗口中得到这样的东西:Nejke aa 在第二个:adt 我想:Nejake数据
我尝试在互联网上搜索,但无论如何我都在问。 非常感谢任何帮助。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
/* declare our procedures */
void runchild1(int pfd[]);
void runchild2(int pfd[]);
/* some data to write and read from pipe */
const char some_data[] = "Nejake data" ;
int main(int argc, char **argv)
{
int pid, status; //PID for debugging
int fd[2]; //file descriptors for the pipe
/* let create some pipe */
pipe(fd);
/* supposed to run two children of the process */
runchild1(fd);
runchild2(fd);
/* this is important! close both file descriptors on the pipe */
close(fd[0]); close(fd[1]);
/* pick up all the dead children */
while ((pid = wait(&status)) != -1)
fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status));
exit(0);
}
void runchild1(int pfd[]) /* run the first child */
{
int pid; /* you may want to print it for debugging */
int data_processed; /* store data */
int des; /* descriptor for open files */
char buffer; /* buffer for reading byte of data */
switch (pid = fork()) {
case 0: /* child reads from the pipe */
close(pfd[1]); /* this process don't need the other end */
while ((data_processed = read(pfd[0],&buffer,1)) > 0) {
printf("Proces %d, data citane po bajte: %c\n",getpid(),buffer);
des = open("/dev/ttys001",O_RDWR);
write(des, &buffer,1);
}
exit(0);
default: /* parent writes to the pipe */
/* write some data for children to read */
data_processed = write(pfd[1], some_data, strlen(some_data));
printf("Zapis %d bytov cez nepomenovanu ruru:\n", data_processed);
printf("Zapisane: %s\n",some_data);
printf("Som rodic dvoch deti: %d\n",getpid());
break;
case -1:
perror("fork");
exit(1);
}
}
void runchild2(int pfd[]) /* run the second child */
{
int pid;
int data_processed;
int des;
char buffer;
switch (pid = fork()) {
case 0: /* child */
close(pfd[1]); /* this process doesn't need the other end */
while ((data_processed = read(pfd[0],&buffer,1)) > 0) {
printf("Proces %d, data citane po bajte: %c\n",getpid(),buffer);
des = open("/dev/ttys002",O_RDWR);
write(des, &buffer,1);
}
exit(0);
default: /* parent does nothing */
break;
case -1:
perror("fork");
exit(1);
}
}
答案 0 :(得分:2)
如果这两个孩子都需要查看相同的数据,那么你需要两个管道,每个孩子一个,父母必须每次写两次,一次在每个管道上。
或者,您可以使用tee
运行process substitution命令,也可以查找(尝试查找)程序pee
(tee
的进程/管道变体) - 或者您可以关注此Stack Overflow answer的链接。你的程序将有一个管道,但孩子们每个人都会得到自己的管道。
答案 1 :(得分:0)
Unix管道是FIFO。一个输入,一个输出。没有像一个管道的两个输出。你的作弊是:System V IPC
关键字和ipcs
命令。