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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统编程---11(会话,守护进程,创建守护进程)

發(fā)布時(shí)間:2023/11/30 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程---11(会话,守护进程,创建守护进程) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

會(huì)話

創(chuàng)建會(huì)話

創(chuàng)建一個(gè)會(huì)話需要注意以下6點(diǎn)注意事項(xiàng)

  • 調(diào)用進(jìn)程不能是進(jìn)程組組長,該進(jìn)程變成新會(huì)話首進(jìn)程
  • 該進(jìn)程成為一個(gè)新進(jìn)程組的組長進(jìn)程
  • 需要root權(quán)限(nbuntu不需要)
  • 新會(huì)話丟棄原有的控制終端,該會(huì)話沒有控制終端
  • 該調(diào)用進(jìn)程是組長進(jìn)程,則出錯(cuò)返回
  • 建立新會(huì)話時(shí),先調(diào)用fork,父進(jìn)程終止,子進(jìn)程調(diào)用setsid
  • getsid 函數(shù)

    獲取進(jìn)程所屬的會(huì)話ID
    pid_t getsid(pid_t pid); 成功:返回調(diào)用進(jìn)程的會(huì)話 ID;失敗:-1,設(shè)置 errno
    pid 為 0 表示察看當(dāng)前進(jìn)程 session ID
    ps ajx 命令查看系統(tǒng)中的進(jìn)程。

  • 參數(shù) a 表示不僅列當(dāng)前用戶的進(jìn)程,也列出所有其他用戶的進(jìn)程,
  • 參數(shù) x 表示 不僅列有控制終端的進(jìn)程,也列出所有無控制終端的進(jìn)程,
  • 參數(shù) j 表示列出與作業(yè)控制相關(guān)的信息。
    組長進(jìn)程不能成為新會(huì)話首進(jìn)程,新會(huì)話首進(jìn)程必定會(huì)成為組長進(jìn)程。
  • setsid 函數(shù)

    創(chuàng)建一個(gè)會(huì)話,并以自己的 ID 設(shè)置進(jìn)程組 ID,同時(shí)也是新會(huì)話的 ID。
    pid_t setsid(void); 成功:返回調(diào)用進(jìn)程的會(huì)話 ID;失敗:-1,設(shè)置 errno
    調(diào)用了 setsid 函數(shù)的進(jìn)程,既是新的會(huì)長,也是新的組長。

    練習(xí): fork 一個(gè)子進(jìn)程,并使其創(chuàng)建一個(gè)新會(huì)話。查看進(jìn)程組 ID、會(huì)話 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(); //子進(jìn)程非組長進(jìn)程,故其成為新會(huì)話首進(jìn)程,且成為組長進(jìn)程。該進(jìn) 程id即為會(huì)話進(jìn)程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; }

    結(jié)果:

    守護(hù)進(jìn)程

  • Daemon(精靈)進(jìn)程,是 Linux 中的后臺服務(wù)進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理 某些發(fā)生的事件。一般采用以 d 結(jié)尾的名字
  • Linux 后臺的一些系統(tǒng)服務(wù)進(jìn)程,沒有控制終端,不能直接和用戶交互。不受用戶登錄、注銷的影響,一直在運(yùn)行著,他們都是守護(hù)進(jìn)程。如:預(yù)讀入緩輸出機(jī)制的實(shí)現(xiàn);ftp 服務(wù)器;nfs 服務(wù)器等。
  • 創(chuàng)建守護(hù)進(jìn)程,最關(guān)鍵的一步是調(diào)用 setsid 函數(shù)創(chuàng)建一個(gè)新的 Session,并成為 SessionLeader。
  • 創(chuàng)建守護(hù)進(jìn)程

  • 創(chuàng)建子進(jìn)程,父進(jìn)程退出
    所有工作在子進(jìn)程中進(jìn)行形式上脫離了控制終端

  • 在子進(jìn)程中創(chuàng)建新會(huì)話
    setsid()函數(shù)
    使子進(jìn)程完全獨(dú)立出來,脫離控制

  • 改變當(dāng)前目錄為根目錄
    chdir()函數(shù)
    防止占用可卸載的文件系統(tǒng)
    也可以換成其它路徑

  • 重設(shè)(指定)文件權(quán)限掩碼
    umask()函數(shù)
    防止繼承的文件創(chuàng)建屏蔽字拒絕某些權(quán)限
    增加守護(hù)進(jìn)程靈活性

  • 將0/1/2重定向/dev/null dup2()關(guān)閉文件描述符
    繼承的打開文件不會(huì)用到,浪費(fèi)系統(tǒng)資源,無法卸載

  • 開始執(zhí)行守護(hù)進(jìn)程核心工作

  • 守護(hù)進(jìn)程退出處理程序模型

    #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){ //父進(jìn)程退出return 0;} //創(chuàng)建會(huì)話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;}
  • 總結(jié)

    以上是生活随笔為你收集整理的Linux系统编程---11(会话,守护进程,创建守护进程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。