可能是最简单的两个程序之间传递数据的方法就是使用popen和pclose函数了。
#incldue<stdio.h>
FILE *popen(const char *command , const char *open_mode);
int pclose(FILE *stream_to_close);
1.popen函数允许一个程序将另一个程序作为新进程来启动,并可以传递数据给它或者通过它接收数据。command字符串是
要运行的程序名和相应的参数。open_mode必须是“r"或者"w"。
如果open_mode是"r",被调用程序的输出就可以调用程序使用,调用程序利用popen函数返回的FILE*文件指针,就可以通过常用的stdio库
函数(如fread)来读取被调用程序的输出。
如果open_mode是“w”,调用程序就可以用fwrite调用向被调用程序发送数据,而被调用程序可以在自己的标准输入上读取这些数据。
被调用程序的程序通常不会意识到自己正在从另一个进程读取数据,它只是在标准输入流上读取数据,然后作出相应的操作。
2.pclose函数
用popen启动的进程结束时,我们可以用pclose函数关闭与之关联的文件流。
读取外部程序的输出
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *read_fp;
char buffer[BUFSIZ + 1];
int chars_read;
memset(buffer, '\0', sizeof(buffer));
read_fp = popen("uname -a", "r");
if (read_fp != NULL) {
chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
if (chars_read > 0) {
printf("Output was:-\n%s\n", buffer);
}
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
将输出送往外部程序
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *write_fp;
char buffer[BUFSIZ + 1];
sprintf(buffer, "Once upon a time, there was...\n");
write_fp = popen("od -c", "w");
if (write_fp != NULL) {
fwrite(buffer, sizeof(char), strlen(buffer), write_fp);
pclose(write_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
传递更多的数据
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE *read_fp;
char buffer[BUFSIZ + 1];
int chars_read;
memset(buffer, '\0', sizeof(buffer));
read_fp = popen("ps ax", "r");
if (read_fp != NULL) {
chars_read = fread(buffer, sizeof(char), BUFSIZ/10, read_fp);
while (chars_read > 0) {
buffer[chars_read - 1] = '\0';
printf("Reading %d:-\n %s\n", BUFSIZ/10, buffer);
chars_read = fread(buffer, sizeof(char), BUFSIZ/10, read_fp);
}
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}