1 | waitpid(pid,statu, ) //指定某一个进程进行回收 |
进程间的通信方式
僵尸进程
- 有影响新进程的产生
- 保存了很多进程中的信息
weit3()
库函数system()
c语言中实现调用shell
system()
原理:
- fork产生一个子进程
- exce执行相关shell命令
- 子进程用exit推出子进程
- 。。。。。。
进程的通信
- 软中断
- 管道(使用最简单)
- 信号量(开销小)
- 共享映射区(无血缘关系)
- socket(最稳定)
1.管道通信
- 本质是一个伪文件(不占用磁盘空间)
- 有读端和写端
- 结构为一个环形队列
- pipe()为系统调用
1
2
3int p[2]
status = pipe(p)
//p[0]用于从管道写,p[1]用于从管道读
- 特点:
- 管道默认是阻塞的
- 管道适用于与血缘关系的进程
信号量(pv操作)
消息队列
共享内存(能实现大量数据传输,解决了消息队列的弱点)
- 基本流程
- 获取物理内存
- 映射到虚拟地址空间
- 使用后释放
- ipcs 命令
- ipcs -m 查看系统中存在的共享内存
- ipcrm shm
杀掉共享内存
文件映射 mmap(文件映射到虚拟空间中)
- 特点
- 普通读文件先从硬盘到内核缓存,再到物理内存共进行了两次拷贝
- mmap操作直接从硬盘拷贝到物理内存,只进行了一次拷贝
- 常见错误
- len = 20 ,filelength = 0 :产生BusError总线错误
- 文件只有只读权限,映射内存也为只读权限:产生段错误,无写权限
- 文件和映射内存都只有只写权限:产生读错误
- offset 9
- 越界:
信号(常见信号为1到31)
信号的产生
- 按键产生:
- ctrl+c 2号
- ctrl+z 1号
- ctrl+\ 3号
- kill(pid_t pid , int sig);
- sigprocmask 函数 :屏蔽信号,接触屏蔽
信号捕捉特性
- 信号执行期间,信号屏蔽字有mask -> s_mask
- 某信号执行期间,某信号自动被屏蔽
- 阻塞信号不支持排队
SIGCHLD信号
- 条件
- 子进程终止
- 子进程接收到SIGSTOP信号
- 子进程接收到continue信号
守护进程
- 特点:
- 独立于控制终端
- 周期性执行某任务
- 不受用户登陆注销影响
- 一般采用以d结尾的名字
- 进程组
* - 会话
*