posix (, Linux , posix), pipe/execl/dup. , :
- 2 ( )
- . fd
- stdin/stdout. dup ( , )
, .
:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
pid_t pid;
int pipe_in[2];
int pipe_out[2];
if (pipe (pipe_in) || pipe (pipe_out)) {
fprintf (stderr, "Error in creating pipes!\n");
exit (1);
}
if ((pid = fork ()) == -1) {
fprintf (stderr, "Error in fork!\n");
exit (1);
}
if (pid) {
char temp[100];
int result;
FILE* child_in;
FILE* child_out;
child_in = fdopen(pipe_out[0],"r");
child_out = fdopen(pipe_in[1],"w");
close(pipe_out[1]);
close(pipe_in[0]);
fprintf(child_out, "something\n");
fgets(temp,100,child_in);
printf(" Read from child %s \n", temp);
fprintf(child_out, "quit\n");
fflush(child_out);
fgets(temp,100,child_in);
printf(" Read from child %s \n", temp);
wait (&result);
}
else {
close (1);
dup (pipe_out[1]);
close (0);
dup (pipe_in[0]);
close (pipe_out[0]);
close (pipe_out[1]);
close (pipe_in[0]);
close (pipe_in[1]);
execl ("child", "child", NULL);
exit(1);
}
return 0;
}
:
#include <stdio.h>
#include <string.h>
int main ()
{
char temp[100];
do {
printf ("In child: \n");
fflush (stdout);
fgets (temp, 100, stdin);
printf ("Child read %s\n", temp);
fflush (stdout);
} while (!strstr (temp, "quit"));
return 0;
}
:
gcc -o parent parent.c
gcc -o child child.c
./parent
:
, quit