我重新启动后,为什么我的守护程序没有打印到控制台?

时间:2015-06-02 11:37:05

标签: c linux bash shell daemon

这是我的代码:

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    pid_t pid;
    pid = fork();

    if (pid != 0)
    {
        exit(0);
    }

    setsid();
    chdir("/");

    while(1){
        sleep(4);
        printf("%s\n", "Hello world!");
    }

    return 0;
}

好的,现在我将打开终端,再次启动bash,输出将是:

Last login: Tue Jun  2 14:29:49 on ttys000
Korays-MacBook-Pro:~ koraytugay$ bash
bash-3.2$ ./a.out 
bash-3.2$ Hello world!
Hello world!
Hello world!
exit
exit
Korays-MacBook-Pro:~ koraytugay$ Hello world!
Hello world!

我想在这里展示的是,我启动了终端,据我所知,它启动了bash,在bash内部,我又启动了一次bash并启动了我的程序。

即使我退出了bash,守护者仍然在运行,这正是我所期待的......

但问题是,如果我退出终端应用程序并再次启动它,我将不会再看到“Hello World”..

我所看到的只是:

Last login: Tue Jun  2 14:30:46 on ttys000
Korays-MacBook-Pro:~ koraytugay$ 

关闭航站楼后,我的守护人员死了吗?为什么在第一种情况下,即使我退出bash,父bash仍会显示Hello Worlds,但是在我重新启动终端之后呢?

这就是我所说的终端:http://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line

此外,我想添加此信息,

执行

时在新终端中
ps -A 

我仍然看到:

41891 ??         0:00.01 ./a.out
41902 ??         0:00.01 ./a.out

然而没有文字?为什么没有文字发送标准出来?据我所知,守护人员仍在执行,终端正在向我展示标准,不是吗?

3 个答案:

答案 0 :(得分:3)

您已从最初的async实例派生,该实例将stdin,stdout和stderr与特定终端连接起来。当你终止bash实例时,stdin,stdout和stderr连接的终端将被关闭,因此你的守护进程写入任何这些描述符实际上是写入链接到已删除文件或设备的描述符。

答案 1 :(得分:1)

这是预期的,因为当您退出应用程序写入其输出(标准输出)的终端文件处理程序时,该消息已消失。再次启动终端时,它不会恢复相同的文件处理程序。如果您的应用正在写入文件并且已删除它,则相同。如果您创建具有相同路径的新文件,则不会继续在其中写入。如果你想保留输出,在终端之后你必须写一个文件,比如httpd,samba,sshd等守护进程的日志文件。

答案 2 :(得分:1)

如果终端关闭,则写入该TTY设备的所有进程都将关闭其标准输出。打开一个新终端不会导致关闭stdout神奇地恢复。