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

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

это мой код:

#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) и отображает вывод на стандартный вывод

выход :

Картик @ убунт: ~ / Desktop / ИСП $

Введите N: 6

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

1

Решение

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

  • Вы предлагаете 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);
}
0

Другие решения

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

так что добавьте ниже строки.

            wait(&status);
0

По вопросам рекламы [email protected]