歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux守護進程學習

Linux守護進程學習

日期:2017/2/28 14:37:19   编辑:Linux教程

守護進程是工作在後台的程序,是用戶"看不見"的進程,它們會在後台偷偷的運行著。
守護進程是不需要和控制台進行通信的,所以可以將標准輸入、標准輸出以及標准出錯都關掉。
如何關掉呢?
調用庫函數daemon就能達到這一需求,
#include <unistd.h>

int daemon(int nochdir, int noclose);

在daemon函數內部,它會將stdin、stdout以及stderr都關掉。
個人覺得:
所謂守護進程只是一種概念,並不一定是調用了daemon函數就是守護進程;
而未調用daemon函數就不是守護進程。

daemon函數是如何close掉stdin、stdout以及stderr的呢?
將stdin、stdout和stderr都重定向到黑洞文件/dev/null中。
int fd = open("/dev/null", O_RDWR, 0);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);

其中系統調用open用來打開一個文件,並返回該文件的文件描述符,
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags, mode_t mode);

系統調用close用來關閉一個指定的文件,
#inlcude <unistd.h>

int close(int fd);

系統調用dup2用來將newfd對應的文件重定向到oldfd上。
這兩個文件描述符共享同一個數據結構,這樣對其中一個文件的操作會同時影響到這兩個文件。
可以將newfd理解成一個指針,它指向oldfd指向的位置,這樣無論是對newfd還是oldfd的操作都是一樣的。
#include <unistd.h>

int dup2(int oldfd, int newfd);

系統獨立運行的守護進程稱之為stand alone daemon,常見的包括atd、crond、syslogd等。
和stand alone daemon相對的另一種就是super daemon。
比如inetd,它在後台監聽網絡端口,當接收到client端的請求時,它會根據請求的端口來
決定啟動不同的網絡服務程序。

另外一種分類的方法分為:signal control daemon和interval control daemon。
像inetd就屬於signal control daemon;crond、syslogd等就屬於interval control daemon。

守護進程還有很多,比如dhcpd、httpd、ntpd等等。
本篇就當先做個了解。

Copyright © Linux教程網 All Rights Reserved