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

来源:互联网 发布:西工大编程社区 编辑:程序博客网 时间:2024/05/02 00:00

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.outI'm the child process, my process ID is 5146I'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只拷贝下一个要执行的代码到新的进程。


0 0
原创粉丝点击