日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程?

發布時間:2025/3/12 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

守護進程

概念:

守護進程,也就是通常所說的Daemon進程,是Linux中的后臺服務進程。周期性的執行某種任務或等待處理某些發生的事件。

Linux系統有很多守護進程,大多數服務都是用守護進程實現的。比如:像我們的tftp,samba,nfs等相關服務。

UNIX的守護進程一般都命名為*d的形式,如httpd,telnetd等等。

生命周期:

守護進程會長時間運行,常常在系統啟動時就開始運行,直到系統關閉時才終止。

守護進程不依賴于終端

從終端開始運行的進程都會依附于這個終端,這個終端稱為這些進程的控制終端。當控制終端被關閉時,相應的進程都會被自動關閉。咱們平常寫進程時,一個死循環程序,咱們不知道有ctrl+c的時候,怎么關閉它呀,是不是關閉終端呀。也就是說關閉終端的同時也關閉了我們的程序,但是對于守護進程來說,其生命周期守護需要突破這種限制,它從開始運行,直到整個系統關閉才會退出,所以守護進程不能依賴于終端。

查看守護進程

ps axj a: 顯示所有 x:顯示沒有控制終端的進程 j:顯示與作業有關的信息(顯示的列):會話期ID(SID),進程組ID(PGID),控制終端(TT),終端進程組ID(TRGID)

