Linux进程-fork创建新进程之文件分析
2014-07-11 21:59
267 查看
写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!
如果发现一些笔记的说法完全是错误的请建议我删除!
UNIX环境高级编程一书中说通过一个IO函数可以返回一个文件设备符(fd),用户程序通过文件设备符(fd)与实际文件进行交互,实际上用户程序是通过内核与实际文件进行交互的,而这个实际文件在内核中标号为fd。
问题:
当两个进程(这里特指父子进程)同时打开同一个文件时,其中一个进程对这个文件的操作是否会影响到另一个进程?
回答:
由于用户程序是通过内核与实际文件打交道的,对于内核来说实际文件只有一个,当其中一个进程通过内核操作文件的时候该文件的一些属性就被改变了,当另一个程序通过内核访问实际文件的时候实际上是在文件被更新的状态下开始的,这样的一些操作的结果可能不是程序员所想要的既定结果。
以下代码来说明以上问题:
<div> #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>
int main()
{
int fd = open("test.txt",O_CREAT|O_RDWR);
char buf[256];
if(fork())
{
printf("%d\n",fd);
sleep(2);
read(fd,buf,6);
buf[6] = '\0';
printf("parent:%s\n",buf);
close(fd);
}
else
{
printf("%d\n",fd);
read(fd,buf,6);
buf[6] = '\0';
printf("child:%s\n",buf);
close(fd);
}
return 0;
} </div>
test.txt中的内容是:
结果是:
将如下代码的结果与上面的结果相比,思考一些问题
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>
int main()
{
char buf[256];
if(fork())
{
int fd = open("test.txt",O_CREAT|O_RDWR);
printf("%d\n",fd);
sleep(2);
read(fd,buf,6);
buf[6] = '\0';
printf("parent:%s\n",buf);
close(fd);
}
else
{
int fd = open("test.txt",O_CREAT|O_RDWR);
printf("%d\n",fd);
read(fd,buf,6);
buf[6] = '\0';
printf("child:%s\n",buf);
close(fd);
}
return 0;
}
以上代码中test.txt的内容相同
以上代码结果是:
如果发现一些笔记的说法完全是错误的请建议我删除!
UNIX环境高级编程一书中说通过一个IO函数可以返回一个文件设备符(fd),用户程序通过文件设备符(fd)与实际文件进行交互,实际上用户程序是通过内核与实际文件进行交互的,而这个实际文件在内核中标号为fd。
问题:
当两个进程(这里特指父子进程)同时打开同一个文件时,其中一个进程对这个文件的操作是否会影响到另一个进程?
回答:
由于用户程序是通过内核与实际文件打交道的,对于内核来说实际文件只有一个,当其中一个进程通过内核操作文件的时候该文件的一些属性就被改变了,当另一个程序通过内核访问实际文件的时候实际上是在文件被更新的状态下开始的,这样的一些操作的结果可能不是程序员所想要的既定结果。
以下代码来说明以上问题:
<div> #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>
int main()
{
int fd = open("test.txt",O_CREAT|O_RDWR);
char buf[256];
if(fork())
{
printf("%d\n",fd);
sleep(2);
read(fd,buf,6);
buf[6] = '\0';
printf("parent:%s\n",buf);
close(fd);
}
else
{
printf("%d\n",fd);
read(fd,buf,6);
buf[6] = '\0';
printf("child:%s\n",buf);
close(fd);
}
return 0;
} </div>
test.txt中的内容是:
结果是:
将如下代码的结果与上面的结果相比,思考一些问题
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/mman.h>
#include<fcntl.h>
int main()
{
char buf[256];
if(fork())
{
int fd = open("test.txt",O_CREAT|O_RDWR);
printf("%d\n",fd);
sleep(2);
read(fd,buf,6);
buf[6] = '\0';
printf("parent:%s\n",buf);
close(fd);
}
else
{
int fd = open("test.txt",O_CREAT|O_RDWR);
printf("%d\n",fd);
read(fd,buf,6);
buf[6] = '\0';
printf("child:%s\n",buf);
close(fd);
}
return 0;
}
以上代码中test.txt的内容相同
以上代码结果是:
相关文章推荐
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)【转】
- Linux进程-fork创建新进程之内存区域分析
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- Linux进程的管理与调度(八) -- Linux下进程的创建过程分析(_do_fork/do_fork详解)
- Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
- Linux下进程创建Fork()函数分析
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- Linux创建进程fork和vfork函数分析
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)
- 【操作系统】linux创建子进程--fork()方法
- MTD系列 - android平台上linux启动时init进程解析init.rc文件分析
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- linux中fork创建进程讲解(转)
- linux 任务调度,进程创建(fork)(2.6内核)
- linux中fork创建进程讲解
- linux中fork创建进程讲解
- linux中fork同时创建多个子进程的方法(二)
- Linux0.11内核--fork()函数创建进程
- Linux0.11进程创建函数fork()