本质:
启动shell和命令两个进程,从命令进程中读/写文件流。
解决exec和system无返回输出数据问题。
特点:
方便使用系统自带功能,并可以执行比较复杂的shell。
默认启动两个进程,效率较低。
操作:
打开管道:
FILE* popen(const char *command, const char *open_mode);
参数:
command:
命令行字符串。
open_mode:
只读“r”
只写“w”
返回值:
文件描述符。(打开失败返回NULL)
关闭管道:
int pclose(FILE* stream);
参数
stream:
文件描述符。
返回值:
-1失败
0成功
读操作:
size_t fread(void *buffer, size_t size, size_t count, FILE* stream);
参数:
buffer:
用于接收数据的内存地址。
size:
读取每个数据项的字节数。(每个数据所占字节数)
count:
需要读取的数据项个数。
PS:
一共要读取size*count个字节数。
要读取的数据项如果少于count,则有多少读多少,大于则只读count个。
stream:
输入的文件指针。
返回值:
>count出错
正数真实读取的数据项个数(注:和size无关,只是count的值)
写操作:
size_t fwrite(const void *buffer, size_t size, size_t count, FILE* stream);
参数:
buffer:
写入数据的内存地址。
size:
写入数据项的字节数。(每个数据所占字节数)
count:
需要写入的数据项个数。
PS:
一共要写入size*count个字节数。
要写入的数据项如果少于count,则有多少写多少;大于则只写入count个。
stream:
目标文件指针。
返回值:
>count出错
正数实际写入的数据项个数(注:和size无关,只是count的值)
例子:
读:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE* fd = popen("ps","r");
// FILE* fd = popen("ls -l","r");
char buf[BUFSIZ];
size_t count = 0;
printf("read data:\n");
do{
memset(buf,'\0',BUFSIZ);
size_t n = fread(buf,sizeof(char),BUFSIZ-1,fd);
if( n > BUFSIZ - 1 ){
perror("fread error");
exit(EXIT_FAILURE);
}
count += n;
printf("%s",buf);
}while(!feof(fd));
printf("total size:%ld\n",count);
pclose(fd);
}
写:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE* fd = popen("wc","w");
//char str[] = "123 456";
char str[] = "123 456\n";
size_t n = fwrite(str,sizeof(char),sizeof(str),fd);
if(n > sizeof(str)){
fprintf(stderr,"FILE:%d,LINE:%d-fwrite error",__FILE__,__LINE__);
exit(EXIT_FAILURE);
}
pclose(fd);
}