Linux系统编程---11(会话,守护进程,创建守护进程)
會話
創(chuàng)建會話
創(chuàng)建一個會話需要注意以下6點注意事項
getsid 函數(shù)
獲取進程所屬的會話ID
pid_t getsid(pid_t pid); 成功:返回調用進程的會話 ID;失敗:-1,設置 errno
pid 為 0 表示察看當前進程 session ID
ps ajx 命令查看系統(tǒng)中的進程。
組長進程不能成為新會話首進程,新會話首進程必定會成為組長進程。
setsid 函數(shù)
創(chuàng)建一個會話,并以自己的 ID 設置進程組 ID,同時也是新會話的 ID。
pid_t setsid(void); 成功:返回調用進程的會話 ID;失敗:-1,設置 errno
調用了 setsid 函數(shù)的進程,既是新的會長,也是新的組長。
練習: fork 一個子進程,并使其創(chuàng)建一個新會話。查看進程組 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; }結果:
守護進程
創(chuàng)建守護進程
創(chuàng)建子進程,父進程退出
所有工作在子進程中進行形式上脫離了控制終端
在子進程中創(chuàng)建新會話
setsid()函數(shù)
使子進程完全獨立出來,脫離控制
改變當前目錄為根目錄
chdir()函數(shù)
防止占用可卸載的文件系統(tǒng)
也可以換成其它路徑
重設(指定)文件權限掩碼
umask()函數(shù)
防止繼承的文件創(chuàng)建屏蔽字拒絕某些權限
增加守護進程靈活性
將0/1/2重定向/dev/null dup2()關閉文件描述符
繼承的打開文件不會用到,浪費系統(tǒng)資源,無法卸載
開始執(zhí)行守護進程核心工作
守護進程退出處理程序模型
#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;} //創(chuàng)建會話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;}總結
以上是生活随笔為你收集整理的Linux系统编程---11(会话,守护进程,创建守护进程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地什么时候开放
- 下一篇: 先科复读机如何链接手机