编写C语言程序实现以下功能:编写一个通讯录读写程序,要求使用fcntl()函数给通讯录数据文件加文件记录锁,实现数据库的“行级锁”。通讯录数据文件格式:编号<Tab>姓名<Tab>手机<Tab>固定电话<Tab>地址<Tab>其中 contack.data 1 张三 13888888888 028-88888888 成都工业学院xxx 2 李四 13888888888 028-88888888 成都工业学院xxx
时间: 2023-06-16 13:04:32 浏览: 202
C语言编写的通讯录程序
下面是使用fcntl()函数给通讯录数据文件加文件记录锁的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define MAX_LINE_LENGTH 1024
#define LOCK_MODE (F_WRLCK | F_RDLCK)
struct Contact {
int id;
char name[32];
char mobile[16];
char phone[16];
char address[64];
};
void read_contact(int fd, struct Contact *c) {
char buf[MAX_LINE_LENGTH];
ssize_t n;
if ((n = read(fd, buf, MAX_LINE_LENGTH)) == -1) {
perror("read failed");
exit(EXIT_FAILURE);
}
if (n == 0) {
printf("No more contacts\n");
exit(EXIT_SUCCESS);
}
buf[n] = '\0';
sscanf(buf, "%d\t%s\t%s\t%s\t%s", &c->id, c->name, c->mobile, c->phone, c->address);
}
void write_contact(int fd, struct Contact *c) {
char buf[MAX_LINE_LENGTH];
sprintf(buf, "%d\t%s\t%s\t%s\t%s\n", c->id, c->name, c->mobile, c->phone, c->address);
if (write(fd, buf, strlen(buf)) == -1) {
perror("write failed");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[]) {
int fd;
struct flock fl;
struct Contact c;
if (argc != 2) {
fprintf(stderr, "Usage: %s <datafile>\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((fd = open(argv[1], O_RDWR)) == -1) {
perror("open failed");
exit(EXIT_FAILURE);
}
memset(&fl, 0, sizeof(fl));
fl.l_type = LOCK_MODE;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl failed");
exit(EXIT_FAILURE);
}
while (1) {
read_contact(fd, &c);
printf("%d\t%s\t%s\t%s\t%s", c.id, c.name, c.mobile, c.phone, c.address);
sleep(5);
}
exit(EXIT_SUCCESS);
}
```
上面的程序使用了fcntl()函数给通讯录数据文件加了文件记录锁,以实现数据库的“行级锁”。对于每个读取或写入通讯录数据文件的操作,程序都会首先获取对整个文件的锁,然后再进行相应的操作。这样可以保证每个操作都是原子的,不会被其他进程或线程打断。注意,我们使用了F_SETLKW标志来阻塞其他进程或线程的访问,直到当前进程或线程释放了文件锁为止。
阅读全文