Linux system()返回-1,ERRNO = 10没有子进程

时间:2019-03-13 19:52:21

标签: c rhel7

当我在RHEL 7.4中运行以下C代码时:

string checkboxvalue = "";
if(chkA.Checked()) checkboxvalue +="A";
if(chkB.Checked()) checkboxvalue +="B";
if(chkC.Checked()) checkboxvalue +="C";
if(chkD.Checked()) checkboxvalue +="D";



switch(checkboxvalue)
    {
        case "ABCD":
        strSql += "AND .....;"
        break;

        case "ABC":
        strSql += "AND .....;"
        break;

        case "ABD":
        strSql += "AND .....;"
        break;

        case "ACD":
        strSql += "AND .....;"
        break;

        case "BCD":
        strSql += "AND .....;"
        break;

        case "AB":
        strSql += "AND .....;"
        break;

        case "AC":
        strSql += "AND .....;"
        break;

        case "AD":
        strSql += "AND .....;"
        break;

        case "BC":
        strSql += "AND .....;"
        break;

        case "BD":
        strSql += "AND .....;"
        break;

        case "CD":
        strSql += "AND .....;"
        break;

        case "A":
        strSql += "AND .....;"
        break;

        case "B":
        strSql += "AND .....;"
        break;

        case "C":
        strSql += "AND .....;"
        break;

        case "D":
        strSql += "AND .....;"
        break;
    }

我得到的返回代码为-1且errno = 10(无子进程)。 /tmp/test.txt文件实际上是创建的,因此可以运行,但是程序看到非零的返回码并退出。

问题是该命令在HP-UX 11.11中返回了0,但是我们迁移到RHEL 7.4,现在得到-1。

1 个答案:

答案 0 :(得分:5)

只有在最初创建子进程(通过system)或收集其退出状态(通过fork)失败的情况下,{-1}才能返回值−1。由于传递给wait的命令存在问题,这两种情况均不会发生,因为该命令是在子进程中解释的。该命令的问题将显示为system返回不等于0或−1且systems为真的值WIFEXITED(s) && WEXITSTATUS(s) != 0。 (在WIFSIGNALED(s)中定义了宏WIFEXITEDWIFSIGNALEDWEXITSTATUS。)(请参阅the POSIX specification for system了解为什么会发生这种情况。)

sys/wait.h故障通常仅是由于系统范围内的资源耗尽和/或强加的资源配额造成的。例如,该程序打印

fork

当我运行它时。

true: status=-1 errno=11 (Resource temporarily unavailable)

如果您有SIGCHLD处理程序窃取了等待状态,则#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/resource.h> int main(void) { struct rlimit rl; rl.rlim_cur = 1; rl.rlim_max = 1; setrlimit(RLIMIT_NPROC, &rl); int status = system("true"); printf("true: status=%d errno=%d (%s)\n", status, errno, strerror(errno)); return 0; } 内部可能发生wait故障。例如,该程序打印

system

当我运行它时。 (SIGCHLD处理程序还可以通过其他几种方式来干扰true: status=-1 errno=10 (No child processes) ;这只是我能想到的最短的演示程序。)

system

您说您传递给#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> int main(void) { signal(SIGCHLD, SIG_IGN); int status = system("true"); printf("true: status=%d errno=%d (%s)\n", status, errno, strerror(errno)); return 0; } 的任何命令都可以正确执行,但是system仍返回-1,这使我认为您的问题是由于systemwait处理程序。在SIGCHLD中获得“没有任何子进程”(ECHILD)与该假设相一致,因为据记录errno会产生该错误代码,而wait并非如此。但这只是一个假设。为了更好地诊断您的问题,我们需要查看一个 complete 测试程序,该程序可以自己编译并运行,并观察与您完全相同的故障情况。请阅读并遵循https://stackoverflow.com/help/mcve上的说明。