实际上使用自动管理通信渠道的popen 更容易做到这一点
FILE *popen(const char *command, const char *mode);
popen() 函数应执行字符串指定的命令
命令。它应该在调用程序和调用程序之间创建一个管道
执行的命令,并应返回一个指向流的指针,该流可以是
用于读取或写入管道。
执行命令的环境应该是一个子进程
是在 popen() 调用中使用 fork() 函数创建的,并且
孩子使用以下调用调用了 sh 实用程序:
execl(shell path, "sh", "-c", command, (char *)0);
其中 shell path 是 sh 实用程序的未指定路径名。
popen() 函数应确保来自先前的任何流
在父进程中保持打开的 popen() 调用在
新的子进程。
popen() 的模式参数是一个指定 I/O 模式的字符串:
如果mode为r,当子进程启动时,它的文件描述符
STDOUT_FILENO 应该是管道的可写端,文件
调用进程中的描述符 fileno(stream),其中 stream 是
popen() 返回的流指针,应该是
管道。
如果 mode 是 w,当子进程启动时,它的文件描述符
STDIN_FILENO 应该是管道的可读端,文件
调用进程中的描述符 fileno(stream),其中 stream 是
popen() 返回的流指针,应该是
管道。
如果 mode 是任何其他值,则结果未定义。
在popen()之后,父进程和子进程都应该能够
在任一终止之前独立执行。
管道流是面向字节的。
返回值
成功完成后,popen() 将返回一个指向打开的指针
可用于读取或写入管道的流。否则,它
应该返回一个空指针,并且可以设置 errno 来指示错误。
例如假设你想给孩子发送Hello world:
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
int main()
{
FILE* toChild;
toChild = popen("./child", "w");//child is executable of the other file: change the name
int res = fputs( "Hello World\n", toChild);
pclose(toChild);
return 0;
}
和孩子:
int main()
{
char p[100];
int n;
do{
n = scanf("%s", p);
if (n>0) {
printf("INPUT MESSAGE: \"%s\n\"", p);
//free(p);
}
else {
printf( "%d, No matching characters\n", n);
}
}while(n>0);
return 0;
}
如果您使用的是纯 POSIX 系统(而不是 OSX),您还可以使用 scanf("%ms", &p) 和 char* p,然后使用 free(p)。