gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:07 24 4
gpt4 key购买 nike

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

最佳答案

我想我发现了我犯的愚蠢错误。我关闭了所有描述符并将标准输入、标准输出、标准输出指向/dev/null。但是顶级命令需要来自输入的系统信息。所以 execvp 失败了, top 命令不执行。

如果我不关闭描述符 0 (stdin),top 命令将在后台执行。如果我关闭描述符 0 并将描述符 2 (stderr) 指向日志,错误将打印在日志。

认为守护进程必须先关闭所有描述符的想法太固执了。为了避免浪费资源,我们应该关闭不需要的描述符。

来自顶部联机帮助页:"-b:批处理模式操作 以“批处理”模式启动 top,这对于将 top 的输出发送到其他程序或文件很有用。在这种模式下,top 将不接受输入"

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

非常感谢。

关于c - 关闭描述符是否影响创建的守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com