前言
提示:要解决以下问题:
- 使用fork创建的子程序,真的一模一样吗?
一、使用fork创建的子程序,真的一模一样吗?
要理解fork()
的诀窍是,但调用完毕fork()
将存在两个进程,都会从fork()
的返回处继续执行。
而子进程是对父进程栈段,数据段,堆段内存相应各部分的完全复制。
二、父子进程间文件共享
由1可知,子进程会继承父进程各个内存段的数据,那么同时也会继承父进程的文件描述符,同时也指向了同一个文件,并会互相影响。
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fd,flags;
char template[] = "/tmp/testXXXXXX";
setbuf(stdout, NULL);
fd = mkstemp(template);
if (fd == -1)
exit(1);
printf("File offset before fork(): %lld\n",(long long)lseek(fd,0,SEEK_CUR));
flags = fcntl(fd,F_GETFL);
if (flags == -1)
exit(1);
printf("O_APPEND flag befor fork() is:%s\n",(flags & O_APPEND)?"ON":"off");
switch (fork())
{
case -1:
exit(1);
case 0:
if (lseek(fd,1000,SEEK_SET) == -1)
exit(1);
flags = fcntl(fd,F_GETFL); /*获取目前的标志*/
if (flags == -1)
exit(1);
flags |= O_APPEND; /*turn O_APPEND on*/
if (fcntl(fd,F_SETFL,flags) == -1)
exit(1);
_exit(EXIT_SUCCESS);
default: /*父进程能看到由子进程制造的改变*/
if (wait(NULL) == -1) /*等待子进程退出*/
exit(1);
printf("Child has exitd\n");
printf("File offset in parent:%lld\n",(long long)lseek(fd,0,SEEK_CUR));
flags = fcntl(fd,F_GETFL);
if (flags == -1)
exit(1);
printf("O_APPEND flag in parent is:%s\n",(flags & O_APPEND)?"on":"off");
exit(EXIT_SUCCESS);
break;
}
return 0;
}
>>> a.out
File offset before fork(): 0
O_APPEND flag befor fork() is:off
Child has exitd
File offset in parent:1000
O_APPEND flag in parent is:on