使用RHEL5评估C中的WEXIT状态
我最近写了一篇deamon,我用它来自动化不同服务器之间的数据移动以及其他事情。我正在使用rsync,rsync工作得很顺利 然而,我不得不在我们的一台服务器上的rsync调用中添加一个特定的排除项,从那时起,我的代码在使用rsync时再也看不到成功。我尝试过手动运行rsync,每次它都返回success。此外,即使守护进程调用rsync,它也会成功复制所有文件,因此问题不在于rsync。然而,doSomeOtherThing()函数没有被调用,相反,我收到了errorEmail3()向我抛出的错误电子邮件。这是GNUC 这是我的密码:使用RHEL5评估C中的WEXIT状态,c,posix,C,Posix,我最近写了一篇deamon,我用它来自动化不同服务器之间的数据移动以及其他事情。我正在使用rsync,rsync工作得很顺利 然而,我不得不在我们的一台服务器上的rsync调用中添加一个特定的排除项,从那时起,我的代码在使用rsync时再也看不到成功。我尝试过手动运行rsync,每次它都返回success。此外,即使守护进程调用rsync,它也会成功复制所有文件,因此问题不在于rsync。然而,doSomeOtherThing()函数没有被调用,相反,我收到了errorEmail3()向我抛出的
pid_t pid;
pid = fork();
if (pid == 0) {
char *args[NUM_ARGS]
args[0] = strdup("rsync");
...
...
execvp(args[0], args);
fprintf(stderr, "execvp ain't workin\n");
exit(1);
}
else if (pid == -1) {
erroremail1();
return;
}
else {
int childstat;
if (waitpid(pid, &childstat, 0) == -1) {
perror("waitpid");
exit(1);
}
else {
if (!WIFEXITED(childstat)) {
errorEmail2();
}
else {
if (WEXITSTATUS(childstat) == EXIT_SUCCESS) {
doSomeOtherThing();
}
else {
errorEmail3();
}
}
}
}
我包含了sys/wait.h以及所有其他相关的头文件
我可能错过了一些非常愚蠢和明显的东西,我希望有第二双眼睛来看看这个
编辑:复制的代码不正确,已修复
编辑2:修复了另一个打字错误。
编辑3:添加了错误检查的准确代码什么是退出状态?这不应该是
EXIT\u SUCCESS
?OT:调用waitpid()
会错过错误检查。如果is失败childstat
将在未初始化的情况下读取,这反过来会引发未定义的行为。另一个坏拷贝。抱歉,即将修复。从您的“坏拷贝”中,我得到的印象是您没有显示“真实”代码。打印所有有趣值的代码在哪里,例如rsync
的PID和退出状态,以及waitpid()
返回的实际值,以及childstat
中的原始值等等?如果你没有这些数据,你就不知道出了什么问题。确保打印所有此类相关信息,至少在使用调试标志运行守护程序时是这样(考虑将其设置为-dn
,用于各种N值,以便根据需要生成更多或更少的数据)。“execvp不工作”消息也不会给您任何帮助;它应该打印argv
中的值。