? 所有的守護進程都是以超級用戶啟動的(UID為0); ? 沒有控制終端(TTY為?); ? 終端進程組ID為-1(TPGID表示終端進程組ID,該值表示與控制終端相關的前臺進程組,如果未和任何終端相關,其值為-1; ? 所有的守護進程的父進程:

歷史上,Linux?的啟動一直采用init進程;下面的命令用來啟動服務。這種方法有兩個缺點:1.?啟動時間長。init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。2.?啟動腳本復雜。init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。

Systemd 就是為了解決這些問題而誕生的。它的設計目標是,為系統的啟動和管理提供一套完整的解決方案。根據 Linux 慣例,字母d是守護進程(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。

進程組、會話、控制終端

? 進程組

shell里的每個進程都屬于一個進程組,創建進程組的目的是用于簡化向組內所有進程發送信號的操作,即如果一個信號是發給一個進程組,則這個組內的所有進程都會受到該信號【方便管理】。

? PGID進程組ID

進程組內的所有進程都有相同的PGID,等于該組組長的PID。(進程組組長:進程組中有一個進程擔當組長。進程組ID(PGID)等于進程組組長的進程ID。已知一個進程,要得到該進程所屬的進程組ID可以調用getpgrp。一個進程可以通過另一個系統調用setpgrp來加入一個已經存在的進程組或者創建一個新的進程組。

如果內核支持_POSIX_JOB_CONTROL(該宏被定義)則內核會為Shell 上的每一條命令行(可能由多個命令通過管道等連接)創建一個進程組。從這點上看,進程組不是進程的概念,而是shell上才有,所以在task_struct里并沒有存儲進程組id之類的變量。

進程組的生命周期到組中最后一個進程終止或其加入其他進程組(離開本進程組)為止。

會話

一般一個用戶登錄后新建一個會話,每個會話也有一個ID來標識(SID)。登錄后的第一個進程叫做會話領頭進程(session leader),通常是一個shell/bash。對于會話領頭進程,其PID=SID。

控制終端

一個會話一般會擁有一個控制終端用于執行IO操作。會話的領頭進程打開一個終端之后, 該終端就成為該會話的控制終端。與控制終端建立連接的會話領頭進程也稱為控制進程 (controlling process) 。一個會話只能有一個控制終端。

前臺進程組

該進程組中的進程能夠向終端設備進行讀、寫操作的進程組。例如登陸shell(例如bash)通過調用int tcsetpgrp(int fd, pid_t pgrp); 函數設置為某個進程組pgrp關聯終端設備fd,該函數執行成功后,該進程組pgrp成為前臺進程組。

后臺進程組

該進程組中的進程只能夠向終端設備寫。

終端進程組ID

每個進程還有一個屬性,終端進程組ID(TPGID),用來標識一個進程是否處于一個和終端相關的進程組中。前臺進程組中的進程的TPGID=PGID,后臺進程組的PGID≠TPGID。若該進程和任何終端無關,其值為-1。通過比較他們來判斷一個進程是屬于前臺進程組,還是后臺進程組。

進程組、對話期和控制終端關系

進程組、對話期和控制終端關系

  • 每個會話有且只有一個前臺進程組,但會有0個或者多個后臺進程組。
  • 產生在控制終端上的輸入(Input)和信號(Signal)將發送給會話的前臺進程組中的所有進程。對于輸出(Output)來說,則是在前臺和后臺共享的,即前臺和后臺的打印輸出都會顯示在屏幕上。
  • 終端上的連接斷開時 (比如網絡斷開或 Modem 斷開), 掛起信號將發送到控制進程(controlling process) 。
  • 一個用戶登錄后創建一個會話。一個會話中只存在一個前臺進程組,但可以存在多個后臺進程組。第一次登陸后第一個創建的進程是shell,也就是會話的領頭進程,該領頭進程缺省處于一個前臺進程組中并打開一個控制終端可以進行數據的讀寫。當在shell里運行一行命令后(不帶&)創建一個新的進程組,命令行中如果有多個命令會創建多個進程,這些進程都處于該新建進程組中,shell將該新建的進程組設置為前臺進程組并將自己暫時設置為后臺進程組。
  • 舉例

  • 打開第一個終端執行命令:
  • ping?127.0.0.1?-aq?|?grep?icmp?&??//?通過管道將兩個命令串接起來ping?–q不顯示timeout信息,將其設置到后臺并running
  • 在第一個終端繼續執行命令,在前臺再新建一個進程組。【注意沒有&】
  • ping?127.0.0.1?-aq?|?grep?icmp?//在前臺再新建一個進程組,
  • 開啟第二個終端并運行
  • ?ps?axj?|?grep?pts/0??????即過濾只看pts/0里的會話?PPID???PID??PGID???SID?TTY??????TPGID?STAT???UID???TIME?COMMAND?2109??2111??2111??2111?pts/0?????2538?Ss????1000???0:01?bash?2111??2503??2503??2111?pts/0?????2538?S?????1000???0:00?ping?127.0.0.1?-aq?2111??2504??2503??2111?pts/0?????2538?S?????1000???0:00?grep?--color=auto?icmp?2111??2538??2538??2111?pts/0?????2538?S+????1000???0:00?ping?127.0.0.2?-aq?2111??2539??2538??2111?pts/0?????2538?S+????1000???0:00?grep?--color=auto?timeo

    ? SID都是2111,說明大家都在一個Session里 ? 有三個進程組PGID 2111,2503和2538。 我們可以看到用|連起來的ping和grep是在一個進程組里的。 ? 2538這個進程組是一個前臺的進程組,因為其PGID==TGPID, 2503這個進程組是一個后臺進程組

  • 在第一個終端中執行Ctrl+C
  • 在第二個終端里繼續ps axj | grep pts/0
  • ?PPID???PID??PGID???SID?TTY??????TPGID?STAT???UID???TIME?COMMAND?2109??2111??2111??2111?pts/0?????2111?Ss+???1000???0:01?bash?2111??2503??2503??2111?pts/0?????2111?S?????1000???0:00?ping?127.0.0.1?-aq?2111??2504??2503??2111?pts/0?????2111?S?????1000???0:00?grep?--color=auto?icmp

    ? 2538那個前臺進程組的所有進程都消失了,說明信號會發給前臺進程組的所有進程 ? 2111,即bash所在的那個進程組成為了前臺進程組。

    守護進程創建流程

    守護進程創建流程如下:

    1.?創建子進程,父進程退出?2.?在子進程中創建新會話?3.?改變當前目錄為根目錄?4.?重設文件權限掩碼?5.?關閉文件描述符?

    1.創建子進程,父進程退出

    由于守護進程是脫離控制終端的,因此,完成第一步后就會在shell終端里造成一程序已經運行完畢的假象。之后的所有后續工作都在子進程中完成,而用戶在shell終端里則可以執行其他的命令,從而在形式上做到了與控制終端的脫離。

    由于父進程已經先于子進程退出,會造成子進程沒有父進程,從而變成一個孤兒進程。在Linux中,每當系統發現一個孤兒進程,就會自動由1號進程收養。原先的子進程就會變成init進程的子進程。

    2. 在子進程中創建新會話

    setsid()函數的作用。一個進程調用setsid()函數后,會發生如下事件:

    ??首先內核會創建一個新的會話,并讓該進程成為該會話的leader進程,??同時伴隨該session的建立,一個新的進程組也會被創建,同時該進程成為該進程組的組長。??該進程此時還沒有和任何控制終端關聯。若需要則要另外調用tcsetpgrp,前面講前臺進程組時介紹過。

    調用setsid()有以下3個作用:

    ??讓進程擺脫原會話的控制。??讓進程擺脫原進程組的控制。??讓進程擺脫原控制終端的控制。

    那么,在創建守護進程時為什么要調用setsid()函數呢?

    讀者可以回憶一下創建守護進程的第一步,在那里調用了fork()函數來創建子進程再令父進程退出。由于在調用fork()函數時,子進程全盤復制了父進程的會話期、進程組和控制終端等,雖然父進程退出了,但原先的會話期、進程組和控制終端等并沒有改變,因此,還不是真正意義上的獨立。而setsid()函數能夠使進程完全獨立出來,從而脫離所有其他進程和終端的控制。

    詳細見man 2 setsid。

    3.改變當前目錄為根目

    這一步也是必要的步驟。使用fork()創建的子進程繼承了父進程的當前工作目錄。

    由于在進程運行過程中,當前目錄所在的文件系統(如“/mnt/usb”等)是不能卸載的,這對以后的使用會造成諸多的麻煩(如系統由于某種原因要進入單用戶模式)。

    因此,通常的做法是讓“/”作為守護進程的當前工作目錄,這樣就可以避免上述問題。當然,如有特殊需要,也可以把當前工作目錄換成其他的路徑,如/tmp。改變工作目錄的常見函數是chdir()。

    4. 重設文件權限掩碼

    文件權限掩碼是指屏蔽掉文件權限中的對應位。

    例如,有一個文件權限掩碼是050,它就屏蔽了文件組擁有者的可讀與可執行權限。由于使用fork()函數新建的子進程繼承了父進程的文件權限掩碼,這就給該子進程使用文件帶來了諸多的麻煩。

    因此,把文件權限掩碼設置為0,可以大大增強該守護進程的靈活性。設置文件權限掩碼的函數是umask()。在這里,通常的使用方法為umask(0)。即賦予最大的能力。

    5. 關閉文件描述符

    同文件權限掩碼一樣,用fork()函數新建的子進程會從父進程那里繼承一些已經打開的文件。這些被打開的文件可能永遠不會被守護進程讀或寫,但它們一樣消耗系統資源,而且可能導致所在的文件系統無法被卸載。

    在上面的第(2)步之后,守護進程已經與所屬的控制終端失去了聯系,因此,從終端輸入的字符不可能達到守護進程,守護進程中用常規方法(如printf())輸出的字符也不可能在終端上顯示出來。

    所以,文件描述符為0、1和2的3個文件(常說的輸入、輸出和報錯這3個文件)已經失去了存在的價值,也應被關閉。

    代碼實現

    /*?關注一口Linux*/#include??#include??#include??#include?#include?#include??#include?#include?int?main(){?pid_t?pid;?int?i,?fd;?char?*buf?=?"This?is?a?Daemon";?pid?=?fork();?if?(pid??0)?{??exit(0);??}?/*?第二步?*/?setsid();?/*?第三步?*/???chdir("/");???/*?第四步?*/?umask(0);?/*?第五步?*/???for(i?=?0;?i?

    執行結果

    由上圖可見: ? 守護進程./run 的UID為0; ? 沒有控制終端(TTY為?); ? 終端進程組ID為-1; ? 守護進程的父進程為1516,即systemd。

    更多Linux干貨,請關注: 一口Linux

    總結

    以上是生活随笔為你收集整理的potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 影音先锋欧美资源 | 久久综合色鬼 | 一级做a爱片性色毛片 | 国产又黄又粗又长 | 亚洲一二区 | 一级淫片免费 | 国产成人无码精品久久久性色 | 黄色自拍视频 | 激情欧美亚洲 | 黄色小视频国产 | 日韩在线观看视频一区二区 | 无码人妻精品一区二区蜜桃色欲 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 女久久| 性欧美8khd高清极品 | 一级黄色片国产 | 日韩a级黄色片 | 99久久久久久 | 国产精品一区二区av白丝下载 | 国产成人精品免高潮在线观看 | 国产精品mm | 美女视频黄色在线观看 | 九九热视频精品在线观看 | 欧美国产视频 | 成人av在线网址 | 精品影片一区二区入口 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 欧美成人精品在线观看 | 黄频在线免费观看 | 欧美在线视频不卡 | 亚洲va在线观看 | 成熟丰满熟妇高潮xxxxx视频 | 少妇的被肉日常np | 国产精品一区二区免费在线观看 | 涩涩成人网| 欧美精品一区二区久久婷婷 | xxxx.国产| 五月婷婷七月丁香 | 日韩精品一区在线播放 | 日本免费无人高清 | 一边摸一边抽搐一进一出视频 | 99国产精品久久久久久久成人热 | 中文字幕视频免费观看 | 久射久| 欧美亚洲综合一区 | 成人在线免费av | 国产精品亚洲无码 | 密乳av | 超级变态重口av番号 | 性人久久久久 | 黑人激情视频 | 看毛片看毛片 | 怡红院最新网址 | av在线综合网 | 国产精品中文字幕在线观看 | 中文字幕在线看人 | 福利国产片 | aaaa毛片 | 性史性dvd影片农村毛片 | 免费高清欧美大片在线观看 | 中文字幕一区在线播放 | 日本一区二区不卡在线 | 日韩中文字幕亚洲精品欧美 | 电影《两个尼姑》免费播放 | 中文人妻熟妇乱又伦精品 | 亚洲第一看片 | 一区二区福利视频 | 熟女高潮一区二区三区 | 美国特色黄a大片 | 网友自拍咪咪爱 | 精品福利三区3d卡通动漫 | 懂色av中文字幕 | 免费天堂av| 国产女人高潮的av毛片 | 免费观看av网址 | 国外av网站 | 草草草在线 | 欧美黄色大片免费看 | 欧美一二三视频 | 亚洲小视频 | 狠狠干狠狠爱 | 日本一区二区免费在线观看 | 国产经典久久 | 在线a毛片 | 五月婷婷综 | va视频在线观看 | 手机看片日韩国产 | 国产午夜福利100集发布 | 嫩草视频在线播放 | 久久综合欧美 | 国产av不卡一区二区 | 18黄暴禁片在线观看 | 国产精品电影网 | 一区二区三区四区在线视频 | va婷婷在线免费观看 | 久久国语 | 内谢少妇xxxxx8老少交视频 | 久久97| 免费观看视频一区二区 |