码迷,mamicode.com
首页 > 其他好文 > 详细

popen

时间:2018-10-14 16:56:50      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:程序   targe   man   pip   str   标准输出   命令   管道   标准   

函数原型

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]==\n)//去除fgets尾的换行
        --len;
    
    //把cat与路径名相连 shell命令
    snprintf(command,sizeof(command),"ls %s",buffer);
    //创建一个子进程,子进程执行command命令,子进程的输出输入到父进程的输入
    FILE *fp=popen(command,"r");
    
    //printf("pid is %d\n",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个字符(算上‘\n‘),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。
而如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的‘\n‘换行,一个保存字符串本身的结束标识‘\0‘),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行
用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\n"
而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的‘\n‘,并自动加上字符串结束符‘\0‘),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。
 
 
fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加‘\0‘,并以str作为函数值返回。

popen

标签:程序   targe   man   pip   str   标准输出   命令   管道   标准   

原文地址:https://www.cnblogs.com/tianzeng/p/9786023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!