免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 726 | 回复: 0
打印 上一主题 下一主题

linux fork理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-21 20:49 |只看该作者 |倒序浏览


/*******************************************************************************
* 版权所有 (C)2009 mycareer
* 系统名称 : myfork
* 文件名称 : myfork.cpp
* 内容摘要 : 测试fork创建的子进程与父进程是否共享的数据段
* 当前版本 : 1.0
* 作 者 : mycareer
* 设计日期 : 2009年7月21日
* 修改记录 :
* 日 期 版 本 修改人 修改摘要
*******************************************************************************/
/**************************** 条件编译选项和头文件 ****************************/
#include sys/types.h>
#include sys/wait.h>
#include iostream>
using namespace std;
/********************************** 宏、常量 **********************************/
/********************************** 数据类型 **********************************/
/************************************ 变量 ************************************/
/********************************** 函数实现 **********************************/
int main(int argc, char *argv[])
{
    char buf[20] = "hello parent";//栈区
    char *pb = new char[20];//堆
    int n = 0;
    pid_t pid = 0;
    memset(pb, 0 ,20);
    pb[0] = 'p';
    if ((pid = fork())  0)
    {
        cout"fork error!"endl;
        exit(1);
    }
    else if (pid == 0 ) //子进程
    {
        buf[0] = 'c';
        pb[0] = 'c';
        n = 1;
    }
    else
    {
        sleep(10);//让父进程休眠,子进程先执行
    }
    coutgetpid()":n address "(&n)",n="n
        "\tbuf address "(&buf)",buf="buf
        "\tpb addrss "(&pb)",pb="pbendl;
    exit(0);
}
输出结果为
15144:n address 0xbfe1f168,n=1  buf address 0xbfe1f170,buf=cello parent pb addrss 0xbfe1f16c,pb=c
15143:n address 0xbfe1f168,n=0  buf address 0xbfe1f170,buf=hello parent pb addrss 0xbfe1f16c,pb=p

   15144是子进程,15143是父进程,它们之间的变量的地址是一样的(在各自的进程地址空间内),子进程修改了变量的值,但是却没有影响到父进程,说明了子进程中的变量是父进程的一个副本,不会因为子进程中改变了它们的值而影响父进程,也就是子进程中具有父进程的数据段的副本。子进程和父进程共享的只是代码段。

   fork是一个特殊的函数,它执行一次,返回两次,在子进程中返回0,父进程中返回子进程的pid。当执行了fork函数后,子进程和父进程就开始在fork之后产生分支了,父进程和子进程分别向下执行。由于父进程和子进程并没有公共的数据段,所以无法使用公共的数据段作为系统通信的载体,可以使用无名管道(fifo创建),或者有名管道(mkdifo创建后,产生管道名字,接着使用open打开读写)进行通信。
   当子进程结束的时候,会向父进程发送一个SIGCHLD信号。因为子进程终止是个异步事件(可以在父进程允许的任何时候发送),这在信号也是内核向父进程发的异步通知。父进程可以选择忽略它,或者提供一个信号捕捉函数去执行。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101537/showart_2002902.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP