#include <stdio.h>
int main(void)
{
int filedes_in[2], filedes_out[2]; /* pipe用 file descriptor */
FILE *fp_to_child, *fp_from_child; /* 親プロセス読み書き用 */
char buf[255];
pipe(filedes_in);
pipe(filedes_out);
if(fork()==0){ /* ここから子プロセス*/
/* この段階で、file_desciptorは、下図のようになる
/ 0(stdin) --> stdin
/ 1(stdout) --> stdout
/ filedes_in[0] --> pipe1(in)
/ filedes_in[1] --> pipe1(out)
/ filedes_out[0] --> pipe2(in)
/ filedes_out[1] --> pipe2(out)
*/
close(0); /* stdinをclose */
dup2(filedes_in[0],0); /* stdin(file descriptor(0))をfildes_in[0]のさすファイルにする。*/
close(1); /* stdoutをclose */
dup2(filedes_out[1],1); /* stdout(file descriptor(1))をfildes_out[1]のさすファイルにする。 */
/* この段階で、file desciptorは、下図のようになる
/ 0(stdin) --> pipe1(in)
/ 1(stdout) --> pipe2(out)
/ filedes_in[0] --> pipe1(in)
/ filedes_in[1] --> pipe1(out)
/ filedes_out[0] --> pipe2(in)
/ filedes_out[1] --> pipe2(out)
/ この段階で、filedes_xxxは、必要なくなるので、すべてcloseしておく*/
close(filedes_in[0]);
close(filedes_in[1]);
close(filedes_out[0]);
close(filedes_out[1]);
execl("/bin/sh","sh",NULL);
exit();
}
/* 親プロセス */
/* 書きこみしやすいように、filedes_xxxをファイルポインタ形式にする。*/
fp_to_child=fdopen(filedes_in[1],"w");
fp_from_child=fdopen(filedes_out[0],"r");
/* 不必要なfiledes_xxxを削除 */
close(filedes_in[0]);
close(filedes_out[1]);
/* この段階で、file desciptorは、下図のようになる
/ 0(stdin) --> stdin
/ 1(stdout) --> stdout
/ filedes_in[1] --> pipe1(out) == FILE * fp_to_child
/ filedes_out[0] --> pipe2(in) == FILE * fp_from_child
*/
printf("コマンドを入れてください:");
fgets(buf,sizeof(buf),stdin);
fputs(buf,fp_to_child);
fflush(fp_to_child);
fgets(buf,sizeof(buf),fp_from_child);
printf("コマンドのアウトプット:\n");
fputs(buf,stdout);
fclose(fp_to_child);
fclose(fp_from_child);
wait();
return 0;
}
|