2013-11-17 3 views
1

Моя программа будет выбирать случайное число и использовать догадываться, что это такое. Я почти закончил с этим, за исключением того, что мне нужно дублировать файловые дескрипторы, чтобы указать на канал, и я не совсем уверен, как это сделать. Я думаю, что мне придется использовать dup2, но я не совсем уверен, как его реализовать. Все помогает. Вот мой код до сих пор:дубликат дескриптора файла, чтобы указать на трубку

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int pid; 
    int n; 
    char buf[101]; 
    int pfdA[2]; 
    int pfdB[2]; 

    // CREATE FIRST PIPE 
    if (pipe(pfdA) == -1) 
    { 
    perror("pipe failed"); 
    exit(-1); 
    } 

    // CREATE SECOND PIPE 
    if (pipe(pfdB) == -1) 
    { 
    perror("pipe failed"); 
    exit(-1); 
    } 

    // FORK() 
    if ((pid == fork()) < 0) 
    { 
    perror("fork failed"); 
    exit(-2); 
    } 

    if (pid == 0) 
    { 
    // duplicate file descriptor 0 to point to FIRST pipe 

    // CLOSE ends of FIRST pipe you don't need anymore 
    close(pfdA[0]); 
    close(pdfA[1]); 

    // duplicate file descriptor 1 to point to SECOND pipe 

    // CLOSE ends of SECOND pipe you don't need anymore 
    close(pfdB[0]); 
    close(pfdB[1]); 

    execlp("./A5_CHILD", "./A5_CHILD", (char *) 0); 
    perror("execlp"); 
    exit(-3); 
    } 

    else 
    { 

    while (1) 
    { 
     char NUM[100]; 
     close(pfdA[0]); 
     close(pfdB[1]); 

     int r = 0; 

     printf("Enter a Number: "); 
     fflush(stdout); 
     scanf("%s", NUM); 

     // SEND NUM to Child process 
     write(pdfA[1], NUM, strlen(NUM)); 

     // READ FROM CHILD THE RESPONSE into the variable buf and 
     //  store the return value from read() into the variable r 
     r = read(pfdB[0], buf, 100); 

     if (r > 0) 
     { 
     buf[r] = '\0'; 
     printf("%s\n", buf); 
     fflush(stdout); 
     } 
     else 
     { 
     printf("[PARENT] Reading from child: read() returned %d\n", r); 
     break; 
     } 
    } 
    } 

    return (0); 
} 
+0

Вы спрашиваете, как установить цепочку детей-процессов, каждый из которых извлекает данные из предшествующего (кроме первого), то жует на него и кормах данных до следующего, до последнего, который отправляет окончательные данные обратно родительскому устройству, и при этом, как настроить каналы io с помощью 'dup2()'? – WhozCraig

+0

@WhozCraig это будет всего один ребенок и один родитель, но дочерний процесс - это тот, который запускает программу, которая фактически играет в игру. Поэтому он должен иметь возможность давать и получать номер через трубу. Но да, мне нужно знать, как настроить каналы с помощью dup2(), которые я верю, если нет лучшего способа сделать это. – R0drom

ответ

0

Я думаю, что я должен был бы использовать dup2, но я не совсем уверен, как реализовать.

Вы правы.

// duplicate file descriptor 0 to point to FIRST pipe 
    dup2(pfdA[0], 0); 

...

// duplicate file descriptor 1 to point to SECOND pipe 
    dup2(pfdB[1], 1); 
Смежные вопросы