1、子进程(非组长)创建会话
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
void sys_error(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
// 会话的创始人只能是小平民
// 1、fork()
pid_t pid, spid;
pid = fork();
if (pid == -1)
sys_error("fork error");
else if (pid > 0)
{
// 父进程
printf("parent %d, group %d, session %d\n", getpid(), getpgrp(), getsid(getpid()));
}
else
{
// 子进程--可以创建会话的
printf("son %d, parent %d, group %d, session %d\n", getpid(), getppid(), getpgid(getpid()), getsid(getpid()));
sleep(10); // 2、父进程先终止
// 3、创建会话(ubuntu不要root权限)
spid = setsid();
if (spid == -1)
sys_error("setsid error");
printf("son %d, parent %d, group %d, session %d\n", getpid(), getppid(), getpgid(getpid()), getsid(getpid()));
while (1);
}
return 0;
}
2、守护进程的搭建
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
void sys_error(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
// 1、fork()创建子进程--父进程终止
int ret;
pid_t pid, spid;
pid = fork();
if (pid == -1)
sys_error("fork error");
else if (pid > 0)
{
// 父进程
}
else
{
// 子进程
sleep(5);
// 2、子进程setsid()创建1个会话---没有控制终端的---小平民 = 组长 + 会长
spid = setsid();
if (spid == -1)
sys_error("child setsid error");
// 3、根据需要, chdir()更改工作目录位置 // 防止目录被卸载--服务器崩了
ret = chdir("/");
if (ret == -1)
sys_error("child chdir / error");
// 4、根据需要, umask()重设文件掩码---为了创建新文件时有足够权限
umask(0000); // 满权限
// 5、根据需要, 关闭012文件描述符---没有控制终端---不与用户交互
ret = close(STDIN_FILENO);
if (ret == -1)
sys_error("child close STDIN_FILENO error");
ret = close(STDOUT_FILENO);
if (ret == -1)
sys_error("child close STDOUT_FILENO error");
ret = close(STDERR_FILENO);
if (ret == -1)
sys_error("child close STDERR_FILENO error");
// 6、执行守护进程的功能(服务器周期性的干啥事)
while (1);
}
return 0;
}