一、进程组

只有当
最后一个进程
离开这个进程组的时候,该进程组才会消亡
杀死进程的时候,如果是进程组,可以一口气都杀掉
二、前台进程组
- bash(可以接受标准输入)
父进程是一个进程组的组长,子进程就是父进程创建出来的,父子进程是一个进程组的
三、创建进程组
- setpgid()
3.1 子进程来设置(子进程创建进程组,且当组长)

3.2 父进程来设置(子进程创建进程组,且当组长)

四、线程
4.1 PCB与TCB的比较
- 信号是发送给进程的,而不是线程
-
每个线程的LWP标识是不一样的
图解
线程中
Stack
是不共享的
图解
图解2
全局变量保存在
data段
4.2 线程之间的非共享资源

五、守护进程
- 代码实现(init_daemon()函数)
#include <stdio.h>
#include <unistd.h>
#include <cstdlib>
#include <time.h>
#include <sys/stat.h>
#include <sys/param.h>
void init_daemon()
{
pid_t pid = fork();
if (pid == 0)
{
setsid();
chdir("/");
umask(0000);
int i = 0;
for (; i < NOFILE; i ++ )
close(i);
}
if (pid > 0)
{
exit(0);
}
else if (pid == -1)
{
perror("fork error");
}
}
int main(int argc, char** argv) {
FILE *fp;
time_t now_time;
init_daemon();
while (1) {
fp = fopen("/log", "a+");
if (fp == nullptr) {
perror("fopen");
exit(-1);
}
now_time = time(NULL);
fputs(ctime(&now_time), fp);
fclose(fp);
sleep(1);
}
return 0;
}
网友评论