Linux系統編程---11(會話,守護進程,創建守護進程)

會話

創建會話

創建一個會話需要注意以下6點注意事項

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

getsid 函數

獲取進程所屬的會話ID
pid_t getsid(pid_t pid); 成功:返回調用進程的會話 ID;失敗:-1,設置 errno
pid 為 0 表示察看當前進程 session ID
ps ajx 命令查看系統中的進程。

  1. 參數 a 表示不僅列當前用戶的進程,也列出所有其他用戶的進程,
  2. 參數 x 表示 不僅列有控制終端的進程,也列出所有無控制終端的進程,
  3. 參數 j 表示列出與作業控制相關的信息。
    組長進程不能成為新會話首進程,新會話首進程必定會成為組長進程。

setsid 函數

創建一個會話,并以自己的 ID 設置進程組 ID,同時也是新會話的 ID。
pid_t setsid(void); 成功:返回調用進程的會話 ID;失敗:-1,設置 errno
調用了 setsid 函數的進程,既是新的會長,也是新的組長。

練習: fork 一個子進程,并使其創建一個新會話。查看進程組 ID、會話 ID 前后變化
#include<stdlib.h>
#include<unistd.h>int main(void)
{pid_t pid;if((pid = fork()< 0)){perror("fork");exit(1);}else if(pid == 0){ printf("child process PID is %d\n",getpid());printf("Group ID of child is %d\n",getpgid(0));printf("Session ID of child is %d\n",getsid(0));sleep(10);setsid();  //子進程非組長進程,故其成為新會話首進程,且成為組長進程。該進
程id即為會話進程printf("Changed:\n");printf("child process PID is %d\n",getpid());printf("Group ID of child is %d\n",getpgid(0));printf("Session ID of child is %d\n",getsid(0));sleep(20);exit(0);                                                                 }   return 0;
}

結果:
在這里插入圖片描述

守護進程

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

創建守護進程

  1. 創建子進程,父進程退出
    所有工作在子進程中進行形式上脫離了控制終端

  2. 在子進程中創建新會話
    setsid()函數
    使子進程完全獨立出來,脫離控制

  3. 改變當前目錄為根目錄
    chdir()函數
    防止占用可卸載的文件系統
    也可以換成其它路徑

  4. 重設(指定)文件權限掩碼
    umask()函數
    防止繼承的文件創建屏蔽字拒絕某些權限
    增加守護進程靈活性

  5. 將0/1/2重定向/dev/null dup2()關閉文件描述符
    繼承的打開文件不會用到,浪費系統資源,無法卸載

  6. 開始執行守護進程核心工作

  7. 守護進程退出處理程序模型

     #include<stdio.h>#include<unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>                                                                                                                                                                                               void mydaemond(void){pid_t pid,sid;int ret;pid = fork();if(pid > 0){ //父進程退出return 0;}   //創建會話sid = setsid();ret = chdir("/home/itcast/"); if( ret == -1 ){perror("chdir error");exit(1);}   umask(0022);close(STDOUT_FILENO);open("/dev/null",O_RDWR);dup2(0,STDOUT_FILENO);dup2(0,STDERR_FILENO);}int main(void){mydaemond();while(1){}return 0;}                                   
    

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

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

相關文章

判斷一段文件是UTF-8編碼還是GB2312的編碼方式

分類&#xff1a; 算法 cpp2012-03-10 16:01 7120人閱讀 評論(2) 收藏 舉報null生活c對于只包含中文和英文的文本中判斷編碼方式是非常簡單的&#xff0c;中文的編碼方式最常用的是GBK&#xff0c;字符集更大的如GBK向下兼容GB2312&#xff0c;其中包含的的很多一部分字符是我們…

判斷文件的編碼方式

