在Linux中使用C在后台启动进程

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

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. 您可能也想单独留下标准错误。

在程序中的某个时刻,您可以正确地进行守护进程(从@bstpierre的答案中借用链接),确保所连接的终端不是您的控制终端,这样发送到终端的中断和挂断不会影响您的守护程序。管道比您设置的管道更简单-

您应该处理标准输入,并保持标准输出和标准误差不变(而不是更改输出并使输入不变)。

现在,您可能希望输出到/dev/console;

如果是这样,则修改代码open是合理的/dev/console。但是,/dev/null如果您无法打开/dev/console,则退后给您是不合理的;您的程序应报告错误并失败(因为将logcat写入/dev/null!没有意义)。确保使用O_NOCTTY标志打开控制台,这样它就不会成为守护程序的控制终端。

我最后要发表的评论是:

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

发生这种情况时,我不太喜欢。

以上是 在Linux中使用C在后台启动进程 的全部内容, 来源链接: utcz.com/qa/431076.html

回到顶部