问题
I'm trying to do inter process communication with stdin
and stdout
. The Posix function I found is popen
, but I failed to write a working sample code. Please help me get this work.
<edit1>
Do I have to use dup
? I can see some examples found with Google using it. But the Linux manual of dup
really does not help me understanding how to use that.
</edit1>
a.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *s;
for(;;){
scanf("%ms",&s);
printf("%s\n",s);
if(!strcmp(s,"quit")){
free(s);
printf("bye~\n");
exit(EXIT_SUCCESS);
}
free(s);
}
}
b.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
FILE *fRead;
FILE *fWrite;
char *s;
int i;
fRead=popen("~/a.out","r");
fWrite=popen("~/a.out","w");
for(i=1;i<=10;++i){
fprintf(fWrite,"%d",i);
fscanf(fRead,"%ms",&s);
printf("%s\n",s);
free(s);
}
}
回答1:
As defined by POSIX, Pipes are a unidirectional communication mechanism — they work in one direction only. In order to redirect both standard input and standard output, you need to create two pipes — and the popen
function cannot do that.
While slightly less convenient, it is not difficult to achieve what you want by using directly the system calls fork
, pipe
, dup2
and exec
:
rc = pipe(p1);
if(rc < 0) ...
rc = pipe(p2);
if(rc < 0) ...
rc = fork();
if(rc < 0) {
...
} else if(rc == 0) {
/* child */
close(p1[0]);
close(p2[1]);
dup2(p1[1], 1);
dup2(p2[0], 0);
execlp(...);
exit(1);
} else {
/* parent */
close(p1[1]);
close(p2[0]);
...
}
There are other solutions — you could use the socketpair
system call to avoid the need for two pipes, or even use Unix domain sockets directly.
来源:https://stackoverflow.com/questions/30259086/how-to-use-popen