#include <cstdio>       // popen, printf, snprintf
#include <sys/wait.h>   // WIFEXITED() WEXITSTATUS()
#include <errno.h>      // extern int errno;
#include <string>
#include <cstring>
#include <cstdlib>
#include <cassert>
#define MAX_SIZE (1024)
bool exec_cmd(const char* command, std::string& errmsg)
    assert(command);
    char buffer[MAX_SIZE] = {'\0'};
    std::string final_msg;
    // the exit status of the command.
    int rc = 0; 
    // I/O redirection. 
    char cmd[MAX_SIZE] = {'\0'};
    snprintf(cmd, sizeof(cmd), "%s 2>&1", command);
    FILE *fp = popen(cmd, "r");
    if(NULL == fp)
    {   // if fork(2) or pipe(2) calls fail, or cannot callocate memory.
        // it does not set errno if memory allocation fails.
        // if the underlying fork(2) or pipe(2) fails, errno is set
        // appropriately.
        // if the type arguments is invalid, and this condition is detected,
        // errno is set to EINVAL.
        snprintf(buffer, sizeof(buffer), 
                "popen failed. %s, with errno %d.\n", strerror(errno), errno);
        final_msg = buffer;
        errmsg = final_msg.c_str();
        return false;
    char result[MAX_SIZE] = {'\0'};
    std::string child_result;
    while(fgets(result, sizeof(result), fp) != NULL)
        // remove the '\n' to make output more beautiful
        if('\n' == result[strlen(result)-1])
            result[strlen(result)-1] = '\0';
        snprintf(buffer, sizeof(buffer),
                "[%s]: %s \r\n", command, result);
        child_result += buffer;
    // waits for the associated process to terminate and returns 
    // the exit status of the command as returned by wait4(2).
    rc = pclose(fp);
    if(-1 == rc)
    {   // return -1 if wait4(2) returns an error, or some other error is detected.
        // if pclose cannot obtain the child status, errno is set to ECHILD.
        final_msg += child_result;
        if(ECHILD==errno) {
            final_msg += "pclose cannot obtain the child status.\n";
        else {
            snprintf(buffer, sizeof(buffer),
                    "Close file failed. %s, with errno %d.\n", strerror(errno), errno);
            final_msg += buffer;
        errmsg = final_msg.c_str();
        return false;
    // TODO: warning 'file descriptor leaked
#if 0
    if(WIFEXITED(rc)!=0) {
        printf("maybe cause file descriptor leaked.\n");
#endif
    // child process exit status.
    int status_child = WEXITSTATUS(rc);
    // the success message is here.
    final_msg += child_result;
    snprintf(buffer, sizeof(buffer),
            "[%s]: command exit status [%d] and child process exit status [%d].\r\n",
            command, rc, status_child);
    final_msg += buffer;
    errmsg = final_msg.c_str();
    if(status_child==0) { 
        // child process exits SUCCESS.
        return true;
    else {  
        // child process exits FAILED.
        return false;
bool getCmdPath(const char* cmd, String& path)
    if (cmd == NULL || strlen(cmd) == 0)
        return false;
    string command = "which ";
    command += cmd;
    FILE* pf = popen(command.c_str(), "r");
    if (pf) {
        char buf[100];
        memset(buf, '\0', sizeof(buf));
        fgets(buf, sizeof(buf), pf);
        pclose(pf);
        //return the path
        path = buf;
        return true;
    } else {
        return false;

调用popen函数,执行shell 命令,并输出错误信息。

从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值。 subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.* 一、subprocess.Popen subprocess模块定义了一个类: Popen class subprocess.Popen( args, bufsize=0, executable=None, stdin=None, stdout=None, stderr= 在Linux中,我使用“pidof process_name”命令打开管道,然后使用fgets函数读取输出,从而找到进程的pid。但它偶尔会发现一次失败。以下是我的代码,用于查找我的流程的pid。使用popen函数读取命令输出失败int FindPidByProcessName(char *pName){int pid = -1;char line[30] = { 0 };char buf[64]... 先简单的解释一下popen函数吧~popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。type 参数只能是读或者写中的...... 队上配套的送钻电机,ACS800-01型变频器,一上电即报ENCODER ERR(7301)故障,根据队上反馈,该问题已经存在了好几年了。由于考虑到送钻电机的悬停功能,为了电机控制更加精准,建议对编码器问题进行处理。根据队上的反馈,前面厂家人员上井时对编码器进行过检查,得到的答复是该类型的编码器已经停产,找不到货源,因此并未对该问题进行处理。变频器面板上出现该报警后,变频器仍旧可以运行,... 文章目录前言一、JavaScript简介1.JavaScript是什么?2.JavaScript的特点3.JavaScript的三大核心4.JavaScript能做些什么?二、JavaScript文件引入方式1. 行内导入方式(不推荐,不安全)2. 内嵌式3. 外链式4. 注意点三、JavaScript中常用的输入输出语句四、JavaScript的数据类型五、JavaScript的数据类型转换1.把数值转换为字符串2.把字符串转换为数值3.其他简单数据类型转布尔型六、JavaScript的判断语句七、Jav 通过查看 man 手册知道,成功执行时,文件流会输出到标准输出,但似乎没提到错误的情况,那这个错误会不会输出到标准出错上了呢?如果是的话,那它应该也是输出到标准输出了啊,这里为什么拿不到结果呢?但又想到,如果popen()执行出错,信息输出到标准出错的话,那我们是不是可以重定向,把标准出错重定向到标准输出呢?最近在调试代码的时候,发现一个问题,在CentOS 服务器调试好好的代码,结果到了嵌入式上,居然出现异常了,因为有些命令在嵌入式设备上被裁掉了。可以看出,程序执行的结果和命令执行的结果是一样的。 相关函数 pipe, mkfifo, pclose, fork, system, fopen 头文件 #include <stdio.h> 定义函数 FILE * popen(const char * command, const char * type); 函数说明 popen()会调用 fork()产生子进程, 然后从子进程中调用/bin/sh -c 来执行参