程序和进程
程序:是存放在磁盘中的 可执行文件
进程:程序的执行实例
进程ID:每个linux进程都有一个唯一的数字标识符,进程ID总是一非负数。
内核中的进程结构
tty_struct
files_struct 指向文件描述符
task_struct 进程表项
C程序启动过程
启动例程
在进程的main函数执行之前内核就会启动
编译器在编译时就会将启动例程编译进可执行文件中
启动例程的作用: 搜集命令的参数传递给main函数中的argc和argv
搜集环境信息构建环境并且传递给main函数
登记进程的终止的函数
进程终止
正常终止:
从main函数返回
调用exit(标准c库函数)
调用_exit或_Exit(系统调用)
最后一个线程从其启动例程返回
最后一个线程调用pthread_exit
异常终止:
调用abort
接受一个信号并终止
最后一个线程取消对请求做处理响应
进程返回:
通常程序运行成功返回0。否则返回非0
在shell中可以查看进程返回值 (e’cho $?)
atexit 函数
#include<stdlib.h>
int atexit(void (*function)(void ))
进程终止方式的区别
进程启动和退出
通过ps指令可以看到进程的ID,进程用户的ID
PS 输出的信息
USER进程的属主;
PID进程的ID;
PPID 父进程;
%CPU 进程占用的CPU百分比;
%MEM占用内存的百分比;
NI 进程的NICE值,数值大,表示较少占用CPU时间;
VSZ 进程虚拟大小;
RSS 驻留中页的数量;
TTY 终端ID
WCHAN 正在等待的进程资源;
START 启动进程的时间;
TIME进程消耗CPU的时间;
COMMAND 命令的名称和参数
进程常见状态:
运行状态 系统当前进程 就绪状态进程 ps命令的STAT列为值R
等待状态 等待事件发生 等待系统资源 ps命令的STAT列为值S 停止状态 ps命令的STAT列为值T
僵尸状态 进程终止或结束 在进程表项中仍有记录 ps命令的STAT列为值Z
进程调度
第一步:处理内核中的工作
第二步:处理当前进程
第三步:选择进程
- 实时进程
- 普通进程
第四步:进程交换
task_struct 中的调度信息
进程状态变化关系
进程标识 PID ,用户标识 UID ,用户
#include <unistd.h>
#include <sys/types.h>
pid_t getpid(void):获得当前进程ID
uid_t getuid(void):获得当前进程的实际用户ID
uid_t geteuid(void):获得当前进程的有效用户ID
gid_t getgid(void):获得当前进程的用户组ID
pid_t getppid(void):获得当前进程的父进程ID
pid_t getpgrp(void):获得当前进程所在的进程组ID
pid_t getpgid(pid_t pid):获得进程ID为pid的进程所在的进程组ID