关闭描述符是否会影响创建的守护进程

时间:2015-07-12 23:42:53

标签: c linux

我想创建一个守护进程,它在后台运行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);
        }
    }
}

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,这可以在我的代码中使用。

非常感谢。