2015-06-02 55 views
0

這裏是我的代碼:爲什麼我的deamon重新啓動後不能打印到控制檯?

#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; 
} 

現在好了,我會打開終端,並再次內啓動慶典,輸出將是:

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 

但是沒有文字?爲什麼沒有文字發送到標準輸出?據我所知,守護者仍在執行,終端正在向我展示標準,不是嗎?

回答

1

由於當您退出應用程序將其輸出寫入其中的終端文件處理程序(標準輸出)已不存在時,可能會出現這種情況。當您再次啓動終端時,它不會恢復相同的文件處理程序。如果您的應用程序正在寫入文件並且已將其刪除,這也是一樣的。如果使用相同的路徑創建新文件,它將不會繼續寫入。如果你想保留輸出,在終端之後你必須寫入一個文件,比如httpd,samba,sshd等守護進程中的日誌文件。

+0

標準不總是0嗎?你是什​​麼意思該文件是一個不同的文件? –

+0

使用'lsof'打開您的應用程序的文件描述符。您將看到stdout指向的位置。 –

3

你從初始的bash實例中分叉出來,它將stdin ,stdout和stderr與特定的終端。當您終止bash實例時,stdin,stdout和stderr所連接的終端將被關閉,因此,您的守護進程寫入任何這些描述符都會有效寫入鏈接到已刪除文件或設備的描述符。

1

如果終端關閉,寫入該TTY設備的所有進程將關閉其標準輸出。打開一個新的終端不會導致關閉stdout神奇地恢復。

+0

是不是標準的東西全球?它如何關閉?每個進程都有自己的stdout嗎? –

+0

爲什麼關閉終端關閉stdout文件?爲什麼退出bash(如我的第一個示例)不會關閉stdout? –

+0

@KorayTugay * shell *和* *終端*之間有區別。 shell是一個讀取輸入並解析並執行命令的程序,終端是處理輸入和輸出的設備。一個進程連接到終端設備,如果該設備關閉,當然使用該設備的進程不能繼續寫入該設備。 –

相關問題