实现思路
- 创建文件并写入数据:父进程使用
open
函数打开或创建一个文件,然后使用write
函数向文件中写入数据。
- 创建子进程:父进程调用
fork
函数创建子进程。
- 子进程获取读锁并读取文件:子进程使用
fcntl
函数获取文件的读锁,成功获取后使用read
函数读取文件内容。
关键代码片段
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#define FILE_NAME "test.txt"
#define DATA "Hello, World!\n"
int main() {
int fd, pid;
struct flock fl;
// 打开或创建文件
fd = open(FILE_NAME, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 写入数据
if (write(fd, DATA, strlen(DATA)) == -1) {
perror("write");
close(fd);
exit(EXIT_FAILURE);
}
close(fd);
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) { // 子进程
char buffer[1024];
ssize_t bytes_read;
// 打开文件以读取
fd = open(FILE_NAME, O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 设置读锁
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
close(fd);
exit(EXIT_FAILURE);
}
// 读取文件内容
bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read == -1) {
perror("read");
} else {
buffer[bytes_read] = '\0';
printf("Child process read: %s", buffer);
}
// 释放锁
fl.l_type = F_UNLCK;
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl unlock");
}
close(fd);
} else { // 父进程
wait(NULL); // 等待子进程结束
}
return 0;
}