1、编写一段多进程并发运行的程序,用lockf( )来给每一个进程加锁,以实现进程之间的互斥,观察并分析出现的现象及原因。
时间: 2023-06-17 10:03:02 浏览: 233
下面是一个简单的多进程并发运行的程序,使用lockf()函数来给每个进程加锁:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int fd;
pid_t pid;
char buf[10];
struct flock fl;
fd = open("file.txt", O_RDWR | O_CREAT, 0666);
if (fd < 0) {
perror("open");
exit(EXIT_FAILURE);
}
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
pid = fork();
if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// child process
printf("Child process %d is trying to get a lock...\n", getpid());
if (lockf(fd, F_LOCK, 0) < 0) {
perror("lockf");
exit(EXIT_FAILURE);
}
printf("Child process %d has got a lock!\n", getpid());
sleep(10);
printf("Child process %d is releasing the lock...\n", getpid());
if (lockf(fd, F_ULOCK, 0) < 0) {
perror("lockf");
exit(EXIT_FAILURE);
}
printf("Child process %d has released the lock!\n", getpid());
} else {
// parent process
printf("Parent process %d is trying to get a lock...\n", getpid());
if (lockf(fd, F_LOCK, 0) < 0) {
perror("lockf");
exit(EXIT_FAILURE);
}
printf("Parent process %d has got a lock!\n", getpid());
sleep(10);
printf("Parent process %d is releasing the lock...\n", getpid());
if (lockf(fd, F_ULOCK, 0) < 0) {
perror("lockf");
exit(EXIT_FAILURE);
}
printf("Parent process %d has released the lock!\n", getpid());
}
close(fd);
return 0;
}
```
该程序会创建一个文件"file.txt",然后使用lockf()函数来给文件加锁,从而实现进程之间的互斥。程序通过fork()函数创建了一个子进程,父进程和子进程分别尝试获取文件锁,然后睡眠10秒钟,最后释放文件锁。
如果我们运行该程序,我们会看到如下输出:
```
Parent process 1234 is trying to get a lock...
Parent process 1234 has got a lock!
Child process 1235 is trying to get a lock...
```
可以看到,父进程先获取到了文件锁,然后子进程也尝试获取文件锁。然后程序进入了阻塞状态,等待10秒钟后才会继续执行。
接下来,我们来分析一下程序的执行过程和出现的现象。在程序运行期间,如果两个或多个进程同时尝试获取文件锁,其中一个进程会阻塞,直到另一个进程释放锁。这是因为lockf()函数会在文件上对指定字节范围加锁,如果另一个进程也尝试对同一文件的相同字节范围加锁,那么就会阻塞。在本例中,我们对整个文件加锁,所以任何进程都不能同时访问文件。
另外需要注意的是,我们使用lockf()函数对文件加锁时,只能保证同一进程内的互斥性,而不能保证不同进程之间的互斥性。想要在不同进程之间实现互斥,需要使用系统提供的IPC机制,如信号量、共享内存等。
阅读全文