修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用 lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
时间: 2024-04-30 19:20:23 浏览: 71
进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现
4星 · 用户满意度95%
修改程序如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
int main()
{
int pid, i, fd;
// 打开文件,以便进程之间可以互斥地写入
fd = open("output.txt", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
for (i = 0; i < 3; i++) {
pid = fork();
if (pid == 0) {
// 给进程加锁,确保互斥访问
lockf(fd, F_LOCK, 0);
// 每个进程输出一句话
printf("This is child process %d\n", getpid());
// 释放锁
lockf(fd, F_ULOCK, 0);
exit(0);
}
}
for (i = 0; i < 3; i++)
wait(NULL);
// 关闭文件
close(fd);
return 0;
}
```
在程序中,我们使用了系统调用 `lockf()` 来给每个进程加锁,确保它们可以互斥地访问共享资源,即文件。
当程序执行时,每个进程输出一行话,但是这些输出在屏幕上可能是混杂在一起的,因为它们的输出可能是交织在一起的。但是,由于我们已经使用了 `lockf()` 来确保进程之间的互斥性,所以它们的输出顺序在文件中是按顺序排列的。
在程序执行时,当一个进程获得了文件锁,其他进程将被阻塞,直到该进程释放锁。这确保了进程之间的互斥性。但是,由于进程的调度是不可预测的,因此输出顺序可能是随机的,即每个进程输出一句话的顺序可能是不同的。但是,它们的输出顺序在文件中是固定的。
阅读全文