Linux编程-Linux进程关系

Linux进程关系
一、Linux终端登陆流程
(1)内核进程启动(进程ID 0)
(2)内核启动init进程(进程ID 1)
(3)init进程读取(Linux-/etc/inittab、BSD-/etc/ttys),为每个登陆的终端fork子进程,并通过exec启动getty程序
(4)getty子进程打开终端设备,获取登陆用户名,并通过execl执行login程序
(5)login程序获取登陆密码,加密后并与密码文件校验
(6)登陆成功后,将终端(以文件形式体现)所有者修改为当前用户,并设置相应的用户环境和权限。

二、Linux网络登陆流程
(1)内核进程启动(进程ID 0)
(2)内核启动init进程(进程ID 1)
(3)init通过shell执行/etc/rc脚本,sh脚本启动inetd(xinetd)网络服务进程
(4)inetd监听网络登陆请求,fork登陆进程,并执行登陆服务程序,如telnet
(5)telnet程序打开伪终端设备,并执行login程序(通过伪终端设备映射网络操作)
(6)登陆成功后,将终端(以文件形式体现)所有者修改为当前用户,并设置相应的用户环境和权限。

三、进程组及会话
进程组及会话用于对一些协同工作的进程进行作业控制
(1)pid_t getpgrp(void);
获取进程组ID

(2)pid_t setpgid(pid_t pid, pid_t pgid);
加入某个进程组,或者创建新进程组

(3)pid_t setsid(void)
创建新会话并创建新进程组

(4) pid_t getsid(pid);
获取回话ID

(5)会话控制指令
DELETE / Ctrl + C 中断信号
Ctrl + \ 退出信号
终端断开 挂断信号
测试用例:
void testPGrp()
{
pid_t pid = getpgrp();
printf("pgrp ID:%d\n", pid);

pid = getpid();
printf("pro id:%d\n", pid);

if (0 == fork())
{
pid = getpid();

if (-1 == setpgid(pid, pid))
{
printf("创建或加入进程组失败\n");
}

pid = getpgrp();
printf("new pgrp ID:%d\n", pid);

if (0 == fork()) //创建会话的进程不能为组长进程
{
pid = getsid(getpid());
printf("session id:%d\n", pid);

if (-1 == setsid())
{
printf("Create session failed\n");
return;
}

pid = getsid(getpid());
printf("new session id:%d\n", pid);
}
}
}

你可能感兴趣的:(Linux编程笔记)