参考博客:https://blog.csdn.net/The_perfect_world/article/details/89296171
当一个进程fork之后,整个进程表项被复制,包括所有的文件描述符。
但是文件表项并不会被复制。父进程和子进程共享相同的文件表项。
注意:文件的偏移量是储存在文件表项中,所以当一个进程读取了文件之后,另一个进程读取相同的文件会从上一个进程停止的地方开始读取。
兄弟进程示例
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdlib.h>
pid_t parent_pid;
pid_t chi1_pid;
pid_t chi2_pid;
int main(int argc, char* argv[]){
char buf[128] = {0};
pid_t pid;
FILE *fp;
fp = fopen ("demo.txt", "w+");
int i;
parent_pid = getpid();
printf("Father, pid is %d\n", parent_pid);
pid = fork();
if(pid < 0) {
printf("Father, Error, fork failed, errno(%d): %s\n", errno, strerror(errno));
return EXIT_FAILURE;
} else if(pid > 0) {
//父进程
printf("Father, create Child1 (pid: %d)\n", pid);
chi1_pid = pid;
} else if(pid == 0) {
sleep(1);
printf("Child1, before write\n");
for (i = 0; i < 100000000; i++) {
fprintf(fp, "%d ", 2*i);
sleep(5);
}
printf("Child1, after wrie\n");
}
if (getpid() == parent_pid) {
pid = fork();
if(pid < 0) {
printf("Father, Error, fork failed, errno(%d): %s\n", errno, strerror(errno));
return EXIT_FAILURE;
} else if(pid > 0) {
//父进程
printf("Father, create Child2 (pid: %d)\n", pid);
chi2_pid = pid;
} else if(pid == 0) {
sleep(1);
printf("Child2, before write\n");
for (i = 0; i < 100000000; i++) {
fprintf(fp, "%d ", 2*i+1);
sleep(5);
}
printf("Child2, after wrie\n");
}
}
if (getpid() == parent_pid) {
sleep(510000000);
fprintf(fp, "\n");
fclose(fd);
}
return EXIT_SUCCESS;
}
父子进程示例
待补充