我想创建一个守护进程,它在后台运行Linux的top
命令。
如果我关闭了所有描述符,我就无法找到top
已创建,因为当我使用top
命令进行检查时,ps -aux
没有任何内容。
如果我删除关于关闭描述符的行,top
将在终端运行。
我的代码出了什么问题?如果我想在关闭描述符时正确运行程序,我该怎么办?
这是代码。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
void main(void)
{
int pid;
int i;
int fd;
char *d[2];
char a[5] = "top";
d[0] = a;
a[3] = '\0';
d[1] = NULL;
signal(SIGCHLD, SIG_IGN);
if ((pid = fork()) == -1)
perror("fork error");
else if (pid > 0)
exit(0);
else {
setsid();
if ((pid = fork()) == -1)
perror("fork error");
else if (pid > 0)
exit(0);
else {
for (i = 0;i < 255;i++)
close(i);
fd = open("/dev/null", O_RDWR);
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
chdir("/");
umask(0);
printf("%s\n", d[0]);
execvp(d[0], d);
perror("execvp failed");
exit(1);
}
}
}
答案 0 :(得分:0)
我想我发现了我犯的那个愚蠢的错误。我关闭所有的描述符并将stdin,stdout,stdout指向/dev/null。但是top命令需要来自输入的系统信息。所以execvp faild ,top命令不会执行。
如果我不关闭描述符0(stdin),则top命令将在后台执行。如果我关闭描述符0并将描述符2(stderr)指向日志,则将打印错误在日志中。
认为守护进程必须首先关闭所有描述符,这太顽固了。如果浪费资源,我们应该关闭不必要的描述符。
从顶部联系页面: &#34; -b:批处理模式操作 在&#39; Batch&#39;中排名第一。模式,可用于将输出从顶部发送到其他程序或文件。在此模式下,top不接受输入&#34;
top命令可以在没有输入的情况下执行,使用参数-b,这可以在我的代码中使用。
非常感谢。