码迷,mamicode.com
首页 > 其他好文 > 详细

进程标识符与fork函数

时间:2014-05-11 22:03:19      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   ext   c   

ID为0的进程通常是调度进程,常被称为交换进程(swapper),是内核中的系统进程。
ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用。

一个现有进程可以调用fork函数创建一个新进程(子进程)。fork函数被调用一次,返回两次。子进程返回值为0,父进程返回值为子进程的进程ID。

当fork出一个子进程后,子进程便拥有独立的数据段、堆、栈的副本,但父、子进程共享正文段(关于程序分布见文章“C程序的存储空间布局”)。但现在很多实现并不完全复制数据段、堆、栈,开始时父、子进程共享所有段,只有当一个进程试图修改某个区域时才对那个区域进行复制。这就是所谓的写时复制(COW)。

测试代码:
#include <stdio.h>
#include <unistd.h>
 
int glob = 123;
 
int main(void)
{
    int x = 456;
    pid_t pid;
 
    if ((pid = fork()) < 0)
        return -1;
    else if (pid == 0)
    {
        // 子进程
        glob++;
        x++;
    }
    else
        sleep(2);     // 父进程休眠两秒钟
 
    printf("pid = %d, glob = %d, x = %d\n", getpid(), glob, x);
    return 0;
}

运行结果:
bubuko.com,布布扣

从运行结果可以看出,数据段和栈已经相互独立了,因为glob存放在初始化数据段中,x存放在栈中,子进程对它们的改变并没有影响到父进程。

fork的两种常见用法:
  • 父进程复制自己,使父、子进程执行不同的代码段。例如网络服务进程,父进程等待客户端的请求,收到请求后fork出一个子进程,让子进程处理请求,父进程继续等待其它客户端的请求。
  • 一个程序要执行另一个不同的程序。例如shell执行一条命令,子进程从fork返回后立即调用exec执行自己的代码。
参考:
《unix环境高级编程》 P171-P176.

进程标识符与fork函数,布布扣,bubuko.com

进程标识符与fork函数

标签:style   blog   class   code   ext   c   

原文地址:http://blog.csdn.net/nestler/article/details/25535293

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!