原理:打开的文件是内核中的一块缓冲区。多个无血缘关系的进程,可以同时访问该文件。
test1.c与test2.c实现了通过一个文件 完成两个非血缘关系进程之间的通信
代码:test1.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
void sys_err(const char * str)
{
perror(str);
exit(1);
}
int main()
{
char buf[1024];
char *str="------test1 write success------\n";
int ret;
int fd = open("test.txt",O_RDWR|O_TRUNC|O_CREAT,0664);
//直接打开文件写入数据
write(fd,str,strlen(str));
printf("test1 write into test.txt finish\n");
sleep(5);
lseek(fd,0,SEEK_SET);//将文件指针指向头部
ret = read(fd,buf,sizeof(buf));//读test.txt中的数据
ret = write(STDOUT_FILENO,buf,ret);//打印到屏幕上
if(ret ==-1) sys_err("write second error");
close(fd);
return 0;
}
代码:test2.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
void sys_err(const char * str)
{
perror(str);
exit(1);
}
int main()
{
char buf[1024];
char *str="------test2 write success------\n";
int ret;
sleep(2); //睡眠2秒保证test1将数据写入test.txt文件中
int fd = open("test.txt",O_RDWR);
//尝试读取test.txt文件中test1写入的数据
ret = read(fd,buf,sizeof(buf));
//将读到的数据打印到屏幕
write(STDOUT_FILENO,buf,ret);
//写入数据到文件test.txt中,未修改读写位置
write(fd,str,strlen(str));
printf("test2 read/write finish\n");
close(fd);
return 0;
}
结果: