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

来源:互联网 发布:linux 笔试题 编辑:程序博客网 时间:2024/05/17 06:10

当父进程调用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

0 0