转贴自倒霉熊的博客

【linux学习笔记-2】父子进程共享文件描述符

(2009-03-02 23:03:17)

#include <stdio.h>
#include
<fcntl.h>  //包含O_RDONLY等宏定义

int main(void){

char test;

int fd;

if((fd = open("test.dat",O_RDONLY))==
-1)
 {
    
perror("Can't open file test.dat\n");
    
return 1;
 }

printf("Open file succeed.\n");

if(fork()==-1)
 {
  perror("Can't creat child
process.\n");
  return 1;
 }
 printf("Creat child process succeed.\n");

read(fd,&test,1);
 printf("Process ID: %ld read the character:%c\n
",(long)getpid(),test);

close(fd);
     
return 0;
}

test.dat内容:abcdefghijklmn

open函数返回的是一个整型的文件描述符信息,该文件描述符也可以用于read,write,fcntl,lseek等系统函数中。

如果一个进程打开了一个文件以后,创建子进程,子进程会继承父进程的环境和上下文中的大部分内容,包括文件描述符。此时父子进程享有相同的文件偏移量,执行相同的程序读取文件中的字符。程序执行结果是随机的,可能是父进程先读,产生一个偏移,再由子进程读其相邻字符,也可能结果相反。

以下是该程序的一种执行结果:

root@gaolu-desktop:/home/gaolu#

root@gaolu-desktop:/home/gaolu#
gcc -o fork_file fork_file.c
root@gaolu-desktop:/home/gaolu#

root@gaolu-desktop:/home/gaolu#

root@gaolu-desktop:/home/gaolu#

root@gaolu-desktop:/home/gaolu#

root@gaolu-desktop:/home/gaolu#
./fork_file
Open file succeed.
Creat child process succeed.
Process ID: 6197 read the
character:a

//子进程先读到字符a
Creat child process succeed.
Process ID: 6196 read the character:b

ZT 父子进程共享文件描述符的更多相关文章

  1. fork()父子进程文件描述符的关系

    父子进程共享文件描述符:此说法,其实是父子进程共享 文件表项(父进程和子进程共享同一个file table entry) 由于子进程是父进程的拷贝,子进程会拷贝父进程的进程描述符中的文件描述符表,可以 ...

  2. UNIX高级环境编程(2)FIle I/O - 原子操作、共享文件描述符和I/O控制函数

    引言: 本篇通过对open函数的讨论,引入原子操作,多进程通信(共享文件描述符)和内核相关的数据结构. 还会讨论集中常见的文件IO控制函数,包括: dup和dup2 sync,fsync和fdatas ...

  3. fork后父子进程文件描述问题

    [fork后父子进程文件描述问题] 一张图可以浅析的解释: 参考:http://wenku.baidu.com/view/dd51581bff00bed5b9f31d8e.html

  4. 进程—内存描述符(mm_struct)

    http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员 ...

  5. Linux进程管理描述符 task_struct

    转:http://blog.csdn.net/hongchangfirst/article/details/7075026 大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进 ...

  6. Python mutilprocessing Processing 父子进程共享文件对象?

    multiprocessing python多进程模块, 于是, Processing也是多进程的宠儿. 但今天讨论的问题, 似乎也能引起我们一番重视 直接上代码:     1 2 3 4 5 6 7 ...

  7. fork()系统调用后,对于open()前后父子进程的访问

    一开始我也不是很懂,后来看了一篇别人的博客觉得写得特别好,现在拷贝下来分享一下. 如果换成write函数 如果换成write函数,先open()后fork(),那么父子进程共享文件描述符,即使在子进程 ...

  8. Linux 进程间传递文件描述符

    文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...

  9. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

随机推荐

  1. 日志统计--蓝桥杯--vector

    /* 标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞&q ...

  2. 【3dsMax安装失败,如何卸载、安装3dMax 2011?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

    pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple 快速下载

  4. 虚拟机xp系统中Oracle 10g的安装

    1 安装过程(11步) 2.如果是xp系统可以直接并双击解压目录下的setup.ext,出现安装界面,如下: 3.输入口令和确认口令,如:oracle,点击下一步,出现如下进度条. 注:此口令即是管理 ...

  5. React.js 小书 Lesson14 - 实战分析:评论功能(一)

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson14 转载请注明出处,保留原文链接和作者信息. 课程到这里大家已经掌握了 React.js 的 ...

  6. JS字符串与二进制的相互转化

    //字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A"; var code = str.ch ...

  7. js中的break,continue,return

    js中的break,continue, return (转) 面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢 ...

  8. LINQ和.NET数据访问

    .NET数据访问 在.NET中对于数据的访问大致有三个层面,数据访问层.内存数据集.业务逻辑层.数据层,包括了XML配置文件以及一些常用的数据库(使用SQL语句):内存数据集,主要是DataSet数据 ...

  9. Git读档

    $ git config --global user.name "meng kai" $ git config --global user.email 363255751@qq.c ...

  10. 关闭Windows 系统当前连接的Wifi以及判断物理\虚拟网卡,有线\无线网卡

    1.关闭wifi ,调用Api [DllImport("Wlanapi.dll", SetLastError = true)] public static extern uint ...