c - How to use popen? -
i'm trying inter process communication stdin , stdout. posix function found popen, failed write working sample code. please me work.
<edit1>
have use dup? can see examples found google using it. linux manual of dup not me understanding how 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); } }
as defined posix, pipes unidirectional communication mechanism — work in 1 direction only. in order redirect both standard input , standard output, need create 2 pipes — , popen function cannot that.
while less convenient, not difficult achieve want using directly system calls fork, pipe, dup2 , 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 other solutions — use socketpair system call avoid need 2 pipes, or use unix domain sockets directly.
Comments
Post a Comment