现在的位置: 首页 > 操作系统 > 正文

linux fork 深入讲解(对打开文件的处理)

2019年06月07日 操作系统 ⁄ 共 974字 ⁄ 字号 评论关闭

当父进程调用fork函数时, 新创建的子进程几乎但不完全与父进程相同, 子进程会获得一份父进程用户级虚拟地址空间的拷贝, 但是此拷贝是独立的, 拷贝内容包括文本、数据和bss段、堆以及用户栈。 子进程有一份自己的虚拟地址空间, 里面存放着和父进程相同的一份代码、数据、用户栈的拷贝,
而且是与父进程的地址空间是独立的。
扩展: 在父进程创建新的子进程时, 子进程还会获得与父进程打开文件描述符相同的拷贝, 也就是说, 当父进程调用fork函数时,
子进程可以读写父进程中打开的任何文件
。 父进程和子进程之间的最大区别在于它们有不同的PID。

#include<sys/types.h>

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>

int main(){
pid_t pid;
int fd;
int i=1;
int status;
char *ch1="hello";
char *ch2 ="world";
char *ch3 ="IN";

if((fd=open("test.txt",O_RDWR|O_CREAT,0644))==-1)
{
perror("parent open");
exit(EXIT_FAILURE);
}

if(write(fd,ch1,strlen(ch1)==-1))
{
perror("parent write");
exit(EXIT_FAILURE);
}
if((pid=fork()==-1))
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid==0){
i=2;
printf("in child\n");
printf("i=%d\n",i);

if(write(fd,ch2,strlen(ch2))==-1)
{
perror("child write");
}
return 0;
}
else{
sleep(1);
printf("in parent\n");
printf("i=%d\n",i);
if(write(fd,ch3,strlen(ch3))==-1)
{
perror("parent write");
}
wait(&status);
return 0;
}
return 1;

}

编译后输出:

in child
i=2
in parent
i=1

抱歉!评论已关闭.