linux线程基础

进程和程序

程序->编译好的二进制文件,不占用系统资源
进程->在内存执行,占用系统资源

并发与并行

并发:多个进程在同一时间段内交替执行
并行:多个进程在同一时刻内被同时执行

ALU

算术逻辑单元,解析操作码并完成对应操作(只有add和<<操作)

MMU

内存管理模块
实现虚拟地质到实地址的映射
不同进程有不同的用户空间,但是内核空间都是一样的

PCB

进程控制快,存储进程的所有信息
本质:结构体
内部定义成员:
1.进程id
2.进程的状态(就绪,运行,挂起)
3.进程切换时需要保存和恢复的一些cpu寄存器
4.描述地址空间的信息
5.描述控制终端的信息
6.当前工作目录
7.umask掩码
8.文件描述符表(包含很多指向file结构体的指针)
9.和信号相关的信息
10.用户id和组id
11.会话和进程组
12.进程可以使用的资源上限

环境变量

1.本质:字符串
2.有统一的格式-----名:值
3.值用来描述进程环境信息

相关函数

1.getenv
获取环境变量值
char *getenv(const char *name);
char *secure_getenv(const char *name);
2.setenv
添加或者修改环境变量
3.unsetenv
删除环境变量

fork创建进程

进程控制原语

fork函数
pid_t fork(void);
返回值有俩个:
1.父进程返回子进程id(非负整数)
2.子进程返回0(表示进程创建成功)
根据返回值可以分辨当前进程是子进程还是父进程
注意:子进程创建后,和父进程享有同样的地位,和父进程竞争cpu
父子进程共享:1.文件描述符 2.mmap建立的映射区
所以,fork之后子进程可能优先运行,这就要注意线程安全问题

gdb调试

使用gdb调试的时候,gdb只能跟踪一个进程,可在fork函数之前,通过指令设置gdb在fork之后跟踪哪个进程
set follow-fork-mode child 设置gdb在fork之后跟踪子进程
set follow-fork-mode parent 设置…跟踪父进程

Exec函数族

int execl(const char *pathname, const char arg, …/ (char *) NULL */);
加载一个进程,通过路径+程序名 来加载
成功无返回
失败返回-1

int execlp(const char *file, const char arg, … / (char *) NULL */);
参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参数1则出错返回
该函数通常调用系统程序。如ls,date,cp等命令

int execle(const char *pathname, const char arg, … /, (char *) NULL, char *const envp[] */);
见man

int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

回收子进程

孤儿进程

父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程

僵尸进程

进程终止,父进程尚未回收,子进程残留资源存放于内核中,变成僵尸进程。

回收函数
wait函数

*pid_t wait(int wstatus);
1.阻塞等待子进程退出
2.回收子进程残留资源
3.获取子进程结束状态

可使用wait函数传出参数status来保存进程的推出状态。借助宏函数来进一步判断进程终止的具体原因,宏函数分为如下三组:
1.WIFEXITED(status) 为非0 -> 进程正常退出
WEXITSTATUS(status)如上述宏为真,使用此宏 -> 获取进程的退出状态

2.WIFSIGNALED(status) 为非0 -> 进程异常终止
WTERMSIG(status) 如上述宏为真,使用此宏 -> 取得使进程终止的那个信号的编号

3.WIFSTOPPED(status) 为非0 -> 进程处于暂停状态
WSTOPSIG(status)如上述宏为真,使用此宏 -> 取得使进程暂停的那个信号的编号
WIFCONTNUED(status) 为真 -> 进程暂停后已经继续运行

waitpid函数

*pid_t waitpid(pid_t pid, int wstatus, int options);
pid > 0 指定进程id回收
pid = -1 回收任意子进程
pid = 0 回收本组任意子进程
pid < -1 回收该进程组的任意子进程
成功:返回清理掉的子进程ID
失败:返回 -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值