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 的执行时间

子进程冻结 popen().stdout.read

python关闭 os.popen()的方法

Subprocess.Popen:将 stdout 和 stderr 克隆到终端和变量

python subprocess.popen stdin.write

中断调用函数 popen 的进程