0

我有一个程序链如下:

C++ 程序“A”启动另一个启动 bash 脚本的 C++ 程序“B”。

要启动 bash 脚本,我正在使用:

int returnVal = system("pathToScript/myScript.sh");

我可以在我的日志文件中看到脚本的输出,所以它肯定正在执行。

问题是,无论脚本返回什么,returnVal 始终为 -1。我什至在脚本中硬编码了一个“退出 3”,当我通过系统调用启动它时,我仍然得到 -1 的 returnVal。

在终端中独立运行脚本并回显“$?” 如预期的那样显示返回值 3。

那么,当我通过一系列 C++ 程序运行退出代码时,为什么它会中断呢?有没有办法解决这个问题?

编辑- 使用 perror 显示“无子进程”错误消息。

编辑- 作为替代方案,我正在尝试使用 fork/exec/wait 来执行我的脚本,但我得到了随机退出代码,例如 182、56、163、62、51 等......代码如下:

pid_t pid = vfork();

switch (pid)
{
  case -1:
     cout << "Failed to fork." << endl;

  case 0: // Child process
     cout << "Child process launched!" << endl;
     execl("/pathToScript/myScript.sh", "/pathToScript/myScript.sh", "someArgument", NULL);
     cout << "execl call failed." << endl;
     exit(0);

  default:
     int status;

     cout << "Waiting for process to complete..." << endl;

     waitpid(pid, &status, 0); // Wait for the process to complete.

     cout << "Process exited with status: " << WEXITSTATUS(status) << endl;
}

为什么我在这里得到随机退出状态?

感谢任何建议。谢谢!

4

1 回答 1

2

如评论中所述,您的问题是 ignorig SIGCHLD。忽略SIGCHLD可以用来防止僵尸的产生。因此,通过将其设置为默认值,您可以破坏某些东西。

这里的例子:

signal (SIGCHLD, SIG_DFL);
system ("some_program");
signal (SIGCHLD, SIG_IGN);

如果某些子进程(不是子进程system)在执行第一行和第三行之间终止,它将成为僵尸。

如果你想正确解决这个资源泄漏,你应该使用另一种方法(双forkwait)来解决僵尸问题。


为什么我在这里得到随机退出状态?

因为waitpid调用失败。如果你打印出来它的返回值waitpid将是-1. 的值errno最有可能是ECHILD。设置 to 的配置SIGCHLDSIG_IGN导致中断waitwaitpid。在您的示例waitpid中,不会向status变量写入任何内容(或写入垃圾)。

182、56、163、62、51等。

这些数字是未初始化的整数变量(或垃圾)的值。

作为替代方案,我正在尝试使用 fork/exec/wait 来执行我的脚本

这不是一个好的选择。替代解决方案是为程序的所有部分设置SIGCHLD配置SIG_DFL。并改变其他部分处理僵尸的策略。

于 2013-08-06T07:04:30.200 回答