fork

创建一个子进程

头文件

#include < unistd.h >

函数原型

pid_t fork(void);

函数说明

创建一个子进程,子进程是几乎是父进程的完全副本,除了以下几点不一致:

  • 子进程有自己唯一的pid
  • 子进程没有继承父进程的内存锁
  • 子进程中资源限制和cpu时间重置为0
  • 子进程的信号集重置为空
  • 子进程没有继承父进程的记录锁
  • 子进程没有继承父进程的定时器

子进程和父进程的执行顺序是未知的,由调度器决定

返回值

成功返回子进程的pid给父进程,返回0给子进程
失败返回-1,同时errno记录错误码

错误码

EAGAIN : 内存不足, 没有足够的内存复制父进程的页表和创建task_struct
ENOMEM: 内存不足,没有空间分配给必要的内核结构
ENOSYS: fork不支持

范例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define ECHO(s) printf("%s pid=%d, ppid=%d, uid=%d, euid=%d,gid=%d,egid=%d\n", \
            s, \
            getpid(), \
            getppid(), \
            getuid(), \
            geteuid(), \
            getgid(), \
            getegid() \
        )

int main(int argc, char *argv[]) {

    pid_t pid;

    if ((pid = fork()) < 0) {
        perror("fork");
        return -1;
    }

    if(pid == 0) {
        ECHO("子进程");
        exit(0);
    }

    if (pid > 0){
        ECHO("父进程");
    }

    sleep(5);
    return 0;

}

执行

[root@iz2zecj7a5r32f2axsctb9z process]# ./fork
父进程 pid=17712, ppid=9399, uid=0, euid=0,gid=0,egid=0
子进程 pid=17713, ppid=17712, uid=0, euid=0,gid=0,egid=0
文档更新时间: 2021-03-04 11:11   作者:周国强