#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 来执行参