为什么我的守护进程在重新启动后没有打印到控制台?
Why is my deamon not printing to console after I re-launch it?
这是我的代码:
#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
但是没有文字?为什么没有文本发送到标准输出?据我所知,守护程序仍在执行,终端正在向我显示标准输出,不是吗?
这是预料之中的,因为当您退出终端文件处理程序时,您的应用程序写入其输出 (stdout) 已经消失。当您再次启动终端时,它不会恢复相同的文件处理程序。如果您的应用程序正在写入文件并且您已将其删除,情况也是如此。如果您使用相同的路径创建新文件,它将不会继续写入。如果你想保留输出,在终端之后你必须写入一个文件,比如来自 httpd、samba、sshd 等守护进程的日志文件
您已经从初始 bash
实例中分叉出来,该实例将标准输入、标准输出和标准错误与特定终端连接起来。当您终止 bash 实例时,stdin、stdout 和 stderr 连接到的终端将被关闭,因此对于您的守护进程,写入任何这些描述符实际上是写入链接到已删除文件或设备的描述符.
如果终端关闭,写入该 TTY 设备的所有进程都将关闭其标准输出。打开新终端不会导致关闭 stdout
神奇地恢复。
这是我的代码:
#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
但是没有文字?为什么没有文本发送到标准输出?据我所知,守护程序仍在执行,终端正在向我显示标准输出,不是吗?
这是预料之中的,因为当您退出终端文件处理程序时,您的应用程序写入其输出 (stdout) 已经消失。当您再次启动终端时,它不会恢复相同的文件处理程序。如果您的应用程序正在写入文件并且您已将其删除,情况也是如此。如果您使用相同的路径创建新文件,它将不会继续写入。如果你想保留输出,在终端之后你必须写入一个文件,比如来自 httpd、samba、sshd 等守护进程的日志文件
您已经从初始 bash
实例中分叉出来,该实例将标准输入、标准输出和标准错误与特定终端连接起来。当您终止 bash 实例时,stdin、stdout 和 stderr 连接到的终端将被关闭,因此对于您的守护进程,写入任何这些描述符实际上是写入链接到已删除文件或设备的描述符.
如果终端关闭,写入该 TTY 设备的所有进程都将关闭其标准输出。打开新终端不会导致关闭 stdout
神奇地恢复。