прочитать целое число от пользователя и записать в дочерний канал, а затем прочитать из него родительский канал

я пытаюсь сделать простое чтение/запись в канале, но это дает мне ошибку

это мой код:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80

int main()  
{
    int fd[2],n,i,h;
    char buf[BUFSIZE];
    pipe(fd);   
    switch(fork())
    {   
        case -1 :printf("Fork Error");
            exit(0);
        case 0  :close(fd[0]);  
            printf("Enter N :");
            scanf("%d",&n);
            write(fd[1],&n,sizeof(n));
            close(fd[1]);
        case 1  :close(fd[1]);  
            n=read(fd[0],&h,sizeof(h));
            for(i=1;i<=h;i++)
            {
                if(i%2==1)
                {
                    write(1,&i,n);
                }
            }
            close(fd[0]);
    }
    exit(0);
}

в этом коде: дочерний указатель fd[0] закрывается и записывается из дочернего указателя fd[1], а затем родитель читает из указателя fd[1] и сохраняет его в переменной h, а затем значение переменной i переходит в STDOUT_FILENO (1) и отображает вывод на стандартный вывод

выход :

kartik@ubuntu:~/Desktop/isp$

Введите N :6

6: команда не найдена


person Kartik Shah    schedule 20.09.2015    source источник
comment
Вы используете компилятор C или C++?   -  person alk    schedule 20.09.2015
comment
В вашем switch отсутствуют операторы break.   -  person kaylum    schedule 20.09.2015


Ответы (2)


Здесь есть несколько проблем:

  • Вы запрашиваете N в дочернем процессе, однако родительский процесс получает ввод с терминала. Таким образом, к тому времени, когда вы введете «6», родительский процесс завершится, и вы вводите это значение в оболочку. Переместите printf и scanf перед fork, и вы сможете правильно прочитать это значение.
  • Ваш case 1 не будет введен для случая, когда fork() возвращается от родителя, что, по-видимому, является вашим намерением. fork() возвращает pid дочернего элемента родительскому. Поскольку специальный процесс init имеет pid 1, это никогда не будет правдой. Измените case 1: на default, чтобы обработать родительский процесс.
  • Вы не используете break в конце случаев переключения. В C случаи переключения «проваливаются», что означает, что после завершения оператора для одного случая он продолжит выполнение операторов для следующего случая. Оператор break в конце каждого случая предотвращает это.

С этими исправлениями у вас теперь есть это:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80

int main()
{
    int fd[2],n,i,h;
    pid_t pid;     // to capture the child pid
    char buf[BUFSIZE];
    // prompt for N before forking
    printf("Enter N :");
    scanf("%d",&n);
    pipe(fd);
    switch((pid=fork()))   // saving the child pid in case we want to use it later
    {
        case -1 :
            printf("Fork Error");
            exit(0);     // no break needed here because of exit
        case 0  :
            close(fd[0]);
            write(fd[1],&n,sizeof(n));
            close(fd[1]);
            break;       // end of case 0
        default :
            close(fd[1]);
            n=read(fd[0],&h,sizeof(h));
            printf("h=%d\n",h);
            for(i=1;i<=h;i++)
            {
                if(i%2==1)
                {
                    //write(1,&i,n);
                    printf("%d\n",i);
                }
            }
            close(fd[0]);
            break;      // end of default case
    }
    exit(0);
}
person dbush    schedule 20.09.2015

Ваш родительский процесс должен дождаться, пока его дочерняя тема завершит свою работу и поместит данные в канал...

поэтому добавьте строку ниже.

            wait(&status);
person Jeegar Patel    schedule 20.09.2015