修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话子进程输出“这是子进程”父进程输出“这是父进程”,再观察程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用 lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
时间: 2024-05-02 19:16:16 浏览: 64
修改后的程序如下:
```c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(){
pid_t pid;
int fd;
char buf[50];
fd = open("test.txt", O_CREAT|O_TRUNC|O_WRONLY, 0644); //打开文件并设置访问权限
if(fd < 0){
printf("error in opening file!\n");
exit(1);
}
pid = fork(); //创建子进程
if(pid < 0){
printf("error in fork!\n");
exit(1);
}
else if(pid == 0){ //子进程
lockf(fd, F_LOCK, 0); //给文件加锁
sprintf(buf, "这是子进程\n");
write(fd, buf, strlen(buf));
lockf(fd, F_ULOCK, 0); //解锁
exit(0);
}
else{ //父进程
lockf(fd, F_LOCK, 0); //给文件加锁
sprintf(buf, "这是父进程\n");
write(fd, buf, strlen(buf));
lockf(fd, F_ULOCK, 0); //解锁
wait(NULL); //等待子进程结束
}
close(fd); //关闭文件
return 0;
}
```
程序的执行结果会在文件test.txt中输出每个进程对应的一句话,因为子进程和父进程各自向文件写入了不同的内容。
如果在程序中使用了系统调用`lockf()`来给每个进程加锁,可以实现进程之间的互斥。这是因为一个进程在加锁后,其他进程就无法对该文件进行写操作,只有在该进程解锁后,其他进程才能对该文件进行写操作。因此,使用`lockf()`可以避免多个进程同时写入同一个文件时产生的竞争问题,从而保证了数据的正确性。
阅读全文