匿名管道 中的 单工通道(popen)

来源:互联网 发布:it咨询 编辑:程序博客网 时间:2024/06/15 11:23

本质:

启动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);}



0 0
原创粉丝点击