gpt4 book ai didi

c - 在 Linux 中使用 C 在后台启动一个进程

转载 作者:IT王子 更新时间:2023-10-29 00:20:15 25 4
gpt4 key购买 nike

我想在这里做一些奇怪的事情。我需要从将在后台运行的守护进程启动一个进程 logcat,并在不控制标准输入的情况下打印到终端。它用于日志记录,因此理想情况下 logcat 将打印日志消息,同时仍允许用户输入标准命令并从 shell 初始化程序。这是我目前拥有的守护进程的代码。程序 logcat 启动并显示日志消息,但我无法向标准输入输入任何命令,因为该程序似乎已经控制了标准输入。

int main ( int argc, char** argv, char** env )
{
int fd;
if ((fd = open("/dev/console", O_RDWR)) < 0) {
fd = open("/dev/null", O_RDWR);
}
printf("THIS IS A TEST\n");
dup2(1, fd);
dup2(2, fd);

pid_t childpid = fork();

if(childpid == -1) {
perror("Failed to fork, logcat not starting");
return 1;
}

if(childpid == 0) {
//this is the child, exec logcat
setsid();
int execReturn = execl("/system/bin/logcat", "logcat", (char *) 0);
} else {
//this is the parent do nothing
close(fd);
return 0;
}
close(fd);
return 0;
}

谢谢

最佳答案

'logcat'命令似乎用于 Android 开发 - 这可能解释了命令的奇怪位置。

您必须修复的关键操作是确保您关闭当前的标准输入(终端)并为输入设备打开/dev/null/:

close(0);
if ((fd = open("/dev/null", O_RDONLY)) != 0)
...error - failed to open /dev/null!

这意味着您的守护进程不会从终端读取任何内容。


我想你想做的是:

  1. 从命令行运行您的启动器程序,它会将标准输入、标准输出和标准错误连接到“终端”。
  2. 在您的程序中,您想要替换来自 /dev/null 的标准输入。
  3. 您想单独保留标准输出 - 您希望 logcat 写入当前标准输出。
  4. 您可能也想单独留下标准错误。

在程序的某个时刻,您执行您的 daemonization正确地(借用@bstpierre 的答案中的链接),确保您连接的终端不是您的控制终端,以便发送到终端的中断和挂断不会影响您的守护进程。管道比您设置的更简单 - 您应该处理标准输入并保持标准输出和标准错误不变(而不是更改输出并保持输入不变)。

现在,您可能希望输出到 /dev/console;如果是这样,那么修改代码打开/dev/console是合理的。但是,打不开/dev/console就退回到/dev/null是不合理的;您的程序应该报告错误并失败(因为让 logcat 写入 /dev/null 毫无意义!)。确保使用 O_NOCTTY 标志打开控制台,这样它就不会成为守护程序的控制终端。

我最后的评论是:

  • 您确定要在终端或控制台用于其他用途时随机显示文本吗?

我不太喜欢这种情况。


另请参阅:SO 958249

关于c - 在 Linux 中使用 C 在后台启动一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407197/

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