Linux进程 -- fork操作

fork函数

#include <unistd.h>
pid_t fork(void);

功能:子进程复制父进程的0到3G空间和父进程中的PCB,但是id号不同。

特点:调用一次,返回两次。

  1. 父进程中返回子进程ID
  2. 子进程中返回0
  3. 读时共享,写时复制

fork示例:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    pid_t pid;//进程id
    char *message;
    int n;
    pid = fork();
    if (pid < 0) {    //创建进程失败
        perror("fork failed");
        exit(1);
    }
    if (pid == 0) {    //子进程
        message = "This is the child\n";
        n = 6;
    } else {     //父进程
        message = "This is the parent\n";
        n = 3;
    }

    for(; n > 0; n--) {
        printf(message);
        sleep(1);
    }
    return 0;
}

Linux进程 -- fork操作_第1张图片

如上图,fork()后子进程复制父亲代码段产生。

进程相关函数

getpid/getppid

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);    //返回调用进程的PID号
pid_t getppid(void);   //返回调用进程父进程的PID号

getuid/geteuid

#include <unistd.h>
#include <sys/types.h>

uid_t getuid(void); //返回实际用户ID
uid_t geteuid(void); //返回有效用户ID

getgid/getegid

#include <unistd.h>
#include <sys/types.h>

gid_t getgid(void); //返回实际用户组ID
gid_t getegid(void); //返回有效用户组ID

fork与vfork的区别

vfork函数

#include <unistd.h>

pid_t vfork(void);

函数说明:vfork()会产生一个新的子进程。

但是vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。

vfork与fork的区别

vfork()用法与fork()相似,但是也有区别,具体区别归结为以下3点:

  • fork():子进程拷贝父进程的数据段,代码段。vfork():子进程与父进程共享数据段。

  • fork():父子进程的执行次序不确定。
    vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec或_exit之后父进程才可能被调度运行。

  • vfork()保证子进程先运行,在它调用exec_exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

  • 当需要改变共享数据段中变量的值,则拷贝父进程。

你可能感兴趣的:(linux,fork)