(1)基础理论
进程组id = 父进程id,即父进程为组长进程
组长进程
组长进程标识: 其进程组ID==其进程ID
组长进程可以创建一个进程组,创建该进程组中的进程,然后终止
只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关
进程组生存期: 进程组创建到最后一个进程离开(终止或转移到另一个进程组)
一个进程可以为
自己或子进程设置进程组ID
setpgid()加入一个现有的进程组或创建一个新进程组
会话: 一个或多个进程组的集合
开始于用户登录
终止与用户退出
此期间所有进程都属于这个会话期
建立新会话:setsid()函数
该调用进程是组长进程,则出错返回
先调用fork, 父进程终止,子进程调用
该调用进程不是组长进程,则创建一个新会话
•该进程变成新会话首进程(session header)
•该进程成为一个新进程组的组长进程。
•该进程没有控制终端,如果之前有,则会被中断
组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程...
说明:当进程是会话的领头进程时setsid()调用失败并返回(-1)。setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和
进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。
pid_t pid = fork(); //fork a process
if (pid < 0) exit(0); //fork error
if (pid > 0) exit(0); //father process exit
//之前parent和child运行在同一个session里,parent是会话(session)的领头进程,
//parent进程作为会话的领头进程,如果exit结束执行的话,那么子进程会成为孤儿进程,并被init收养。
//执行setsid()之后,child将重新获得一个新的会话(session)id。
//这时parent退出之后,将不会影响到child了。
守护进程编程步骤
1. 创建子进程,父进程退出
•
所有工作在子进程中进行
•
形式上脱离了控制终端
2. 在子进程中创建新会话
•
setsid()函数
•
使子进程完全独立出来,脱离控制
3. 改变当前目录为根目录
•
chdir()函数
•
防止占用可卸载的文件系统
•
也可以换成其它路径
4. 重设文件权限掩码
•
umask()函数
•
防止继承的文件创建屏蔽字拒绝某些权限
•
增加守护进程灵活性
5. 关闭文件描述符
•
继承的打开文件不会用到,浪费系统资源,无法卸载
•
getdtablesize()
•
返回所在进程的文件描述符表的项数,即该进程打开的文件数目
(2)进程的状态
运行状态:running和就绪(等待CPU调度)
sleep:可中断(资源或信号),不可中断(资源满足是唤醒)
暂停状态:多用于程序调试
僵尸进程:子进程退出时,父进程没有出来子进程SIGCHLD信号
(3)进程优先级
包括默认优先级和谦退值(-20--19),越小越大,nic函数,setpriority函数可以设置
(4)环境参数获取
int main(int argc,char **argv,char** env),环境变量获取env
使用getopt,getopt_long获取-name -value数据
(5)进程创建
fork系统调用,-1返回失败,0子进程,>0 父进程
exec,execl,execv等调用,子进程和父进程同id
system系统调用,原来先fork,再exec
(6)进程退出
exit,--exit不带缓冲
wait等待子进程退出,函数参考wait,WIFEXITED,WIFSIGNALED,WEXITEDSTATUS,WTERMSIG
(7)信号处理
root@bt:/home/c/pro# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
SIGHUP--->终端退出
SIGINT---->CTRL+C
SIGQUIT----->CTRL+|,core转存
SIGCHLD----->子进程退出
SIGALRM---->使用alarm设置超时产生
信号使用:
(1)信号处理函数 void sighandle(int sig);
(2)安装signal(sig,sighandle);
带附件信息的函数 sigaction
信号发送kill,sigqueue(能带附加信息)
信号阻塞:
// 屏蔽掉SIGINT 信号,将不能再捕捉SIGINT
sigset_t sigSet;
sigemptyset(&sigSet);
sigaddset(&sigSet,SIGINT);
sigprocmask(SIG_BLOCK,&sigSet,NULL);
sigset_t sigSet;
sigemptyset(&sigSet);
sigaddset(&sigSet,SIGINT);
sigprocmask(SIG_BLOCK,&sigSet,NULL);