Linux系统编程---11(会话,守护进程,创建守护进程)
會(huì)話
創(chuàng)建會(huì)話
創(chuàng)建一個(gè)會(huì)話需要注意以下6點(diǎn)注意事項(xiàng)
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)程。
組長進(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)程
創(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育基地什么时候开放
- 下一篇: 先科复读机如何链接手机