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

本质:

启动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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值