Используя трубу в программировании на с

Я использую трубу в c, чтобы создать программу, которая определяет, является ли введенное пользователем целое число четным или нечетным. Кроме того, он должен соответствовать следующим требованиям: родительский процесс должен отправить целое число разветвленному дочернему процессу. Дочерний процесс должен получить отправленное целое число, чтобы определить его тип (четный или нечетный). Затем результат должен быть возвращен обратно в родительский процесс, чтобы отобразить его в оболочке для пользователя. Я должен использовать Pipes IPC для обмена данными между родительскими и дочерними процессами.

мой код как показано ниже

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void sendNumber(int);
void RecResult();
int f_des[2];

int main(int argc, char *argv[])
{
    static char message[BUFSIZ];
    if ( pipe(f_des) == -1 )
    {
        perror("Pipe");
        exit(2);
    }
    switch ( fork() )
    {

        case -1: perror("Fork");
            exit(3);

        case 0: /* In the child */
        {

            // read a meesage
            close(f_des[1]);
            read(f_des[0], message, BUFSIZ  );

            int num=atoi(message);
            printf("Message received by child: [%d]\n", num);


            if(num % 2 == 0)

                sprintf(message,"%d is Even \0",num);

            else

                sprintf(message,"%d is Odd \0",num);

            close(f_des[0]);
            write(f_des[1], message, BUFSIZ);
            exit(0);
        }

            break;
        default: /* In the parent */
        {
            int num;
            printf("\n Enter an Integer \n");
            scanf("%d",&num);
            char msg[BUFSIZ];
            sprintf(msg,"%d",num);

            // write a message
            close(f_des[0]);
            write(f_des[1], msg, BUFSIZ);

            printf("\n Waiting Child \n");

            wait(NULL); 
            // read a mesaage
            static char message[BUFSIZ];
            close(f_des[1]);
            read(f_des[0], message, BUFSIZ);

            printf("========> Result:  %s . \n",message);
        }
    }
}

ребенок получает сообщение успешно, но родитель не получает никакого результата:S любой может помочь, вот мой вывод

rose@ubuntu:~$ gcc -o test_3 test_3.c
rose@ubuntu:~$ ./test_3

 Enter an Integer 
3

 Waiting Child 
Message received by child: [3]
========> Result:   . 
rose@ubuntu:~$ 

всем спасибо;)

1 ответ

Канал PIPE - это однонаправленный канал связи. Если вы хотите, чтобы дочерний процесс выполнял обратную запись в родительский процесс, вам понадобится второй канал PIPE, отличный от того, который использовался для получения сообщения от родительского процесса.

Другие вопросы по тегам