标签:
/************************************************************************* > File Name: popen2.c > Description: popen2.c程序将数据写入管道 > Author: Liubingbing > Created Time: 2015年07月09日 星期四 19时43分51秒 > Other: popen2.c程序的作用等同于在命令行上输入echo "Once upon a time, there was..." | od -c ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main(){ FILE *write_fp; char buffer[BUFSIZ + 1]; /* 将字符串写入buffer */ sprintf(buffer, "Once upon a time, there was...\n"); /* 函数popen允许一个程序给另一个程序传输数据 * 第二个参数"w"表明调用程序可以用fwrite调用向被调用程序发送数据 * 即将文件流指针write_fp指向的数据作为命令"od -c"的标准输入 */ write_fp = popen("od -c", "w"); if (write_fp != NULL) { /* fwrite向一个文件写入数据块 * 即将buffer中的数据写入到write_fp指向的文件,写入strlen(buffer)个元素,每个元素的大小为sizeof(char)个字节 */ fwrite(buffer, sizeof(char), strlen(buffer), write_fp); pclose(write_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }程序使用带有参数"w"的popen启动od -c命令,这样就可以向该命令发送数据了.然后它给od -c命令发送一个字符串,该命令接收并处理它,最后把处理结果打印到自己的标准输出上.
/************************************************************************* > File Name: popen3.c > Description: popen3.c程序通过管道读取大量数据 > Author: Liubingbing > Created Time: 2015年07月09日 星期四 20时34分37秒 > Other: popen3.c ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(){ FILE *read_fp; char buffer[BUFSIZ + 1]; int chars_read; memset(buffer, '\0', sizeof(buffer)); /* popen函数访问"ps ax"命令给出的信息 * 第一个参数"ps ax"是要运行的程序名和相应的参数 * 第二个参数open_mode="r"说明被调用程序的输出可以被调用程序使用 * 返回值为FILE*文件流指针read_fp,利用read_fp可以读取"ps ax"的输出信息 */ read_fp = popen("ps ax", "r"); if (read_fp != NULL) { /* fread函数从文件流指针read_fp指向的文件流中读取数据 * 最多读取BUFSIZ个元素,每个元素sizeof(char)个字节 * buffer用于接收数据的内存地址 * 如果成功则返回实际读取的元素的个数 */ chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); if (chars_read > 0) { buffer[chars_read - 1] = '\0'; printf("Reading %d:-\n %s\n", BUFSIZ, buffer); chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); } /* pclose关闭与popen关联的文件流(read_fp指向的文件流) */ pclose(read_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }在这个程序中,从被调用的进程ps ax中读取数据.该进程输出的数据有多少事先无法知道,所以必须对管道进行多次读取.
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/46821327