Linux进程 小结
一.进程概述
结合程序了解进程
- 程序: 程序是存放在存储介质上的一个可执行文件。
- 进程:进程是程序的执行实例,包括程序计数器、寄
存器和变量的当前值。 - 程序与进程的区别:
程序是静态的,进程是动态的
程序是一些指令的有序集合,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。
ps:分析
从用户角度:进程就是一个正在运行中的程序。
操作系统角度:操作系统运行一个程序,需要描述这个程序的运行过程,这个描述通过一个结构体task_struct{ }来描述,统称为PCB,因此对操作系统来说进程就是PCB(process control block)程序控制块
二.进程号概述
1.什么是进程号?
- 每个进程在初始化的时候,系统都分配了一个ID号,用于标识此进程。
- 在Linux中进程号是唯一的,系统可以用这个值来表示一个进程,描述进程的ID号通常叫做PID,即进程ID(process id)。PID的变量类型为pid_t。
- 进程号总是唯一的,但进程号可以重用。当一个进程
终止后,其进程号就可以再次使用了。
- 进程号(PID)
标识进程的一个非负整型数。 - 父进程号(PPID)
任何进程(除init进程)都是由另一个进程创建,
该进程称为被创建进程的父进程,对应的进程号称为
父进程号(PPID)。 - 进程组号(PGID)
进程组是一个或多个进程的集合。他们之间相互
关联,进程组可以接收同一终端的各种信号,关联的
进程有一个进程组号(PGID) 。
2.如何获取进程号
Linux操作系统提供了三个获得进程号的函数getpid()、
getppid()、getpgid()。
需要包含头文件:
#include <sys/types.h>
#include <unistd.h>
使用方法:
- pid_t getpid(void)
返回值:本进程号(PID) - pid_t getppid(void)
返回值:调用此函数的进程的父进程号(PPID) - pid_t getpgid(pid_t pid)
参数:0当前PGID,否则为指定进程的PGID
返回值:进程组号(PGID)
使用实例
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
printf("进程号:%d\n", getpid());
printf("父进程号:%d\n", getppid());
printf("进程组号:%d\n", getpgid(0));
return 0;
}
进程号:2773
父进程号:2115
进程组号:2773
三.创建进程fork函数
fork函数:创建一个新的进程
pid_t fork(viod)
功能:
fork()函数用于从一个已存在的进程中创建一个新进程,
新进程称为子进程,原进程称为父进程。
返回值:
成功:子进程中返回0,父进程中返回子进程ID。
失败:返回-1。
子进程使用fork函数得到的子进程是父进程的一个复制品,
它从父进程处继承了整个进程的地址空间。
地址空间:
包括进程上下文、进程堆栈、打开的文件描述符、
信号控制设定、进程优先级、进程组号等。
进程所独有的只有它的进程号,计时器等。可有时我们只需要复制父进程中的几个地址内容,并不需要全部复制一遍,因此,使用fork函数的代价是很大的。
使用实例:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();//创建进程
if(pid == 0)//子进程
{
printf("子进程号:%d\n", getpid());
}
else if(pid > 0)//父进程
{
printf("父进程号:%d\n", getppid());
}
return 0;
}
父进程号:2115
子进程号:2995
四.资源回收 wait函数
pid wait(int *status)
功能: 等待子进程改变状态,如果子进程终止了,此函
数会回收子进程的资源。
参数: status中为子程序退出时的状态信息
返回值:
成功:子进程进程号
失败:-1
好累啊 休息
五.结束进程
在linux下可以通过以下方式结束正在运行的进程:
void exit(int value);
void _exit(int value);
- exit函数:结束进程执行
void exit(int value)
参数:返回给父进程的参数(低8位有效)。
- _exit函数:结束进程执行
void _exit(int value)
参数: 返回给父进程的参数(低8位有效)。
exit为库函数_exit为系统调用函数,一般使用库函数提高运行效率