Linux系統編程(六)守護進程

Linux系統編程(六)守護進程

  • 一、進程組
    • 概念
  • 二、會話
    • 創建會話的條件
  • 守護進程
    • 概念
    • 守護進程模型
  • 創建守護進程

一、進程組

概念

進程組,也稱之為作業。代表一個或多個進程的集合。每個進程都屬于一個進程組。
當父進程,創建子進程的時候,默認子進程與父進程屬于同一進程組。進程組ID == 第一個進程ID(組長進程)。所以,組長進程標識:其進程組ID == 其進程ID
組長進程可以創建一個進程組,創建該進程組中的進程,然后終止。只要進程組中有一個進程存在,進程組就存在,與組長進程是否終止無關。
進程組生存期:進程組創建到最后一個進程離開(終止或轉移到另一個進程組)。
一個進程可以為自己或子進程設置進程組ID

二、會話

創建會話的條件

  1. 調用進程不能是進程組組長,該進程變成新會話首進程(session header)
  2. 該進程成為一個新進程組的組長進程。
  3. 需有root權限(ubuntu不需要)
  4. 新會話丟棄原有的控制終端,該會話沒有控制終端
  5. 該調用進程是組長進程,則出錯返回
  6. 建立新會話時,先調用fork, 父進程終止,子進程調用setsid

守護進程

概念

Daemon(精靈)進程,是Linux中的后臺服務進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。一般采用以d結尾的名字。
Linux后臺的一些系統服務進程,沒有控制終端,不能直接和用戶交互。不受用戶登錄、注銷的影響,一直在運行著,他們都是守護進程。如:預讀入緩輸出機制的實現;ftp服務器;nfs服務器等。
創建守護進程,最關鍵的一步是調用setsid函數創建一個新的Session,并成為Session Leader。

守護進程模型

  1. 創建子進程,父進程退出
    所有工作在子進程中進行形式上脫離了控制終端
  2. 在子進程中創建新會話
       setsid()函數
       使子進程完全獨立出來,脫離控制
  3. 改變當前目錄為根目錄
       chdir()函數
       防止占用可卸載的文件系統
       也可以換成其它路徑
  4. 重設文件權限掩碼
       umask()函數
       防止繼承的文件創建屏蔽字拒絕某些權限
       增加守護進程靈活性
  5. 關閉文件描述符
       繼承的打開文件不會用到,浪費系統資源,無法卸載
  6. 開始執行守護進程核心工作
  7. 守護進程退出處理程序模型

創建守護進程

