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

问题描述:

我想创建一个守护进程,它在后台运行Linux的top命令。 如果我关闭了所有的描述符,我找不到top被创建,因为当我使用ps -aux命令检查时,没有任何关于top的信息。 如果我删除了有关关闭描述符的行,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

如果关闭所有文件描述符,top将显示其输出,或者全部发送到/ dev/null?如果信息永远不会被看到,为什么你会运行一个显示信息的程序? –

+0

请注意,在'execvp()'写入'/ dev/null'之前的'printf()';如果'execvp()'失败,'perror()'也是如此。 –

+0

我只是想让程序创建一个守护进程,它可以在后台运行一个shell命令,我不关心它的输出。我偶然选择了顶层命令,但它不起作用。 – stonecutter

我想我找到了愚蠢的错误我有made.I关闭所有的描述,并指出该标准输入,标准输出,标准输出到/dev/null.But top命令需要从输入来的系统信息。所以execvp faild,顶层命令不会执行。

如果我不关闭描述符0(标准输入),则顶部命令将在后台执行。如果关闭描述符0并将描述符2(stderr)指向日志,则错误将打印为日志。

认为守护进程首先必须关闭所有描述符,实在太固执了。在浪费资源的情况下,我们应该关闭不必要的描述符。

从顶部手册页: “-b:批处理模式操作顶部‘批量’模式,这可能是从顶部到其他程序或文件发送输出有用 开始。在这种模式下,顶部的意志不接受输入“

顶部命令可以在没有输入的情况下使用参数-b来执行,这在我的代码中起作用。

非常感谢。

+0

通常守护进程应该这样做(关闭文件描述符)。你的回答是有道理的,因为*并不是一个守护进程,而是一个交互式程序。在后台运行这样的程序的标准方法是通过双管道将其连接到控制过程。 –