赞
踩
进程组包含多个进程,进程组ID=第一个进程的ID(亦即组长进程ID)。
可使用
kill -SIGKILL -进程组ID
来杀死整个进程组的所有进程。
会话则是多个进程组。
举例:
然后利用ps -ajx
查看进程信息
(ps ajx 命令查看系统中的进程。参数 a 表示不仅列当前用户的进程,也列出所有其他用户的进程,参数 x 表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数 j 表示列出与作业控制相关的信息.)
/*
成功:返回调用进程的会话ID
失败:-1,并设置errno
*/
pid_t getsid(pid_t pid);//传入参数pid为0时,表示查看看当前进程的session ID
/*
成功:返回调用进程的会话ID
失败:-1,并设置errno
*/
pid_t setsid(void);//创建一个会话,并以自己的进程ID设置进程组和新会话的ID
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <pthread.h> void sys_err(const char* str) { perror(str); exit(1); } int main(int argc, char* argv[]) { pid_t pid; pid = fork(); if(pid < 0 ){ //fork失败 sys_err("fork error"); } else if( pid == 0 ) { //子进程 printf("I'm a child proc:%d\n", getpid()); printf("I'm a child, my group proc:%d\n", getpgid(pid)); printf("I'm a child, my session proc:%d\n", getsid(pid)); sleep(10); setsid();//利用该子进程创建新的会话 printf("session created:\n"); printf("I'm a child proc:%d\n", getpid()); printf("I'm a child, my group proc:%d\n", getpgid(pid)); printf("I'm a child, my session proc:%d\n", getsid(pid)); } else { //父进程 sleep(20);//父进程等待子进程结束后再执行 printf("I'm a parent proc:%d\n", getpid()); } return 0; }
Daemon进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,一般不与用户直接交互。一般采用以d结尾的名字。
不受用户登录注销影响。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <pthread.h> #include <fcntl.h> //STDIN_FILENO etc. #include <sys/stat.h> void sys_err(const char* str) { perror(str); exit(1); } int main(int argc, char* argv[]) { pid_t pid; int ret,fd; pid = fork(); //创建子进程 if(pid > 0) { //让父进程终止 exit(0); } pid = setsid(); //创建会话 if( pid == -1) { //处理创建会话失败的情形 sys_err("setsid error"); } ret = chdir("/home/"); //改变工作目录 if( ret == -1) { //处理改变工作目录失败的情形 sys_err("chdir error"); } umask(0022); //改变文件访问权限的掩码,在此设置为755 close(STDIN_FILENO); //关闭标准输入文件描述符 fd = open("/dev/null",O_RDWR); // fd-->0 if( fd == -1) { //处理改变工作目录失败的情形 sys_err("open error"); } dup2(fd, STDOUT_FILENO); //重定向标准输出 dup2(fd, STDERR_FILENO); //重定向标准错误输出 while(1); //模拟守护进程核心业务逻辑 return 0; }
执行后,可看到daemon为守护进程,进程号、进程组和会话号均相同。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。