Linux进程 -- fork操作

一时失言乱红尘 2022-08-20 06:27 278阅读 0赞

fork函数

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

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

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

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

fork示例:

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main(void)
  6. {
  7. pid_t pid;//进程id
  8. char *message;
  9. int n;
  10. pid = fork();
  11. if (pid < 0) { //创建进程失败
  12. perror("fork failed");
  13. exit(1);
  14. }
  15. if (pid == 0) { //子进程
  16. message = "This is the child\n";
  17. n = 6;
  18. } else { //父进程
  19. message = "This is the parent\n";
  20. n = 3;
  21. }
  22. for(; n > 0; n--) {
  23. printf(message);
  24. sleep(1);
  25. }
  26. return 0;
  27. }

这里写图片描述

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


进程相关函数

getpid/getppid

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. pid_t getpid(void); //返回调用进程的PID号
  4. pid_t getppid(void); //返回调用进程父进程的PID号

getuid/geteuid

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. uid_t getuid(void); //返回实际用户ID
  4. uid_t geteuid(void); //返回有效用户ID

getgid/getegid

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. gid_t getgid(void); //返回实际用户组ID
  4. gid_t getegid(void); //返回有效用户组ID

fork与vfork的区别

vfork函数

  1. #include <unistd.h>
  2. pid_t vfork(void);

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

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


vfork与fork的区别

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

  • fork():子进程拷贝父进程的数据段,代码段。vfork():子进程与父进程共享数据段。
  • fork():父子进程的执行次序不确定。
    vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec或_exit之后父进程才可能被调度运行。
  • vfork()保证子进程先运行,在它调用exec_exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
  • 当需要改变共享数据段中变量的值,则拷贝父进程。

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读

    相关 84-Linux下复制进程fork

    Linux下复制进程fork的方法 fork是复制进程,要把一个已有的进程复制一份,在系统中就多出1个进程,它是怎么做的? 第一步,先将父进程(原来的这个进程)的PC