南通網(wǎng)站制作價(jià)格免費(fèi)的自助建站
文章目錄
- UDEV簡(jiǎn)介
- 守護(hù)進(jìn)程
- 基本特點(diǎn)
- 守護(hù)進(jìn)程和后臺(tái)進(jìn)程的區(qū)別
- 開發(fā)守護(hù)進(jìn)程
- 結(jié)束
UDEV簡(jiǎn)介
udev是一個(gè)設(shè)備管理工具,udev以守護(hù)進(jìn)程的形式運(yùn)行,通過(guò)偵聽內(nèi)核發(fā)出來(lái)的uevent來(lái)管理/dev目錄下的設(shè)備文件。
udev在用戶空間運(yùn)行,而不在內(nèi)核空間 運(yùn)行。它能夠根據(jù)系統(tǒng)中的硬件設(shè)備的狀態(tài)動(dòng)態(tài)更新設(shè)備文件,包括設(shè)備文件的創(chuàng)建,刪除等。
設(shè)備文件通常放在/dev目錄下。使用udev后,在/dev目錄下就只包含系統(tǒng)中真正存在的設(shè)備。
守護(hù)進(jìn)程
Linux Daemon(守護(hù)進(jìn)程)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。
它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。
它不需要用戶輸入就能運(yùn)行而且提供某種服務(wù),不是對(duì)整個(gè)系統(tǒng)就是對(duì)某個(gè)用戶程序提供服務(wù)。
Linux系統(tǒng)的大多數(shù)服務(wù)器就是通過(guò)守護(hù)進(jìn)程實(shí)現(xiàn)的。常見的守護(hù)進(jìn)程包括系統(tǒng)日志進(jìn)程syslogd、 web服務(wù)器httpd、郵件服務(wù)器sendmail和數(shù)據(jù)庫(kù)服務(wù)器mysqld等。守護(hù)進(jìn)程的名稱通常以d結(jié)尾
UDEV守護(hù)進(jìn)程,它能夠根據(jù)系統(tǒng)中的硬件設(shè)備的狀態(tài)動(dòng)態(tài)更新設(shè)備文件,包括設(shè)備文件的創(chuàng)建,刪除等。
基本特點(diǎn)
生存周期長(zhǎng)[非必須],一般操作系統(tǒng)啟動(dòng)的時(shí)候就啟動(dòng),關(guān)閉的時(shí)候關(guān)閉。
守護(hù)進(jìn)程和終端無(wú)關(guān)聯(lián),也就是他們沒(méi)有控制終端,所以當(dāng)控制終端退出,也不會(huì)導(dǎo)致守護(hù)進(jìn)程退出守護(hù)進(jìn)程是在后臺(tái)運(yùn)行,不會(huì)占著終端,終端可以執(zhí)行其他命令
一個(gè)守護(hù)進(jìn)程的父進(jìn)程是init進(jìn)程,因?yàn)樗嬲母高M(jìn)程在fork出子進(jìn)程后就先于子進(jìn)程exit退出了,所以它是一個(gè)由init繼承的孤兒進(jìn)程
ppid = 0:內(nèi)核進(jìn)程,跟隨系統(tǒng)啟動(dòng)而啟動(dòng),生命周期貫穿整個(gè)系統(tǒng)。
cmd列名帶[]這種,叫內(nèi)核守護(hù)進(jìn)程
init:也是系統(tǒng)守護(hù)進(jìn)程,它負(fù)責(zé)啟動(dòng)各運(yùn)行層次特定的系統(tǒng)服務(wù);所以很多進(jìn)程的PPID是init,也負(fù)責(zé)收養(yǎng)孤兒進(jìn)程。
cmd列中名字不帶[]的普通守護(hù)進(jìn)程(用戶集守護(hù)進(jìn)程)
守護(hù)進(jìn)程和后臺(tái)進(jìn)程的區(qū)別
守護(hù)進(jìn)程和終端不掛鉤;后臺(tái)進(jìn)程能往終端上輸出東西(和終端掛鉤);
守護(hù)進(jìn)程關(guān)閉終端時(shí)不受影響,守護(hù)進(jìn)程不會(huì)隨著終端的退出而退出;
開發(fā)守護(hù)進(jìn)程
直接借助damon()
函數(shù)完成
#include <unistd.h>
int daemon(int nochdir, int noclose);
函數(shù)參數(shù):
nochdir:為0時(shí)表示將當(dāng)前目錄更改至“/”
noclose:為0時(shí)表示將標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤重定向至“/dev/null”
返回值:
成功則返回0,失敗返回-1
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
//C 庫(kù)函數(shù) char *asctime(const struct tm *timeptr) 返回一個(gè)指向字符串的指針,它代表了結(jié)構(gòu) struct timeptr 的日期和時(shí)間。
//C 庫(kù)函數(shù) struct tm *localtime(const time_t *timer) 使用 timer 的值來(lái)填充 tm 結(jié)構(gòu)。timer 的值被分解為 tm 結(jié)構(gòu),并用本地時(shí)區(qū)表示。
/*
struct tm {int tm_sec; 秒,范圍從 0 到 59int tm_min; 分,范圍從 0 到 59int tm_hour; 小時(shí),范圍從 0 到 23int tm_mday; 一月中的第幾天,范圍從 1 到 31int tm_mon; 月份,范圍從 0 到 11int tm_year; 自 1900 起的年數(shù)int tm_wday; 一周中的第幾天,范圍從 0 到 6int tm_yday; 一年中的第幾天,范圍從 0 到 365int tm_isdst; 夏令時(shí)
};
*/
static bool flag = true;
void handler(int sig)
{printf("I got a signal %d\nI'm quitting.\n", sig);flag = false;
}
int main()
{time_t t;int fd;//創(chuàng)建守護(hù)進(jìn)程if(-1 == daemon(0, 0)){printf("daemon error\n");exit(1);}//設(shè)置信號(hào)處理函數(shù)struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;if(sigaction(SIGQUIT, &act, NULL)){printf("sigaction error.\n");exit(0);}//進(jìn)程工作內(nèi)容while(flag){fd = open("/home/orangepi/daemon.log", O_WRONLY | O_CREAT | O_APPEND,0644);if(fd == -1){printf("open error\n");}t = time(0);char *buf = asctime(localtime(&t));write(fd, buf, strlen(buf));close(fd);sleep(10);}return 0;
}
sudo vi /etc/rc.local //開機(jī)自啟動(dòng),絕對(duì)路徑加程序名字
結(jié)束
如有問(wèn)題,歡迎提出,共同進(jìn)步。