/*功能&#xff1a;實現文件編碼格式的判斷通過一個文件的最前面三個字節&#xff0c;可以判斷出該的編碼類型&#xff1a;ANSI&#xff1a;        無格式定義&#xff1b;(第一個字節開始就是文件內容)Unicode&#xff1a;       前兩個字節為FFFE&#xff1b;…

Linux系統編程----12(線程概念,Linux線程實現原理,棧中ebp指針和ebp指針,線程的優缺點和共享資源)

線程概念 什么是線程 在一個程序里的一個執行路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“一個進程內部的控制序列” 一切進程至少都有一個執行線程線程在進程內部運行&#xff0c;本質是在進程地址空間內運行在Linux系統中&#xff0…

Linux系統編程---13(線程控制函數,創建線程,循環創建多個線程,線程間共享全局變量)

線程控制 操作系統并沒有提供創建線程的系統調用接口&#xff0c;因此大佬們封裝了一個線程的接口庫實現線程控制。意為著用戶創建線程都使用的是庫函數&#xff08;所以有時候我們說創建的線程是一個用戶態線程&#xff0c;但是在內核中對應有一個輕量級進程實現線程程序的調…

Linux系統編程---14(回收子線程,回收多個子線程,線程分離,殺死線程)

回收子線程 pthread_join 函數 阻塞等待線程退出&#xff0c;獲取線程退出狀態 其作用&#xff0c;對應進程中 waitpid() 函數。 int pthread_join (pthread_t thread,void** retval); 成功&#xff1a;0&#xff0c;失敗&#xff1a;錯誤號 參數&#xff1a;thread&#x…

Linux系統編程----15(線程與進程函數之間的對比,線程屬性及其函數,線程屬性控制流程,線程使用注意事項,線程庫)

對比 進程 線程 fork pthread_create exit (10) pthread_exit &#xff08;void *&#xff09; wait (int *) pthread_join &#xff08;&#xff0c;void **&#xff09;阻塞 kill pthread_cancel ();必須到取消點&#xff08;檢查點&#xff09;&#xff1a;…

內核雙向循環鏈表

#include <string.h>#include <stdio.h>#include <stdlib.h>#include<malloc.h>#include <arpa/inet.h>//鏈表頭結構struct list_head{struct list_head *next,*prev;};//真正實現鏈表插入操作void _list_add(struct list_head *nnew,struct lis…

Linux系統編程----16(線程同步,互斥量 mutex,互斥鎖的相關函數,死鎖,讀寫鎖)

同步概念 所謂同步&#xff0c;即同時起步&#xff0c;協調一致。不同的對象&#xff0c;對“同步”的理解方式略有不同。如&#xff0c;設備同步&#xff0c;是指在兩 個設備之間規定一個共同的時間參考&#xff1b;數據庫同步&#xff0c;是指讓兩個或多個數據庫內容保持一致…

轉移字符的轉換

使得網頁上不會顯示 \x0a\x0a \x0a \x0a \x0a \x0a 類似的字符static int te_escape_isDec(char *ptr, unsigned int len) { …

Linux系統編程---17(條件變量及其函數,生產者消費者條件變量模型,生產者與消費者模型(線程安全隊列),條件變量優點,信號量及其主要函數,信號量與條件變量的區別,)

條件變量 條件變量本身不是鎖&#xff01;但它也可以造成線程阻塞。通常與互斥鎖配合使用。給多線程提供一個會合的場所。 主要應用函數&#xff1a; pthread_cond_init 函數pthread_cond_destroy 函數pthread_cond_wait 函數pthread_cond_timedwait 函數pthread_cond_signa…

好友

http://blog.csdn.net/liangyuannao/article/details/8583139

Linux系統編程---18(線程池相關概念及其實現)

線程池 概念&#xff1a; 一堆線程任務隊列 作用 避免大量線程頻繁的創建/銷毀時間成本避免瞬間大量線程創建耗盡資源&#xff0c;程序崩潰危險 實現 創建固定數量的線程創建一個線程安全的任務隊列 一種線程使用模式。 線程過多會帶來調度開銷&#xff0c;進而影響緩…

設計模式--1(設計模式基礎,設計模式基本原則,設計模式分類)

設計模式基礎 模式 在一定環境中解決某一問題的方案&#xff0c;包括三個基本元素–問題&#xff0c;解決方案和環境。大白話&#xff1a;在一定環境下&#xff0c;用固定套路解決問題。 設計模式 是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使…

source insight 使用技巧

source insight 使用技巧 1 sourceinsight screen font 的默認字體是Verdana的&#xff0c;它是一直變寬字體。在Document style中可以將字體改為定寬的Courier2 document options->auto indent 去掉indent Open Brace和Indent Close Brace的效果: 繼上一段&#xff0c;在…

設計模式----2(簡單工廠模式的概念,簡單工廠模式的實現,簡單工廠模式的優缺點)

簡單工廠模式 簡單工廠模式的概念 簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負 責創建其他類的實例&#xff0c;被創建的實例通常都具有共同的父類。 具體分類 工廠&#xff08;Creator&#xff09;角色 簡單工廠模式的核心&#xff0…

Redis常見問題及其一些重點知識總結

1、什么是 Redis&#xff1f;簡述它的優缺點&#xff1f; Redis 的全稱是&#xff1a;Remote Dictionary.Server&#xff0c;本質上是一個 Key-Value 類型的內存數據庫&#xff0c;很像 memcached&#xff0c;整個數據庫統統加載在內存當中進行操作&#xff0c;定期通過異步操…

shell生成隨機文件名

1 #!/bin/bash 2 # tempfile-name.sh: 臨時文件名產生器 3 4 BASE_STRmcookie # 32-字符的 magic cookie. 5 POS11 # 字符串中隨便的一個位置. 6 LEN5 # 取得 $LEN 長度連續的字符串. 7 8 prefixtemp # 最終的一個臨時文…

設計模式---3(工廠方法模式的概念,工廠方法模式的實現,工廠方法模式和簡單工廠模式比較)

工廠方法模式 概念 工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。 工廠方法模式的意義 定義一個創建產品對象的工廠接口&#xff0c;將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建&#xff0c;這樣核心類成為一個抽象工廠角色&#xff0c;僅…

設計模式---4(抽象工廠模式的概念,產品組和產品等級的概念,抽象工廠模式的實現)

抽象工廠模式 抽象工廠模式的概念 抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口&#xff0c;使得客戶端在不必指定產品的具體類型的情況下&#xff0c;能夠創建多個產品 族的產品對象。 抽象工廠的角色及其職責 抽象工…

Win32項目關于MessageBox參數的詳細說明

函數功能&#xff1a;該函數創建、顯示、和操作一個消息框。消息框含有應用程序定義的消息和標題&#xff0c;加上預定義圖標與Push&#xff08;下按&#xff09;按鈕的任何組合。 函數原型&#xff1a;int MessageBox(HWND hWnd,LPCTSTR IpCaption,UINT…