多线程同步与信号机制
操作系统进程控制实验:fork 与进程间通信
一、实验一:fork 创建多个进程(标准输出加锁)
代码实现
1 | |
运行结果
结果分析:
- 进程关系:父进程创建子进程
p1(daughter)和p2(son)。 - 加锁机制:通过
lockf(1, 1, 0)锁定标准输出,确保各进程输出不交叉,顺序为:daughter 0-9→son 0-9→parent 0-9(因父进程在子进程之后执行)。
二、实验二:fork 与文件加锁(写入文件)
代码实现
1 | |
运行结果
结果分析:
- 文件加锁:通过
lockf(fileno(fp), 1, 0)锁定文件,确保写入顺序为:son 0-9→daughter 0-9→parent 0-9(父进程通过wait(NULL)等待子进程完成后执行)。 - 与实验一差异:输出顺序不同,因子进程
p1和p2的执行顺序由调度器决定,体现进程并发特性。
三、实验三:进程信号处理(kill 与 signal)
代码实现
1 | |
运行结果
结果分析:
信号机制
:
- 父进程通过
kill(p1, 16)和kill(p2, 17)向子进程发送自定义信号。 - 子进程通过
signal(16, stop)和signal(17, stop)注册信号处理函数,接收到信号后修改wait_mark,结束等待循环。
- 父进程通过
输出顺序
:
- 用户按下
Ctrl+C(SIGINT),父进程捕获后触发stop(),向子进程发送信号。 - 子进程接收到信号后输出提示并退出,最后父进程输出
Parent process is killed!。
- 用户按下
四、关键知识点总结
- fork () 函数:
- 创建子进程,返回值为
0(子进程)或子进程 PID(父进程),失败返回-1。 - 子进程复制父进程的地址空间,两者并发执行。
- 创建子进程,返回值为
- 进程同步与加锁:
lockf(fd, mode, size)用于锁定文件或标准输出,避免多个进程同时写入导致内容混乱。mode=1为加锁,mode=0为解锁,size为锁定字节数(0表示锁定整个文件)。
- 信号处理:
signal(sig, handler)注册信号处理函数,如SIGINT(Ctrl+C)、自定义信号(如16、17)。kill(pid, sig)向进程发送信号,用于进程间通信和控制。
- wait () 函数:
- 父进程通过
wait(NULL)等待子进程结束,回收僵尸进程资源。
- 父进程通过