#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>int main() { int p1, p2, i; FILE *fp; fp = fopen("to_be_locked.txt", "w+"); if (fp == NULL) { printf("Fail to create file"); exit(-1); } while ((p1 = fork()) == -1); if (p1 == 0) { // 子进程p1 fclose(fp); // 关闭不需要的文件描述符 fp = fopen("to_be_locked.txt", "a"); // 重新打开文件 lockf(fileno(fp), 1, 0); // 加锁 for (i = 0; i < 10; i++) fprintf(fp, "daughter %d\n", i); lockf(fileno(fp), 0, 0); // 解锁 fclose(fp); } else { while ((p2 = fork()) == -1); if (p2 == 0) { // 子进程p2 fclose(fp); fp = fopen("to_be_locked.txt", "a"); lockf(fileno(fp), 1, 0); for (i = 0; i < 10; i++) fprintf(fp, "son %d\n", i); lockf(fileno(fp), 0, 0); fclose(fp); } else { // 父进程 wait(NULL); // 等待子进程p1完成 wait(NULL); // 等待子进程p2完成 lockf(fileno(fp), 1, 0); for (i = 0; i < 10; i++) fprintf(fp, "parent %d\n", i); lockf(fileno(fp), 0, 0); fclose(fp); } } return 0;}
时间: 2024-03-11 20:46:05 浏览: 52
这段代码是一个简单的并发程序,它通过创建进程的方式,实现对同一个文件的加锁操作,从而保证文件写入的完整性。具体的实现过程如下:
1. 打开一个文件,如果打开失败,则退出程序。
. 创建两个子进程p1和p2,父进程则等待这两个子进程的结束。
3. 在子进程p1和p2中,先关闭文件描述符,然后重新打开文件,并对文件进行加锁,这样其他进程就无法同时对文件进行写入操作。
4. 子进程p1和p2分别向文件中写入自己的数据。
5. 写入完毕后,对文件进行解锁操作,然后关闭文件。
6. 父进程在等待子进程p1和p2执行完毕后,对文件进行加锁操作,并向文件中写入自己的数据。
7. 最后对文件进行解锁操作,并关闭文件。
在这个程序中,通过对文件进行加锁和解锁操作,实现了对文件的互斥访问,避免了数据的错误写入和丢失。
阅读全文