#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include<time.h>
#include <errno.h>
#include <sys/time.h>
#include <memory.h>void handler(int signo)
{time_t now;    //實例化time_t結構struct tm* timenow;    //實例化tm結構指針time(&now);//time函數讀取現在的時間(國際標準時間非北京時間),然后傳值給nowtimenow = localtime(&now);//localtime函數把從time取得的時間now換算成你電腦中的時間(就是你設置的地區)char buf[50] = {0};sprintf(buf,"%s\n" ,asctime(timenow));int fd;fd = open("./time.txt", O_CREAT | O_RDWR,0644);if (fd == -1){perror("file error:");exit(1);}lseek(fd, 0, SEEK_END);int ret=write(fd,buf,sizeof(buf));if (ret < 0 && errno == EINTR){perror("write error:");}memset(buf,0,sizeof(buf));printf("write success \n");}void mydaemond(void)
{pid_t pid, sid;int ret;pid = fork();if (pid < 0){perror("pid error:");exit(1);}else if (pid == 0){sid = setsid();if (sid == -1){perror("sid error:");exit(1);}//ret = chdir("/home/");//if (ret < 0)//{//    perror("chdir error:");//    exit(1);//}umask(0002);//關閉文件描述符close(STDIN_FILENO);open("/dev/null", O_RDWR);dup2(0, STDOUT_FILENO);dup2(0, STDERR_FILENO);//安裝信號struct sigaction act;act.sa_flags = 0;sigemptyset(&act.sa_mask);act.sa_handler = handler;sigaction(SIGALRM, &act, NULL);itimerval it;it.it_interval.tv_sec = 2;it.it_interval.tv_usec = 0;it.it_value.tv_sec = 2;it.it_value.tv_usec = 0;//啟用時間setitimer(ITIMER_REAL, &it, NULL);}else{exit(1);}
}int main()
{mydaemond();while (1);return 0;
}

使用守護進程實現每兩秒打印當前時間到文件中

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP 客戶端和服務器端

轉自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39047265 前面幾篇中實現的client每次運行只能從命令行讀取一個字符串發給服務器&#xff0c;再從服務器收回來&#xff0c;現在我們把它改成交互式的&#xff0c;不斷從終端接受用戶輸入并和server交互。 [cp…

利用多線程實現linux下C語言的聊天室程序:

轉載&#xff1a;http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多線程實現linux下C語言的聊天室程序&#xff1a; 客戶端代碼&#xff1a; threadsend線程負責客戶端消息的發送&#xff1b; threadrecv線程負責客戶端接受服務器端的消息。 [html] v…

Linux系統編程(七)消息隊列

Linux系統編程&#xff08;七&#xff09;消息隊列一、什么是消息隊列二、消息隊列內部原理三、實現消息隊列的收發1.發送消息隊列2.接收消息隊列四、消息隊列與命名管道的比較一、什么是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都…

基于Linux的SOCKET編程之TCP半雙工Client-Server聊天程序

轉自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所謂半雙工通信&#xff0c;即通信雙方都可以實現接發數據&#xff0c;但是有一個限制&#xff1a;只能一方發一方收&#xff0c;之后交換收發對…

Linux系統編程(八)線程

Linux系統編程&#xff08;八&#xff09;線程一、什么是線程&#xff1f;二、Linux內核線程實現原理線程共享資源線程非共享資源線程優缺點線程控制原語一、什么是線程&#xff1f; LWP&#xff1a;light weight process 輕量級的進程&#xff0c;本質仍是進程(在Linux環境下…

智能算法(GA、DBO等)求解阻塞流水車間調度問題(BFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

Linux socket編程,對套接字進行封裝

轉自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系統編程(九)線程同步

Linux系統編程&#xff08;九&#xff09;線程同步一、什么是線程同步&#xff1f;二、互斥量三、條件變量pthread_cond_wait函數pthread_cond_signal函數生產者和消費者模型一、什么是線程同步&#xff1f; 線程同步&#xff0c;指一個線程發出某一功能調用時&#xff0c;在沒…

linux網絡編程(一)網絡基礎傳輸知識

linux網絡編程&#xff08;一&#xff09;網絡傳輸基礎知識一、什么是協議&#xff1f;二、使用步驟典型協議2.網絡應用程序設計模式C/S模式B/S模式優缺點3.分層模型4.TCP/IP四層模型通信過程5.協議格式數據包封裝以太網幀格式ARP數據報格式IP段格式UDP數據報格式TCP數據報格式…

linux網絡編程:使用多進程實現socket同時收發數據

轉載&#xff1a;http://blog.csdn.net/li_wen01/article/details/52685844 前面已講過使用一個進程實現服務端和客戶端P2P通信的實例&#xff0c;但是它只能同時處理一個客戶端的連接。如果要實現并發處理多個客戶端的連接并且實現P2P通信&#xff0c;可以使用多進程來處理。相…

Linux 進程學習(四)------ sigaction 函數

轉自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函數&#xff1a; signal 函數的使用方法簡單&#xff0c;但并不屬于 POSIX 標準&#xff0c;在各類 UNIX 平臺上的實現不盡相同&#xff0c;因此其用途受 到了一定的限制…

linux網絡編程(二)高并發服務器

linux網絡編程&#xff08;二&#xff09;高并發服務器錯誤處理高并發服務器多進程并發服務器客戶端錯誤處理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…

linux知識(一) 程序、進程與線程

linux知識&#xff08;一&#xff09; 程序、進程與線程程序進程程序如何變成進程&#xff1f;線程線程與進程fork和創建新線程的區別優點程序 程序&#xff1a;程序是已編譯好的二進制文件&#xff0c;存儲在磁盤中&#xff0c;不占用系統資源 程序包括&#xff1a; RO段&am…

linux 信號signal和sigaction理解

轉載&#xff1a;http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp時發現之前對signal到理解實在淺顯&#xff0c;今天拿來單獨學習討論下。 signal&#xff0c;此函數相對簡單一些&#xff0c;給定一個信號&#xff0c;給出信號處理函數則可&#xff…

linux知識(二)互斥量、信號量和生產者消費者模型

linux知識&#xff08;二&#xff09;互斥量、信號量和生產者消費者模型一、互斥量產生原因二、信號量生產者消費者模型一、互斥量 產生原因 使用多線程常常會碰到數據混亂的問題&#xff0c;那么使用互斥量&#xff0c;相當于“加鎖”的操作&#xff0c;將有助于解決數據混亂…

基于Linux的Socket編程之TCP全雙工Server-Client聊天程序

轉載&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a40613cfe1 一、引言&#xff1a; 由于accept函數、read、write、recv、send等函數都是是阻塞式的&#xff0c;在同一個進程之中&#xff0c;只要有任何一個…

數據結構(一)線性表

數據結構&#xff08;一&#xff09;線性表一、線性表定義二、順序表定義動態數組三、單鏈表定義不帶頭結點帶頭結點頭結點與不帶頭結點的區別頭插法與尾插法雙鏈表循環鏈表循環單鏈表循環雙鏈表靜態鏈表一、線性表定義 線性表是具有相同數據類型的n個數據元素的有限序列 特點…

linux網絡編程(二)TCP通訊狀態

linux網絡編程&#xff08;二&#xff09;TCP通訊狀態TCP狀態轉換為什么需要等待2MSL&#xff1f;端口復用TCP狀態轉換 tcp協議連接開始會經過三次握手&#xff0c;客戶端和服務器開始都會處于CLOSED狀態 第一次握手&#xff1a;客戶端會先發送SYN請求給服務器&#xff0c;客戶…

gethostbyname() 函數說明

轉載&#xff1a;http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函數說明——用域名或主機名獲取IP地址 包含頭文件 #include <netdb.h> #include <sys/socket.h> 函數原型 struct hostent *gethostbyna…

linux網絡編程(三)select、poll和epoll

linux網絡編程&#xff08;三&#xff09;select、poll和epoll一、為什么會有多路I/O轉接服務器&#xff1f;二、select三、poll三、epoll一、為什么會有多路I/O轉接服務器&#xff1f; 為什么會有多路I/O轉接服務器呢&#xff1f;在學這個之前&#xff0c;我們同使用的是多線…