精华内容
下载资源
问答
  • popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。这篇文章重点给大家介绍Linux中popen函数的作用,感兴趣的朋友一起看看吧
  • popen函数

    2020-11-26 21:05:16
    popen函数 函数原型: FILE * popen(conste char * command, const char * type); 函数说明:popen()会调用fork()生成子进程,在子进程中调用/bin/sh -c来执行参数command的指令,command对应的指令与在终端命令行...

    popen函数

    函数原型:

    FILE * popen(conste char * command, const char * type);
    

    函数说明:popen()会调用fork()生成子进程,在子进程中调用/bin/sh -c来执行参数command的指令,command对应的指令与在终端命令行中输入的命令相似如:“ls - l”、"/tmp/load_usb.sh"等

    参数:
    type:可使用“r”或者"w",分别代表读取及写入,但由于popen是以创建管道的方式创建进程连接到子进程的标准输出设备或标准输入设备,因此其带有管道的一些特性,同一时刻只能定义为写或者读。

    command:如其名,单纯是一个命令字符串指针。

    返回值:文件指针,函数执行成功返回文件指针,否则返回NULL。

    在使用我们可以使用popen函数运行开机初始化设备时所需要加载的驱动脚本,比如:

    #include <stdio.h> 
    int  main(int argc, char *argv[]) 
    { 
        FILE * fp; 
        char buffer[1024];
        
        sprintf(buffer, "/customer/sys_ko/load.sh");
        fp = popen(buffer, "r"); 
        pclose(fp); 
        
        return 0;
    }
    

    执行此程序后系统会执行/customer/sys_ko/目录下的脚本文件load.sh

    展开全文
  • 在win或linux下编写程序,在程序代码中想要通过执行命令的方式,获取一些信息,可以使用popen函数来实现。 一、在Win下的_popen()函数 在win下该函数,定义如下: FILE *_popen( const char *command, const char *...

    在win或linux下编写程序,在程序代码中想要通过执行命令的方式,获取一些信息,可以使用popen函数来实现。

    一、在Win下的_popen()函数

    在win下该函数,定义如下:

    FILE *_popen( const char *command, const char *mode );
    

    功能: 创建管道并执行命令,管道的另一端与标准输入或标准输出相关联,并返回与管道相关联的流。

    参数: command,需要执行的命令;mode,有如下4种选项:

    • “r”,可以对返回的流进行读取

    • “w”,可以对返回的流进行写入

    • “b”,以二进制模式打开

    • “t”,以文字模式开启

    执行命令,并读取执行结果,示例代码:

    #include <QCoreApplication>
    #include <QFile>
    #include <QDebug>
    
    bool execCmd(const QString &cmd, QString &result)
    {
        // 执行命令
        FILE *fp = _popen(cmd.toStdString().c_str(), "r");
        if (!fp)
        {
            return false;
        }
    
        // 读取结果
        QFile file;
        file.open(fp, QIODevice::ReadOnly);
        result = file.readAll();
        file.close();
    
        _pclose(fp);
        return true;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QString result;
        execCmd("wmic cpu get Name", result);
        qDebug() << result;
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    二、在Linux下的popen()函数

    在linux下该函数,定义如下:

    FILE *popen( const char *command, const char *type );
    

    功能: popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。

    参数: command,需要执行的命令;type,参数type可使用“r”代表读取,“w”代表写入。

    执行命令,并读取执行结果,示例代码:

    #include <QCoreApplication>
    #include <QFile>
    #include <QDebug>
    
    bool execCmd(const QString &cmd, QString &result)
    {
        // 执行命令
        FILE *fp = popen(cmd.toStdString().c_str(), "r");
        if (!fp)
        {
            return false;
        }
    
        // 读取结果
        QFile file;
        file.open(fp, QIODevice::ReadOnly);
        result = file.readAll();
        file.close();
    
        pclose(fp);
        return true;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QString result;
        execCmd("cat /etc/issue", result);
        qDebug() << result;
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    三、总结

    其实在win和linux下这2个函数,使用上没什么太大区别。

    为了更好地跨平台,执行命令,我们可以把这个函数进行一些封装,代码如下。

    CommandExecutor.h:

    #ifndef COMMANDEXECUTOR_H
    #define COMMANDEXECUTOR_H
    
    #include <QStringList>
    
    class CommandExecutor
    {
    public:
        static bool exec(const QString &cmd); // 执行命令,不返回结果字符串
        static bool exec(const QString &cmd, QString &result); // 执行命令,返回结果字符串
        static bool exec(const QString &cmd, QStringList &multiLineResult); // 执行命令,按多行,返回结果字符串
    };
    
    #endif // COMMANDEXECUTOR_H
    

    CommandExecutor.cpp:

    #include "CommandExecutor.h"
    #include <QFile>
    
    bool CommandExecutor::exec(const QString &cmd)
    {
    #ifdef WIN32
        FILE *fp = _popen(cmd.toStdString().c_str(), "r");
    #else
        FILE *fp = popen(cmd.toStdString().c_str(), "r");
    #endif
    
        if (!fp)
        {
            return false;
        }
    
    #ifdef WIN32
        _pclose(fp);
    #else
        pclose(fp);
    #endif
        return true;
    }
    
    bool CommandExecutor::exec(const QString &cmd, QString &result)
    {
    #ifdef WIN32
        FILE *fp = _popen(cmd.toStdString().c_str(), "r");
    #else
        FILE *fp = popen(cmd.toStdString().c_str(), "r");
    #endif
    
        if (!fp)
        {
            return false;
        }
    
        QFile file;
        file.open(fp, QIODevice::ReadOnly);
        result = file.readAll();
        file.close();
    
    #ifdef WIN32
        _pclose(fp);
    #else
        pclose(fp);
    #endif
        return true;
    }
    
    bool CommandExecutor::exec(const QString &cmd, QStringList &multiLineResult)
    {
    #ifdef WIN32
        FILE *fp = _popen(cmd.toStdString().c_str(), "r");
    #else
        FILE *fp = popen(cmd.toStdString().c_str(), "r");
    #endif
    
        if (!fp)
        {
            return false;
        }
    
        QFile file;
        file.open(fp, QIODevice::ReadOnly | QIODevice::Text);
        while (!file.atEnd())
        {
            QString line = file.readLine();
            multiLineResult.append(line);
        }
        file.close();
    
    #ifdef WIN32
        _pclose(fp);
    #else
        pclose(fp);
    #endif
        return true;
    }
    

    然后在工程中,需要执行命令的话,直接调用CommandExecutor类就可以了。



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    在这里插入图片描述

    展开全文
  • popen函数允许一个程序将另一个程序作为新进程启动,并可以传递数据给它或者通过它接收数据。command字符串是要运行的程序名和相应参数(比如:ls或ls -l),openmode必须是 r 或w。如果是r,被调用程序的输出可以被...
  • C语言:popen函数的使用

    千次阅读 2020-03-25 14:53:21
    C语言:popen函数的使用 一、利用system函数调用shell命令,只能获取到shell命令的返回值,而不能获取shell命令的输出结果,那如果想获取输出结果怎么办呢?用popen函数可以实现。 二、定义函数:FILE * popen...

     

                                 C语言:popen函数的使用

     

    一、利用system函数调用shell命令,只能获取到shell命令的返回值,而不能获取shell命令的输出结果,那如果想获取输出结果怎么办呢?用popen函数可以实现。

     

    二、定义函数:FILE * popen(const char * command, const char * type);

          函数说明:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c 来执行参数command 的指令。

          参数type 可使用 "r"代表读取,"w"代表写入。依照此type 值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。

    此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

          返回值:若成功则返回文件指针, 否则返回NULL, 错误原因存于errno 中.

    三、实例测试

    1、popen.c

    #include "stdio.h"
    #include "stdlib.h"
    
    int popen_system(const char * cmd, char *pRetMsg, int msg_len)
    {
    	printf("\n\n________%s %d  cmd=%s\n", __func__, __LINE__,cmd);
    	FILE * fp;
    	char * p = NULL;
    	int res = -1;
    	if (cmd == NULL || pRetMsg == NULL || msg_len < 0)
    	{
    		printf("Param Error!\n");
    		return -1;
    	}
    	if ((fp = popen(cmd, "r") ) == NULL)
    	{
    		printf("Popen Error!\n");
    		return -2;
    	}
    	else
    	{
    		memset(pRetMsg, 0, msg_len);
    		//get lastest result
    		while(fgets(pRetMsg, msg_len, fp) != NULL)
    		{
    			printf("Msg:%s",pRetMsg); //print all info
    		}
     
    		if ( (res = pclose(fp)) == -1)
    		{
    			printf("close popenerror!\n");
    			return -3;
    		}
    		//pRetMsg[strlen(pRetMsg)-1] = '\0';
    		pRetMsg[strlen(pRetMsg)] = '\0';
    		return 0;
    	}
    }
    
    void popen_read(const char*cmd)
    {
    	printf("\n\n________%s %d  cmd=%s\n", __func__, __LINE__,cmd);
        FILE *fp;
        char buf[200] = {0};
        if((fp = popen(cmd, "r")) == NULL) {
              perror("Fail to popen\n");
              exit(1);
        }
        while(fgets(buf, 200, fp) != NULL) {
         printf("%s", buf);
        }
        pclose(fp);
    }
    
    void popen_write(const char*cmd)
    {
    	printf("\n\n________%s %d  cmd=%s\n", __func__, __LINE__,cmd);
        FILE *fp;
        char buf[200] = {0};
        if((fp = popen(cmd, "w")) == NULL) {
        perror("Fail to popen\n");
        exit(1);
        }
        fwrite("Read pipe successfully !", 1, sizeof("Read pipe successfully !"), fp);
        pclose(fp);
    }
    
    
    int main()
    { 
        char *cmd = "who ";
        char a8Result[128] = {0};
        int ret = 0;
    	int i=0;
    	
    	memset(a8Result, 0, strlen(a8Result));
        ret=popen_system(cmd, a8Result, sizeof(a8Result));
        printf("ret = %d a8Result = %s length = %d   \n", ret, a8Result, strlen(a8Result));
    	popen_read("./return");
        popen_read("pwd");
        popen_read("touch hellop.txt");
        popen_write("cat > test1");//
      return 0;
    }

    2、编译&执行

    展开全文
  • popen函数和system函数详解

    万次阅读 2018-03-27 22:58:25
    1、popen函数 我们先用man指令查一下popen函数: 函数说明: (1)popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。 (2)参数type可使用“r”代表读取,“w”代表写入...

    1、popen函数

    我们先用man指令查一下popen函数:
    这里写图片描述
    函数说明:
    (1)popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。
    (2)参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。
    (3)此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
    (4)如果 type 为 r,那么调用进程读进 command 的标准输出。
    如果 type 为 w,那么调用进程写到 command 的标准输入。
    返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
    **注意:**popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。
    具体实例:

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 int main()
      4 {
      5      FILE *fp;
      6     char buffer[80];
      7     fp = popen("cat /etc/passwd", "r");
      8     fgets(buffer, sizeof(buffer), fp);
      9     printf("%s", buffer);
     10     pclose(fp);
     11 }
    

    运行结果:
    这里写图片描述

    2、system函数

    这里写图片描述
    函数解释:
    system()函数先fork一个子进程,在这个子进程中调用/bin/sh -c来执行command指定的命令。/bin/sh在系统中一般是个软链接,指向dash或者bash等常用的shell,-c选项是告诉shell从字符串command中读取要执行的命令(shell将扩展command中的任何特殊字符)。父进程则调用waitpid()函数来为变成僵尸的子进程收尸,获得其结束状态,然后将这个结束状态返回给system()函数的调用者。
    返回值:
    (1)当参数command是NULL的时候
    在参数为NULL的情况下,system函数的返回值很简单明了,只有0和1。
    返回1,表明系统的命令处理程序,即/bin/sh是可用的。
    相反,如果命令处理程序不可用,则返回0。
    (2)当参数command不是NULL的时候
    当参数不为NULL的时候,情况有些小复杂,根据APUE这里可以分为以下三种情况:
    1)如果fork等系统调用失败,或者waitpid函数发生除EINTR外的错误时,system返回-1
    2)一切致使execl失败的情况下,system返回127
    3)除此之外,system返回/bin/sh的终止状态
    system源码:

    int system(const char * cmdstring)
    {
    pid_t pid;
    int status;
    
    if(cmdstring == NULL){
    
         return (1);
    }
    
    
    if((pid = fork())<0){
    
            status = -1;
    }
    else if(pid == 0){
        execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
        -exit(127); //子进程正常执行则不会执行此语句
        }
    else{
            while(waitpid(pid, &status, 0) < 0){
                if(errno != EINTER){
                    status = -1;
                    break;
                }
            }
        }
        return status;
    

    }

    当system接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl(“/bin/sh”, “sh”, “-c”, cmdstring,(char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。

    展开全文
  • python的popen函数

    千次阅读 2019-04-18 11:49:02
    最近了解了一下python的popen函数的使用,主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd) 返回值: 返回一个文件句柄 import os cmd="/sbin/partx /dev/sdb" result_...
  • Linux中的popen()函数可以在程序中执行一个shell命令,并返回命令执行的结果。有两种操作模式,分别为读和写。在读模式中,程序中可以读取到命令的输出,其中有一个应用就是获取网络接口的参数。在写模式中,最常用...
  • 一、system函数 system()函数的返回值如下: 成功,则返回进程的状态值; 当sh不能执行时,返回127;失败返回-1; 为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作...
  • Linux编程使用popen函数

    2019-05-07 14:28:50
    在Linux环境下,在编写程序时,使用popen()函数执行系统中的命令,并将获取的结果放在程序中使用。 不要忘记最后执行pclose()。 函数的原型在文件/usr/include/stdio.h中 /** * Linux */ #include <stdio.h>...
  • popen():进程I/O函数,与pclose函数一起使用。 1.1函数定义: FILE * popen ( const char * command , const char * type ); int pclose ( FILE * stream ); 1.2包含头文件: #include<stdio.h> 1.3...
  • popen函数代替system函数

    千次阅读 2018-04-27 16:46:02
    system()函数的原型为: int system(const char *command); 函数的返回值表示system()函数调用的执行结果,成功返回0,失败返回-1并设置errno为错误代码。需要注意的是该函数并不能获取command命令的执行结果。 ...
  • 其实是封装后的exec,函数源代码在子进程调用exec函数,system使用更加简单,用法就是将./ 和后的内容(要执行的指令)放进代码中去。和exec不同的是,它运行完后还会返回到原来的代码处 比如: #include<stdio.h...
  • 一、函数介绍 1.1 函数原型: #include <stdio.h> FILE *popen(const char *command,const char *open_mode); 1.2 说明 popen函数允许一个程序将另一个程序作为新进程启动,并可...
  • make编译提醒我没有对popen函数进行声明。 ``` [root@iZ2ze2y6fwj9mvujtsiya4Z test_mem]# make gcc -c systeminfo.c systeminfo.c: In function ‘get_cpu_info’: systeminfo.c:56:10: warning: assignment...
  • Linux C 中popen函数使用

    2020-09-09 11:00:42
    #include <unistd.h> #include <stdlib.h> #include <...* FILE *popen(const char *command, const char *type); * * int pclose(FILE *stream); * * 功能: * 以创建管道的方式启动一个
  • 说在前面:在实际编程中尽量减少使用system函数。 int system(const char *command); 说明: system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回。在执行该命令期间,SIGCHLD将被阻塞,...
  • popen 函数 函数原型 #include &lt;stdio.h&gt; FILE *popen(const char *command, const char *type); command : 一个指向以 NULL 结尾的 shell 命令字符串的指针。这个字符串会使用 -c 标志传到 bin...
  • 一、popen函数 ** 我们先用man指令查一下popen函数 函数说明: (1)popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。 (2)参数type可使用“r”代表读取,“w”代表写入。...
  • linux popen函数

    2017-06-09 23:20:24
    popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也相应的 是只读 或者 只写. command 参数
  • Linux C popen()函数详解 表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen()会调用fork()产生子...

空空如也

空空如也

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

popen函数