日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Linux系統下創建守護進程

作者:小王多魚 更新時間: 2022-09-05 編程語言

目錄

1.先來了解一下守護進程

2.創建一個守護進程的步驟

代碼實現:

運行結果:


1.先來了解一下守護進程

守護進程一直在后臺運行,和任何終端都不關聯。通常系統啟動時開始執行,系統關閉時結束。

2.創建一個守護進程的步驟

(1)創建子進程,退出父進程(使子進程成為后臺進程)

(2)設置新的會話(使進程完全獨立)

這里再講一下會話的概念,Linux以會話,進程組的方式管理進程。每個進程屬于一個進程組,會話則是一個或多個進程組的集合。通常用戶打開一個終端,系統就會創建一個會話,所有通過該終端運行的進程都屬于這個會話。

(3)設置工作目錄

將守護進程的工作目錄設置為根目錄,便于讓守護進程以絕對路徑的形式訪問資源

(4)重設文件掩碼

將文件掩碼設置為0,方便后續守護進程創建時,創建出來的文件權限符合我們的預期,增強守護進程的靈活性

(5)關閉從父進程繼承下來的文件描述符。子進程繼承了父進程已經打開的文件,這些文件可能永遠不會被守護進程讀寫,但一樣會消耗資源,所以需要關閉這些不用的文件描述符。

代碼實現:

這里守護進程實現的的功能為每5秒記錄一次系統時間

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

int main()
{
	//1.創建子進程,關閉父進程
	pid_t pid=0;
	pid=fork();
	if(pid<0)
	{
		perror("fork error");
		return -1;
	}
	if(pid>0)
	{
		exit(0);//關閉父進程
	}
	//2.創建新會話
	pid=setsid();
	if(pid<0)
	{
		perror("setsid error");
		return -1;
	}
	//3.設置工作目錄
	chdir("/tmp");
	//4.重設文件掩碼
	umask(0);
	//5.關閉從父進程繼承下來的文件描述符
	int i=0;
	for(i=0;i<getdtablesize();i++)
	{
		close(i);
	}
	//6.執行任務(每5秒記錄一次系統時間)
	while(1)
	{
		system("echo `date` >> time.txt");
		sleep(5);
	}
	return 0;
}

運行結果:

運行該程序,可以看到在根目錄tmp文件夾下多了一個time.txt文件。查看該文件,可以看到守護進程每5秒寫入的系統時間。

文章有概念不清晰或表述不正確的地方歡迎大家指正

?

原文鏈接:https://blog.csdn.net/m0_72772587/article/details/126692497

欄目分類
最近更新