当前位置: 首页 > 面试题库 >

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

丁星火
2023-03-14
问题内容

我想在这里做些奇怪的事情。我需要从一个守护进程启动一个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标志打开控制台,这样它就不会成为守护程序的控制终端。

我最后要发表的评论是:

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

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



 类似资料:
  • 问题内容: 我正在尝试将Shell脚本移植到可读性更高的python版本。原始的shell脚本在后台使用“&”启动多个进程(实用程序,监视器等)。如何在python中达到相同的效果?我希望这些过程在Python脚本完成后不会消失。我敢肯定它与守护程序的概念有关,但是我找不到如何轻松实现此目的。 问题答案: 注意:此答案的最新版本比2009年发布时要少。现在建议在文档中使用其他答案中显示的模块 (请

  • 问题内容: 我正在尝试使用下面的nohup命令使用光纤启动celerycam进程。不幸的是,什么也没有发生,手动使用相同的命令可以启动该过程,但不能通过结构。关于如何解决这个问题的任何建议? 问题答案: 我正在使用Erich Heine的建议使用“ dtach”,并且对我来说效果很好: 这是在这里找到的。

  • 问题内容: 我正在使用.war文件在服务器上运行jenkins。他们说使用 (来源:https : //wiki.jenkins- ci.org/display/JENKINS/Starting+and+Accessing+Jenkins )来启动服务器。这将启动服务器并在屏幕上显示登录信息,并且可以使用了。 唯一的问题是,当我“ ctrl + c”它停止服务器时。我希望它应该在后台启动,以便即使

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要

  • 问题内容: 我有一个flask应用程序,目前正在以以下方式启动: 当我运行此脚本时,它通过打印成功执行: 但是它永远不会返回,如果我执行CTRL-C,服务器将停止。我正在尝试将其部署到生产环境中,并希望在后台运行此启动,只要服务器启动,进程就可以启动。 做这个的最好方式是什么? 问题答案: 可能是使其在后台运行的最简单方法。就是说,如果你要将其转入生产环境(如@LukasGraf所提到的那样,则不

  • 问题内容: 可以使用进程的核心转储来实现Checkpoint /重新启动吗?核心文件包含该进程的完整内存转储,因此,从理论上讲,应该有可能将进程还原到转储核心时的状态。 问题答案: 不,没有内核的特殊支持,这通常是不可能的。内核维护着每个进程状态,例如文件描述符表,IPC对象等。 如果您愿意做很多简化的假设,例如没有打开的文件,没有打开的套接字,没有活动的IPC对象,没有共享的内存区域等等,那么