Linux中两个无亲缘关系的进程利用普通文件进行通信要使用进程同步技术的代码
时间: 2024-02-28 14:54:41 浏览: 60
下面是利用普通文件实现 Linux 两个无亲缘关系的进程通信,并使用进程同步技术的代码示例:
进程1:写入文件
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main() {
int fd;
char *filename = "test.txt";
char *message = "Hello, Process 2!";
int ret;
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 加锁
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
ret = fcntl(fd, F_SETLKW, &fl);
if (ret == -1) {
perror("fcntl");
exit(EXIT_FAILURE);
}
// 写入消息
ret = write(fd, message, strlen(message));
if (ret == -1) {
perror("write");
exit(EXIT_FAILURE);
}
// 解锁
fl.l_type = F_UNLCK;
ret = fcntl(fd, F_SETLK, &fl);
if (ret == -1) {
perror("fcntl");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
```
进程2:读取文件
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main() {
int fd;
char *filename = "test.txt";
char buffer[255];
int ret;
fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 加锁
struct flock fl;
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
ret = fcntl(fd, F_SETLKW, &fl);
if (ret == -1) {
perror("fcntl");
exit(EXIT_FAILURE);
}
// 读取消息
ret = read(fd, buffer, sizeof(buffer));
if (ret == -1) {
perror("read");
exit(EXIT_FAILURE);
}
buffer[ret] = '\0';
printf("%s\n", buffer);
// 解锁
fl.l_type = F_UNLCK;
ret = fcntl(fd, F_SETLK, &fl);
if (ret == -1) {
perror("fcntl");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
```
这两个进程可以通过打开和写入同一个文件来实现通信,并使用进程同步技术来避免多个进程同时访问同一个文件可能会导致的问题。进程1打开文件并写入消息,并加锁,进程2打开相同的文件并读取消息,并加锁,等待进程1解锁后再读取。注意,这种通信方式需要考虑多个进程同时访问同一个文件可能会导致问题。因此,需要使用进程同步技术来避免这种问题的发生。
阅读全文