я пытаюсь сделать простое чтение / запись в трубе
но это дает мне ошибку
это мой код:
#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: команда не найдена
Здесь есть несколько вопросов:
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);
}
Ваш родительский процесс должен подождать, пока его дочерняя тема завершит свою работу, и отправить данные в канал …
так что добавьте ниже строки.
wait(&status);