文件实现进程间通信
已经过时的东西,过一遍有个印象即可
父子进程
这个理所当然可以通信,因为父子进程文件描述符表都是一样的
/*
*父子进程共享打开的文件描述符------使用文件完成进程间通信.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>
int main(void)
{
int fd1, fd2; pid_t pid;
char buf[1024];
char *str = "---------test for shared fd in parent child process-----\n";
pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) {
fd1 = open("test.txt", O_RDWR);
if (fd1 < 0) {
perror("open error");
exit(1);
}
sleep(3);
write(fd1, str, strlen(str));
printf("child wrote over...\n");
} else {
fd2 = open("test.txt", O_RDWR);
if (fd2 < 0) {
perror("open error");
exit(1);
}
// sleep(1); //保证子进程写入数据
int len = read(fd2, buf, sizeof(buf));
printf("------parent read len = %d\n", len);
len = write(STDOUT_FILENO, buf, len);
printf("------parent write len = %d\n", len);
wait(NULL);
}
return 0;
}
无血缘关系
/*
* 先执行,将数据写入文件test.txt
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#define N 5
int main(void)
{
char buf[1024];
char *str = "--------------secesuss-------------\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(N);
lseek(fd, 0, SEEK_SET);
ret = read(fd, buf, sizeof(buf));
ret = write(STDOUT_FILENO, buf, ret);
if (ret == -1) {
perror("write second error");
exit(1);
}
close(fd);
return 0;
}
/*
* 后执行,尝试读取另外一个进程写入文件的内容
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
int main(void)
{
char buf[1024];
char *str = "----------test2 write secesuss--------\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;
}