当我在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。
答案 0 :(得分:5)
只有在最初创建子进程(通过system
)或收集其退出状态(通过fork
)失败的情况下,{-1}才能返回值−1。由于传递给wait
的命令存在问题,这两种情况均不会发生,因为该命令是在子进程中解释的。该命令的问题将显示为system
返回不等于0或−1且system
或s
为真的值WIFEXITED(s) && WEXITSTATUS(s) != 0
。 (在WIFSIGNALED(s)
中定义了宏WIFEXITED
,WIFSIGNALED
和WEXITSTATUS
。)(请参阅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,这使我认为您的问题是由于system
与wait
处理程序。在SIGCHLD
中获得“没有任何子进程”(ECHILD
)与该假设相一致,因为据记录errno
会产生该错误代码,而wait
并非如此。但这只是一个假设。为了更好地诊断您的问题,我们需要查看一个 complete 测试程序,该程序可以自己编译并运行,并观察与您完全相同的故障情况。请阅读并遵循https://stackoverflow.com/help/mcve上的说明。