精华内容
下载资源
问答
  • linuxpopenopen、fopen

    2021-02-19 14:02:33
    linuxpopenopen、fopen 1,popen:每次fread都要重新做popen,否则值不刷新。 char bat_vol_get[16] = {0}; char bat_percentage_get[16] = {0}; while(1) { sleep(3); FILE *fd_vol = popen("cat /...

    1,popen:每次fread都要重新做popen,否则值不刷新。

         //linux在应用层输出设备节点值日志
         
         char bat_vol_get[16] = {0};
         char bat_percentage_get[16] = {0};
         
         while(1)
         {
             sleep(3);
             
             FILE *fd_vol = popen("cat /sys/class/power_supply/battery/voltage_now", "r");
             FILE *fd_per = popen("cat /sys/class/power_supply/battery/capacity", "r");     
             
             fread(bat_vol_get, 1, 15, fd_vol);
             fread(bat_percentage_get, 1, 15, fd_per);
              
             printf("bat_vol_get=%s", bat_vol_get);   
             printf("bat_percentage_get=%s", bat_percentage_get);
    
             pclose(fd_vol);
             pclose(fd_per);
         }
    

    2,open:open一次后每次read都能获取到刷新的值。

        int fd = 0;
        char result[2] = {0};	
        unsigned char value = 0;
        
    	fd = open("/dev/ds18b20", O_RDONLY);
    	if (fd < 0) 
    	{
    		SYS_INFO("open /dev/ds18b20 failed with %s!\n", strerror(errno));
    		return;
    	}
    	
        read(fd, &result, sizeof(result));	//读到的是字符串
        value = atoi(result);               //将字符串转化为int类型
        
        close(fd);
    
    展开全文
  • Linux popen和pclose函数

    2016-11-21 16:02:15
    popen和pclose 头文件 #include 函数原型 FILE *popen(const char *command, const char *type); int pclose(FILE *stream); 参数 command执向想要执行的指令,type可使用"r"代表读取,"w...

    popen和pclose


    头文件

    #include <stdio.h>

    函数原型

    FILE *popen(const char *command, const char *type);
    int pclose(FILE *stream);

    参数

    command执向想要执行的指令,type可使用"r"代表读取,"w"代表写入。r时文件指针连接到标准输出,w时文件指针连接到标准输入。

    说明

    popen函数本身会调用fork()产生子进程,然后从子进程中调用   /bin/sh -c   来执行参数command的指令。根据参数type的值,popen函数会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。之后此进程可以通过此文件指针来读取子进程的输出或写入子进程的标准输入设备中。
    pclose函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。


    unix环境高级编程的例子

    #include <sys/wait.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define PAGER "${PAGER:-more}"
    #define MAXLINE 100
    
    int main(int argc, char *argv[])
    {
    	char line[MAXLINE];
    	FILE *fpin, *fpout;
    
    	if(argc != 2)
    	{
    		printf("usage: a.out <pathname>\n");
    		exit(1);
    	}
    
    	if((fpin = fopen(argv[1], "r")) == NULL)
    	{
    		printf("can't open %s", argv[1]);
    		exit(1);
    	}
    	if((fpout = popen(PAGER, "w")) == NULL)
    	{
    		printf("popen error\n");
    		exit(1);
    	}
    
    	while(fgets(line, MAXLINE, fpin) != NULL)
    	{
    		if(fputs(line, fpout) == EOF)
    		{
    			printf("fputs error to pipe\n");
    			exit(1);
    		}
    	}
    
    	if(ferror(fpin))
    	{
    		printf("fgets error\n");
    		exit(1);
    	}
    	if(pclose(fpout) == -1)
    	{
    		printf("pclose error\n");
    		exit(1);
    	}
    	exit(0);
    }


    展开全文
  • open 函数(打开一个文件) 与 read, write 等配合使用 1.1包含头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 1.2函数原型 int open(const char *pathname, int ...

    open 函数(打开一个文件)


    与 read, write 等配合使用
    1.1包含头文件
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    1.2函数原型
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);

    open函数返回一个文件描述符,一个小的非负整数,后面操作这个文件时就用这个文件描述符。

    1.3函数参数讲解
    int open(const char *pathname, int flags);

    const char *pathname :路径名,是一个字符串
           int flags:
                 O_RDONLY   1 只读打开
                 O_WRONLY   2 只写打开
                 O_RDWR    4 读写打开

    如果open打开一个文件的时候,没有该文件,那么应该使用一下函数
    int open(const char *pathname, int flags, mode_t mode);

    示例
    open("./file",O_RDWR|O_CREAT,0600);
    如果没有file文件,加上(|O_CREAT),创建文件,并且给文件权限,第三个参数就是权限,这里我们系=写0600,为可读可写。

    例如:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <errno.h>
    
    
    int main()
    {
            int fd;//文件描述符,int类型
            fd = open("./file",O_RDWR);
    
            if(fd = -1) //文件创建成功,返回非负整数
            {
                    perror("why:");//打印出错原因
                    fd = open("./file",O_RDWR|O_CREAT,0600);//如果没有该文件,创建文件并且权限为0600(可读可写);
                    if(fd > 0)
                    {
                            printf("file creat successful,fd=%d \n",fd);
                    }
            }
    
            return 0;
    }
    
    

    write函数
    函数原型:ssize_t write(int fd,const void* buf,size_t count);

    函数说明:write()会把参数buf所指向的内存写入count个字节放到参数所指向的文件里。如果成功写入会返回实际写入的字节数,当有错误发生时则返回-1,错误代码存放在error中。

    参数解释:

    fd:是文件描述符,write所对应的是写,即就是1号文件描述符(对应标准输出)
    buf:通常是一个字符串,需要写入的字符串
    count:每次写入的字节数
    说明:write函数返回值一般无0,只有当如下情况发生时才会返回0:write(fd,p1+len,(strlen(p1)-len))中第三个参数为0,此时write函数说明也不做,只返回0.write函数从buf写数据到fd中,若buf中数据无法一次性读完,那么第二次读buf中的数据时,其读指针位置,即第二个参数buf不会自动移动,需要程序员编程控制。但并不是简单的将buf首地址填入第二个参数,可以按如下格式实现读位置移动:write(fd,p1+len,(strlen(p1)-len)),这样write第二次循环时就会从p1+len处写数据到fd,后面以此类推,直至strlen(p1)-len的值变为0.

     

    read函数

    函数原型:ssize_t read(int fd ,void *buf, size_t count);

    函数说明:read函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中。返回值为实际读取到的字节数,如果返回0表示已经到达文件末尾或是无可读取的数据。若参数count为0,则read函数不会有作用并返回0.

    参数解释:

    fd:是文件描述符
    buf:为读出数据的缓冲区
    count:为每次读取的字节数(是请求读取的字节数,读上来的数据保 存在缓冲区buf中,同时文件的当前读写位置向后移)
    注意:read函数参数中fd所指向的文件中的数据如果小于要读取的数据就会引起阻塞。

       #include<stdio.h>
       #include<sys/stat.h>
       #include<sys/types.h>
       #include<fcntl.h>
       #include<string.h>
       #include<unistd.h>
       
       int main()
       {
         umask(0);
        int fd = open("myfile",O_WRONLY|O_CREAT,0644);
        if(fd < 0)
         {
             perror("open");
             return 1;
         }
         const char *msg = "hello world";
         write(fd,msg,strlen(msg));//将msg指针指向的内容写进fd文件描述符所对应的文件中,即写进myfile中
         char buf[1024];
         ssize_t s = read(fd,buf,strlen(msg)); //将fd所指向的文件中的内容读进buf所指向的内存中                                         
         if(s > 0)
         {
             printf("%s",buf);
        }
        return 0;
    }
     
     
     

    fopen函数
    与 fread, fwrite等配合使用。


    1.1包含头文件
    include <stdio.h>

    1.2函数原型
    FILE *fopen(const char *pathname, const char *mode);
    fopen函数返回一个文件指针。

    1.3函数参数讲解
    filename :文件名称
    mode 打开模式:
    r   只读方式打开一个文本文件
    w   只写方式打开一个文本文件
    r+   可读可写方式打开一个文本文件
    w+   可读可写方式创建一个文本文件

    fread和fwrite函数
    size_t fread(void *buf, size_t size, size_t count, FILE *fp);

    size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);

    ptr为指向缓冲区保存或读取的数据。
    size为控制记录大小。
    nmemb为记录数。
    fp函数返回读取或回写的记录数。


    即 fread 函数从文件 fp 中读出“size*count”个字节保存到 buf 中,而 fwrite 把 buf 中的“size*count”个字节写到文件 fp 中。最后,函数 fread 和 fwrite 的返回值为读或写的记录数,成功时返回的记录数等于 count 参数,出错或读到文件末尾时返回的记录数小于 count,也可能返回 0。需要注意的是,尽管 fread 和 fwrite 函数可以对数据进行成块读写,但并不是说一次想读写多少数据就能全部读写多少数据,毕竟缓存有限,而且不同的操作系统的缓存大小也可能不一样。

    用法差异
    效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。
    读取文件差别:fread功能更强大,可以的结构体的二进制文件。如果底层的操作,用到文件描述符,用read更好。
     

    popen函数(与system函数类似)

    popen函数可以获取系统指令执行的输出结果。
    system函数直接在终端执行指令 ,数据会流失。

    函数原型

    FILE *popen(const char *command, const char *type);
    参数const char *command要使用的命令
    参数type可使用“r”代表读取,“w”代表写入。
    例如:

    #include <stdio.h>
    
    
    int main()
    {
            char ret[1024] = {'\0'};
            FILE *fp;
            int n_read=0;
            fp = popen("ps","r");
            n_read = fread(ret,1,1024,fp);
            printf("n_read = %d ret =\n %s \n",n_read,ret);
    
            return 0;
    }
    
    

    popen函数会将指令执行结果会流到 popen函数开辟的管道fp里面去,后面就可以用fread,fwrite函数对执行结果进行操作。

    展开全文
  • 简单说一下popen()函数 函数定义 #include FILE * popen(const char *command , const char *type ); int pclose(FILE *stream); 函数说明  popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个...
  • Linux下进行编写程序的时候,如果需要执行一段脚本,并且需要获取脚本执行的结果,按么最好使用popen。下面就举一个例子:c代码文件为: 3.C,内容如下:#include #include #include #include #include #include ...

    在Linux下进行编写程序的时候,如果需要执行一段脚本,并且需要获取脚本执行的结果,按么最好使用popen。下面就举一个例子:

    c代码文件为: 3.C,内容如下:

    #include  

    #include

    #include  

    #include  

    #include  

    #include

    typedef struct tag_Result

    {

    char filename[100];

    int filesize;

    tag_Result()

    {

    filename[0] = '0';

    filesize    = 0;

    }

    }RESULT,*LPRESULT;

    int   WriteFile(const   char   *filename,const   char   *pFile,const   int   nLen)

    {

    FILE   *stream=NULL;

    stream=fopen(filename,"w+");

    if(stream==NULL)

    {

    perror("Open   file   error");

    return   -1;

    }

    if(fwrite((void   *)pFile,1,nLen,stream)!=nLen)

    {

    perror("Write   file   error");

    fclose(stream);

    return   -1;

    }

    fclose(stream);

    return   0;

    }

    int   main()

    {

    RESULT res;

    FILE   *pStream = NULL;

    char   buf[4096]={""};

    char dddd[10]={""};

    char cccc[100]={""};

    pStream=popen("a","r");

    if(pStream)

    {

    fscanf(pStream,"%[^';'];%[^';'];%s",res.filename,cccc,dddd);

    cout<

    cout<

    res.filesize = atoi(dddd);

    cout<

    sprintf(buf,"%s,%d",res.filename,res.filesize);

    WriteFile("result.txt",buf,strlen(buf));

    pclose( pStream);

    }

    else

    {

    cout<

    }

    return 1;

    }

    要执行的脚本名称为a,脚本内容为:

    #!/bin/sh

    #filename: a

    fileinfo=11

    rm fileinfo #>/dev/null 2>

    echo -n $fileinfo";" >> fileinfo

    echo -n $fileinfo";" >> fileinfo

    ls -l $fileinfo | awk '{print $5 }' >> fileinfo

    cat fileinfo

    通过:g++ -o 11 3.C  编译c代码生成可执行文件为:11,直接执行11,就可以查看到结果.

    1.问题1: 如果脚本a在第3行的时候,直接就通过exit 1返回了,那么通过popen打开执行这个脚本会出现什么结果呢?

    如果脚本直接返回,相当于脚本没有向popen打开的文件中写入任何数据,也就是说popen相当于打开了一个空文件.

    2.问题2: popen打开的文件中获取的是什么数据?

    获取的就是脚本输出到标准输出的数据。0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • fopen、open和popen区别

    千次阅读 2015-01-28 10:11:32
    open:直接操作物理设备,比如磁盘、设备文件 一般设备/设备文件都通过open来操作  fopen:则通过缓冲区来操作,读写都在缓冲区上  popen:会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command...
  • windows 的_popen,与linuxpopen对应

    千次阅读 2019-05-28 10:03:02
    Run-Time Library Reference ..._popen, _wpopen Creates a pipe and executes a command. FILE *_popen( const char *command, const char *mode ); FILE *_wpopen( const wchar_t *command, c...
  • 1. system()和popen()简介 在linux中我们可以通过system()来执行一个shell命令,popen()也是执行shell命令并且通过管道shell命令进行通信。 system()、popen()给我们处理了fork、exec、waitpid等一...
  • Linux的system()和popen()差异

    万次阅读 2015-07-25 22:06:33
    Linux的system()和popen()差异1. system()和popen()简介在linux中我们可以通过system()来执行一个shell命令,popen()也是执行shell命令并且通过管道shell命令进行通信。 system()、popen()给我们处理了fork、exec...
  • Linux系统编程】system()与popen()函数 1.system()函数 system()函数exec函数族一样,同样可以在程序中用以执行其他程序。如果查看system()函数源码,其实现机制同样还是调用了execl()函数。 system()函数...
  • popen和pclose

    2019-03-27 12:48:34
    最简单的两个程序之间传递数据的方法就是使用popen和pclose 函数,原型如下: #include<stdio.h> FILE *popen(const char *command,const char *open_mode); in pclose(FILE *stream_to_close); 1、popen...
  • 转载地址:https://blog.csdn.net/liuxingen/article/details/470575391. system()和popen()简介在linux中我们可以通过system()来执行一个shell命令,popen()也是执行shell命令并且通过管道shell命令进行通信。...
  • error: implicit declaration of function ‘popen’; did you mean ‘fopen’? [-Werror=implicit-function-declaration] error: implicit declaration of function ‘pclose’; did you mean ‘fclose’? [-...
  • 在win或linux下编写程序,在程序代码中想要通过执行命令的方式,获取一些信息,可以使用popen函数来实现。 一、在Win下的_popen()函数 在win下该函数,定义如下: FILE *_popen( const char *command, const char *...
  • linux 关闭popen 打开的命令

    千次阅读 2016-08-05 21:06:01
    关闭了管道,但是命令进程还是存在着,最后通过修改popen , pclose 函数源码自己实现结束进程来完成。 修改后的函数如下,在pclose 中添加了kill #define SHELL "/bin/bash" static pid_t *childpid=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,648
精华内容 3,459
关键字:

linuxpopen和open

linux 订阅