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