execvp:在程序中调子程序并获取返回值

在linux中我们可以很方便的使用system启动子程序,但是system有个不足就是它对子程序的掌控很弱,连返回数值都很难获取。

下面是一段使用execvp来调用子程序的示例代码,关于下面的代码有几点特殊说明:

1)  folk(): 会从主程序中复制出一个新的程序,如果folk返回0就是子程序,否则那就是还是当前的程序。

2)  wait() : 在主程序中你可以自己决定要等待子程序返回才继续运算这样保持同步还是异步的不等子程序的结果就继续往下运行。

3)  WEXITSTATUS: 用来获取子程序的返回值

4) freopen: 默认情况下子程序的log会和主程序的一起都在终端中打印出来,这可能不是我们想要的,所以要把子程序的log重新导入到其他的log

5) execvp: 这个函数如果正常运行是不会有返回的,有返回说明启动的程序出现异常。对于没有返回的函数理解起来比较费劲,因为通常我们讲函数都会有返回的,但如果想到这个是一个独立的进程,那就可以理解了。

#include <sys/types.h>
#include <sys/wait.h>
int callApp (char* program, char** arg_list, bool isWaiting) {
  pid_t child_pid;
  /* Duplicate this process. */
  child_pid = fork ();
  //return child_pid;
  if (child_pid != 0){
    /* This is the parent process. */
	if(isWaiting == true){
	    /* Wait for the child process to complete. */
	    int child_status;
	    wait (&child_status);
        int retCode = WIFEXITED (child_status);
        // cout << "Finish " << program << " " << retCode << " "  <<  WEXITSTATUS (child_status) << endl;
	    if (retCode){
	    	// printf ("the child process exited normally, with exit code %d\n", WEXITSTATUS (child_status));
            return WEXITSTATUS(child_status);
        } else{
	    	// printf ("the child process exited abnormally\n");
            return -1;
        }
	}
  }else {
      /* Now execute PROGRAM, searching for it in the path. */
      string fLog = _temp_path+"/subprocess_log.log";
      freopen(fLog.c_str(), "w", stdout);
      string fErrorLog = _temp_path+"/subprocess.log";
      freopen(fErrorLog.c_str(), "w", stderr);
      chdir(_temp_path.c_str());
      int ret = execvp (program, arg_list);
      fclose(stdout);
      /* The execvp function returns only if an error occurs. */
      cout << "execvp failed with error code " << ret << endl;
      abort();
      return -1;
  }
}
// call sample
char subProcessBin[1024] = "myBin";
char* configFile = "myConfig";
char* arg_list[]= {
        subProcessBin,
        "-c",
        configFile,
        NULL
    }; 
int  retCode = callApp(subProcessBin, arg_list, true);
时间: 2024-10-07 10:01:33

execvp:在程序中调子程序并获取返回值的相关文章

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

【黑马Android】(07)多线程下载的原理/开源项目xutils/显示意图/隐式意图/人品计算器/开启activity获取返回值

多线程下载的原理 司马光砸缸,多开几个小水管,抢救小朋友. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import

python执行系统命令后获取返回值

import os, subprocess # os.system('dir') #执行系统命令,没有获取返回值,windows下中文乱码 # result = os.popen('dir') #执行系统命令,返回值为result# res = result.read()# for line in res.splitlines():# print(line ) #用subprocess库获取返回值.# p = subprocess.Popen('dir', shell=True, stdout=

工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码如下: # TestGroovy.groovy 定义testC方法,传入3个参数,返回处理后的数据 def testC(int numA, int numB, int numC) { "传入参数:" + numA + numB + numC + "计算之和为:" + (

java多线程之从任务中获取返回值

package wzh.test; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class TaskWithResult implements Callable<Strin

动态Tsql 获取返回值

使用Execute 和 sp_executesql实现动态Tsql,如何获取动态tsql的返回值? 第一部分:execute 1,Execute是个函数,能够执行sql语句,示例语句如下 declare @sql nvarchar(max) declare @return_cnt int if object_id('tempdb..#tempcnt') is not null drop table #tempcnt create table #tempcnt(cnt int) set @sql=

expect获取返回值

对于获取多台服务器状态且不用交互需要用到expect,但有时候expect无法获取返回值,这里解释一下expect如何获取返回值 expect -c " spawn $1; expect { \"(yes/no)?\" {send \"yes\n\";expect \"assword:\";send \"$2\n\"} \"assword:\" {send $2\n} eof } expect e

打开模态窗体,并获取返回值

1 //编辑 2             function btnEdit(keyid,sysName,mark) { 3                 //  打开模态窗体,并获取返回值 4                 var returnValue = window.showModalDialog('FileChange_SystemEdit.aspx?sysName=' + sysName + '&keyid=' + keyid + '&mark=' + mark, '', '

python通过多线程并获取返回值

以下是多线程获取返回值的一种实现方式 # -*-coding:utf-8-*- from time import ctime, sleep import threading import numpy as np import collections loops = ['广州', '北京'] t_list = ['01', '02', '03'] cldas_sum = collections.deque() class MyThread(threading.Thread): def __init