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

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

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

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

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

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

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

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

  1. #include <sys/types.h>
  2. #include <sys/wait.h>
  3. int callApp (char* program, char** arg_list, bool isWaiting) {
  4. pid_t child_pid;
  5. /* Duplicate this process. */
  6. child_pid = fork ();
  7. //return child_pid;
  8. if (child_pid != 0){
  9. /* This is the parent process. */
  10. if(isWaiting == true){
  11. /* Wait for the child process to complete. */
  12. int child_status;
  13. wait (&child_status);
  14. int retCode = WIFEXITED (child_status);
  15. // cout << "Finish " << program << " " << retCode << " " << WEXITSTATUS (child_status) << endl;
  16. if (retCode){
  17. // printf ("the child process exited normally, with exit code %d\n", WEXITSTATUS (child_status));
  18. return WEXITSTATUS(child_status);
  19. } else{
  20. // printf ("the child process exited abnormally\n");
  21. return -1;
  22. }
  23. }
  24. } else {
  25. /* Now execute PROGRAM, searching for it in the path. */
  26. string fLog = _temp_path+ "/subprocess_log.log";
  27. freopen(fLog.c_str(), "w", stdout);
  28. string fErrorLog = _temp_path+ "/subprocess.log";
  29. freopen(fErrorLog.c_str(), "w", stderr);
  30. chdir(_temp_path.c_str());
  31. int ret = execvp (program, arg_list);
  32. fclose( stdout);
  33. /* The execvp function returns only if an error occurs. */
  34. cout << "execvp failed with error code " << ret << endl;
  35. abort();
  36. return -1;
  37. }
  38. }
// call sample
  1. char subProcessBin[ 1024] = "myBin";
  2. char* configFile = "myConfig";
  3. char* arg_list[]= {
  4. subProcessBin,
  5. "-c",
  6. configFile,
  7. NULL
  8. }; 
int  retCode = callApp(subProcessBin, arg_list, true); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当执行make或sudo make命令时,出现"execvp: ./: Permission denied"的错误提示,这通常表明没有足够的权限来执行该命令。 这个问题可能涉及到文件或目录的权限设置。在引用和引用都提到了类似的错误信息,即"Permission denied"。这种错误通常发生在尝试执行一个文件或进入一个目录时,当前用户没有足够的权限来执行操作。 要解决这个问题,你可以考虑以下几个步骤: 1. 首先,你可以使用"ls -l"命令来查看目标文件或目录的权限设置。在终端执行该命令后,会显示文件或目录的权限信息,包括所有者、所属组和其他用户的权限。 2. 确保你拥有足够的权限来执行该命令。你可以使用"chmod"命令来修改文件或目录的权限。具体的修改方式可以参考引用提供的"chmod"命令语法参考。 3. 如果你是目标文件或目录的所有者,可以尝试使用"chmod"命令来提高你的执行权限。例如,执行以下命令来赋予目标文件可执行权限: chmod +x <filename> [3] 4. 如果你不是目标文件或目录的所有者,但是是所属组的成员,可以尝试使用"chmod"命令来修改所属组的执行权限。例如,执行以下命令来赋予所属组可执行权限: chmod g+x <filename> 5. 如果你是其他用户,可以尝试使用"chmod"命令来修改其他用户的执行权限。例如,执行以下命令来赋予其他用户可执行权限: chmod o+x <filename> 通过以上步骤,你应该能够解决"execvp: ./: Permission denied"的问题,并成功执行make或sudo make命令。请根据具体情况选择适当的权限设置方法,并确保你已经理解了这些操作的含义和潜在的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值