Я хочу, чтобы родительские и дочерние процессы взаимодействовали в C linux с помощью каналов. Сначала я хочу, чтобы родитель передал строку, а затем ребенок подтвердил ее. Я создал два файловых дескриптора. один для родительского к дочернему, т.е. readpipe и другой writepipe для наоборот. Проблема в том, что он не принимает мои данные в качестве входных данных. Также я хочу, чтобы операторы printf, такие как «Введите ваши данные», печатались один раз, но поскольку после разветвления есть два процесса, поэтому они отображаются дважды. Есть альтернатива этому??
//readpipe[0] = child read
//readpipe[1]= parent write
//writepipe[0]=parent read
//writepipe[1]=child write
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
pid_t pid;
int r;
/* Hope this is big enough. */
char buf[1024];
char cp[50];
char ans;
int readpipe[2];
int writepipe[2];
int a;
int b;
a=pipe(readpipe);
b=pipe(writepipe);
if (a == -1) { perror("pipe"); exit(EXIT_FAILURE); }
if (b == -1) { perror("pipe"); exit(EXIT_FAILURE); }
printf("\nSEND SOMETHING TO CHILD PROCESS\t");
scanf(" %c",&ans);
pid=fork();
if(pid==-1)
{
printf("pid:main");
exit(1);
}
while(ans=='y' || ans=='Y')
{
printf("\nEnter data\t"); //printed twice
fgets(cp, 50, stdin); //not taking data
printf("\n%s",cp);
if(pid==0)
{ //CHILD PROCESS
close(readpipe[1]);
close(writepipe[0]);
read(readpipe[0],buf,sizeof(buf));
printf("\nSENT\n %s",buf);
write(writepipe[1],cp,strlen(cp)+1);
}
else
{ //PARENT PROCESS
close(readpipe[0]);
close(writepipe[1]);
write(readpipe[1],cp,strlen(cp)+1);
read(writepipe[0],buf,sizeof(buf));
printf("\nRECEIVED\n %s",buf);
}
printf("\nSEND SOMETHING TO CHILD PROCESS\t");
scanf(" %c",&ans);
}
close(readpipe[1]);
close(writepipe[0]);
close(readpipe[0]);
close(writepipe[1]);
return 0;
}
Спасибо :)
close(writepipe[0])
, а затемread(writepipe[0],ch1,sizeof(ch1));
... не получится так горячо. - person WhozCraig   schedule 19.03.2014readpipe
иwritepipe
. - person WhozCraig   schedule 19.03.2014