2

这是我想做的:

我试图制作一个程序来创建具有两个孩子的父母,父母创建未命名的管道,写入其中,孩子应该从中读取(每 1 个字节),然后在两个不同的终端窗口中输出结果。我不知道如何同步它们。

我在一个终端窗口中得到类似的东西:Nejke aa,在第二个窗口中:adt I want: Nejake data

我尝试在互联网上搜索,但我还是在问。任何帮助是极大的赞赏。

#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);
}
}
4

2 回答 2

2

如果两个孩子都需要查看相同的数据,您将需要两个管道,每个孩子一个,并且父级必须将每条消息写入两次,每个管道上一次。

或者,您可以使用进程替换tee运行命令,或者您可以查找(尝试查找)程序(的进程/管道变体) - 或者您可以点击此Stack Overflow 答案中的链接。您的程序将有一个管道,但孩子们将各自拥有自己的管道。peetee

于 2013-05-25T23:39:09.523 回答
0

Unix管道是先进先出的。一个输入,一个输出。没有什么比一个管道的两个输出更好的了。你的秘籍是:System V IPC关键字和ipcs命令。

于 2013-05-25T23:16:33.140 回答