popen
Posted tianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了popen相关的知识,希望对你有一定的参考价值。
函数原型
FILE *popen(const char *cmd,const char *type);
功能
创建一个管道,fork一个子进程,接着关闭管道的不使用端,子进程执行cmd指向的应用程序或者命令。
执行完该函数后父进程和子进程之间生成一条管道,函数返回值为FILE结构指针,该指针作为管道的一端,为父进程所拥有。子进程则拥有管道的另一端,该端口为子进程的stdin或者stdout
如果type=r,那么该管道的方向为:子进程的stdout到父进程的FILE指针(文件指针连接到command的标准输出);
如果type=w,那么管道的方向为:父进程的FILE指针到子进程的stdin(type是"w"则文件指针连接到command的标准输入)。
//#include "unpipc.h" #include <stdio.h> #include <stdlib.h> #include <string.h> const int MAXLINE=4096; int main() { char buffer[MAXLINE],command[MAXLINE]; fgets(buffer,MAXLINE,stdin);//输入文件路径 size_t len=strlen(buffer); if(buffer[len-1]==‘ ‘)//去除fgets尾的换行 --len; //把cat与路径名相连 shell命令 snprintf(command,sizeof(command),"ls %s",buffer); //创建一个子进程,子进程执行command命令,子进程的输出输入到父进程的输入 FILE *fp=popen(command,"r"); //printf("pid is %d ",getpid()); //fgets每次读取一行,不能用if while(fgets(buffer,MAXLINE,fp)!=NULL)//读取成功 fputs(buffer,stdout);//输出到屏幕 pclose(fp); exit(0); }
fgets用法
char *fgets(char *buf, int bufsize, FILE *stream);
stream文件流指针体指向文件内容地址的偏移原则
如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上‘
‘),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。
而如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的‘
‘换行,一个保存字符串本身的结束标识‘ ‘),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
用write输出的时候文件指针不会偏移。
例:
如果一个文件的当前位置的文本如下
Love, I Have
Since you can do it.
如果用fgets(str1,6,file1);去读取
则执行后str1 = "Love," ,读取了6-1=5个字符
这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have
"
而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的‘
‘,并自动加上字符串结束符‘ ‘),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。
fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加‘ ‘,并以str作为函数值返回。
以上是关于popen的主要内容,如果未能解决你的问题,请参考以下文章
查找 subprocess.Popen python 的执行时间
Subprocess.Popen:将 stdout 和 stderr 克隆到终端和变量