fork--用于进程管理的系统调用

fork作用:

  创建一个原有进程的精确副本,包括所有的文件描述符,寄存器等全部内容。

父进程与子进程的关系:

#include "unistd.h";
#include "sys/types.h";
void main(){
    pid_t pid;
    pid = fork();
    if(pid < 0)
        printf("error in fork");    
    else if(pid == 0)
        printf("I'm the child process, my process ID is %d\n", getpid());
    else
        printf("I'm the parent process, my process ID is %d\n", getpid());
}

结果是:

[root@xxxxx]# ./a.out
I'm the child process, my process ID is 5146
I'm the parent process, my process ID is 5145

为什么这两行都打印出来了?

  在fork之后,操作系统会复制一个与父进程完全相同的子进程,这两个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同:

1. 如果fork成功,子进程中fork的返回值是0,父进程中的fork返回值是子进程的进程号;
2. 如果fork不成功,父进程会返回错误;

  创建进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看操作系统的进程调度策略。每个进程都有一个独特的进程标识符(process ID),可以通过getpid()函数获得变量的值。


值得注意的是:1.父进程和子进程的变量都是相互独立的,存在不同的地址中,并不是共用的;2.fork只是把当前的情况拷贝一份,执行fork时,进程已经执行完了fork之前的代码。fork只拷贝下一个要执行的代码到新的进程。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值