进程复习(1)--特点与使用
2023/6/20 进程的用法和特点,通信方式分开篇章在写
特点
- 进程是一个独立的可调度的任务。进程是程序的一次执行过程
- 进程是动态的,包括创建、调度、执行、消亡
- 系统会为每个进程分配0-4g的虚拟空间,其中0-3g是用户空间,每个进程独有3g-4g是内核空间,所有进程共享。
**轮转调度:时间片**
,系统为每个进程分配时间片(几毫秒~几十毫秒),当一个进程的时间片用完时,CPU调度另外一个进程,从而实现进程调度的切换。- Linux进程包含三个段:
数据段``正文段``堆栈段
。数据段存放的是全局变量,常数以及动态数据分配的数据空间。正文段存放的是程序中的代码。堆栈段存放的是函数的返回地址、函数的参数以及程序中的局部变量 - 进程分类:
交互进程``批处理进程``守护进程
交互进程 是类进程是由shell控制和运行的。批处理处理不属于某个终端,它被提交到一个队列中以便顺序执行。守护进程后台运行。 - 子进程几乎拷贝了父进程的全部内容,包括代码,数据,系统数据段中pc值,栈中数据。
- 父子进程由独立的地址空间,互不影响,所以改变全局变量、静态变量,都互不影响。
- 父进程先结束,子进程成为孤儿进程。子进程先结束,父进程没有及时回收,子进程变成僵尸进程
函数接口
1、pid_t fork(void);//父进程,返回进程号>0,子进程中,返回值=0,失败返回值-1;
2、pid_t wait(int *status);//回收子进程资源,阻塞函数
//status为子进程退出状态,不接受子进程状态设为NULL,成功返回值为回收子进程的进程号。
3、pid_t waitpid(pid_t pid, int *status, int options);//options :0阻塞 WNOHANG非阻塞
4、void exit(int status);//结束进程,刷新缓存
5、void _exit(int status);//结束进程,不刷新缓存 通常0表示正常结束;
6、pid_t getpid(void);//获取当前进程的进程号
7、pid_t getppid(void);//获取当前进程的父进程号
功能代码
进程的创建与回收
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t id=fork();
if(id<0)
{
perror("fork err");
return -1;
}
else if(id==0)//子进程
{
printf("child process\n");
}
else if(id>0)//父进程
{
wait(NULL);
printf("father process\n");
while(1);
}
}
获取ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
pid_t id;
if ((id = fork()) < 0)
{
perror("fork err");
return -1;
}
else if (id == 0)
{
printf("in child, pid:%d ppid:%d\n", getpid(), getppid());
}
else
{
printf("in parent, pid:%d ppid:%d\n", id, getpid());
}
return 0;
}
守护进程
- 特点:
守护进程是后台进程,不依赖于控制终端;
生命周期比较长,从运行时开启,系统关闭时结束;
它是脱离控制终端且周期执行的进程。 - 步骤:
1) 创建子进程,父进程退出
让子进程变成孤儿进程,成为后台进程;fork()
2) 在子进程中创建新会话
让子进程成为会话组组长,为了让子进程完全脱离终端;setsid()
3) 改变进程运行路径为根目录
原因进程运行的路径不能被卸载;chdir("/")
4) 重设文件权限掩码
目的:增大进程创建文件时权限,提高灵活性;umask(0)
5) 关闭文件描述符
将不需要的文件关闭;close()
pid_t id = fork();
if (id < 0)
{
perror("fork:");
}
else if (id == 0)
{
setsid();//在子进程创建新会话
chdir("/");//修改路径为根目录
umask(0);//修改文件权限掩码
for (int i = 0; i < 3; i++)//关闭文件描述符
{
close(i);
}
while (1);
}
else
{
exit(0);
}