目录
创建会话
创建会话的注意事项:
调用进程不能是进程组组长,该进程变成新会话首进程。
该进程成为一个新进程组的组长进程。
需有root权限,但是Ubuntu不需要。
新会话丢弃原有的控制终端,该会话没有控制终端。
该调用进程是组长进程,则出错返回。
建立新会话时,先调用fork, 父进程终止,子进程调用setsid()。
getsid
获取进程所属的会话ID。
man 2 getsid
参数pid
0:表示查看当前进程会话ID。
返回值
成功:返回调用进程的会话ID。
失败:-1。
setsid
创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID。调用了setsid函数的进程,既是新的会长,也是新的组长。
man 2 setsid
返回值
成功:返回调用进程的会话ID。
失败:-1。
测试代码1
用子进程创建一个会话。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t JinCheng_ID; //进程ID
JinCheng_ID = fork();
if (JinCheng_ID < 0)
{
perror("创建子进程错误");
exit(1);
}
else if (JinCheng_ID == 0) //子进程
{
printf("这是子进程,进程ID是%d。\n", getpid());
printf("组ID是%d。\n", getpgid(0));
printf("会话ID是%d。\n", getsid(0));
sleep(2);
printf("开始创建会话。\n");
setsid(); //创建会话
printf("创建会话完成。\n");
printf("这是子进程,进程ID是%d。\n", getpid());
printf("组ID是%d。\n", getpgid(0));
printf("会话ID是%d。\n", getsid(0));
}
return 0;
}
测试结果
守护进程
创建步骤:
用fork()创建子进程,让父进程终止。
子进程调用setsid()创建新会话。
通常根据需要,改变工作目录位置,使用chdir(),防止目录被卸载。
通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。
通常根据需要,关闭或者重定向文件描述符。
守护进程,业务逻辑。while(1)。
测试代码2
创建一个守护进程。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
pid_t JinCheng_ID; //进程ID
int flag, fd;
JinCheng_ID = fork();
if (JinCheng_ID < 0)
{
perror("创建子进程错误");
exit(1);
}
else if (JinCheng_ID == 0) //子进程
{
printf("这是子进程,进程ID是%d。\n", getpid());
printf("组ID是%d。\n", getpgid(0));
printf("会话ID是%d。\n", getsid(0));
sleep(2);
printf("开始创建会话。\n");
flag = setsid(); //创建会话
if (flag == -1)
{
perror("创建会话失败");
exit(1);
}
printf("创建会话完成。\n");
printf("这是子进程,进程ID是%d。\n", getpid());
printf("组ID是%d。\n", getpgid(0));
printf("会话ID是%d。\n", getsid(0));
flag = chdir("/home/cet/XiTong_BianCheng/28/ShouHu_JinCheng"); //改变工作目录位置
if (flag == -1)
{
perror("改变工作目录失败");
exit(1);
}
umask(0022); //改变文件访问权限
close(STDIN_FILENO); //关闭文件描述符0
fd = open("/dev/null", O_RDWR);
if (fd == -1)
{
perror("打开文件错误");
exit(1);
}
dup2(fd, STDOUT_FILENO); //重定向out
dup2(fd, STDERR_FILENO); //重定向err
while (1)
; //模拟守护进程
}
return 0;
}