【发布时间】:2016-11-09 16:31:35
【问题描述】:
我有一个奇怪的问题。我的C语言不是很好。我正在尝试创建一个守护程序来在 Linux 中执行我的基于 bash 脚本的服务。为了方便起见,我使代码变得简单。下面是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>
int main(int argc, char* argv[])
{
pid_t process_id = 0;
pid_t sid = 0;
process_id = fork();
if (process_id < 0)
{
printf("fork failed!\n");
exit(1);
}
if (process_id > 0)
{
printf("daemon creatd with process id %d \n", process_id);
exit(0);
}
umask(0);
sid = setsid();
if(sid < 0)
{
fprintf(stderr, "Return error\n");
exit(1);
}
chdir("/");
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
int status = system("ls");
openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "Returned status is %d", status);
closelog();
return (0);
}
如您所见,上述程序会执行system函数来执行ls命令并将退出代码输出到系统日志。
程序编译运行后,在日志中可以看到状态码是512。但是如果我注释掉下面这行,
close(STDOUT_FILENO);
然后它完美运行,我可以在日志中看到状态码为 0,
我可能做错了什么?
更新
我的程序很大,我没有在实际环境中使用ls。我使程序变得简单,以重现我所面临的问题。另外,要查看程序的状态,我不是查看输出,而是查看系统日志中的状态代码。
【问题讨论】:
-
你为什么要做
ls,你希望它的输出去哪里?按照惯例,子进程继承父进程的标准输出。您在父进程中关闭了标准输出。ls使用标准输出。这是正确的预期行为。 -
我的程序很大,我没有在实际环境中使用
ls。我使程序变得简单,以重现我所面临的问题。另外,要查看程序的状态,我不是查看输出,而是查看系统日志中的统计代码。希望你能理解。