fork()系统调用
子进程先于父进程结束
父进程没有调用wait获取子进程的退出码 状态信息 (exit)
子进程变成僵尸进程
文件描述符 整形
open 打开文件 系统调用
write 写入文件
read 读数据
close 关闭文件
每个进程运行后,默认会打开三个文件:标准输入0(stdin FILE*) 标准输出1(stdout) 标准错误输出2(stderr)
父进程先打开的文件 fork后,会被复制带子进程中,子进程和父进程共享该文件
写时拷贝
修改时候才新建内存
不修改父子进程读取的数据内存空间
系统调用/库函数
man 3/库函数 2/系统调用 1/命令
man 1/2/3 命令
库函数的实现 在libxx.a/libxx.so
系统调用的实现在内核中
在编写操作系统内核代码时实现了该功能
库函数调用系统调用(内核中的数据)
产生中断(0X80(系统调用中断) 128) 陷入内核
找出系统调用号
从EAX读系统调用号(写入EAX寄存器)(返回值也放在EAX寄存器中)
在系统调用表中找 返回结果
用户态:执行用户代码
内核态:执行内核代码
现场保护
现场恢复
EAX存系统调用号
库函数-》系统调用-》内核/操作系统-》硬件
库函数和系统调用有区别
替换进程
exec系列
execl 路径加名称
execlp
execle
execv
execvp
库函数(上面五个都是封装系统调用 最后一个)
execve
系统调用
perror()打印字符串和出错原因
全新进程的创建
都是先fork 然后exec
bash ->fork+exec(ps/ls/main)
信号(软中断)(通知进程产生了某种事件):
发送信号给进程
进程(收到/捕获)一个信号
进程作出响应(1.默认方式响应SIG_DEF 2. 忽略方式响应SIG_IGN 3.自定义方式响应 void fun(int isg))
signal 改变信号的响应方式
发送信号 PID 信号代号
kill PID 执行15号信号
kill -x PID 执行x号信号
pcb 结构体