欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

父进程和子进程之间

发布时间:2023/12/15 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 父进程和子进程之间 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

fork后父子进程共享资源

Unix环境高级编程中8.3节中说,“子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父进程和子进程并不共享这些存储空间部分。父进程和子进程共享正文段。”

书中还预留了例子说明子进程对变量所做的改变并不影响父进程中该变量的值。

/*** fork.c* 探讨父子进程共享变量问题**/#include <stdio.h> #include <unistd.h> #include <stdlib.h>int globvar = 6; /* external variable in initialized data */ char buf[] = "a write to stdout\n";int main(void) {int var; /* automatic variable on the stach */pid_t pid;var = 88;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){perror("write error");exit(1);}printf("before fork\n"); /* we don't flush stdout */if ((pid = fork()) < 0){perror("fork error");exit(1);} else if (pid == 0) { /* child */globvar++; /* modify variables */var++;} else {sleep(2); /* parent */}printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);exit(0); }

/myblog/source/fork# gcc fork.c -o fork /myblog/source/fork# ./fork a write to stdout before fork pid = 12071, glob = 7, var = 89 pid = 12070, glob = 6, var = 88

编译和运行程序,如>如上,可以看出,fork后子进程只是获得了父进程的副本,所有变量的变更都只在各自进程中有效。

实际上,fork后子进程和父进程共享的资源还包括:

  • 打开的文件
  • 实际用户ID、实际组ID、有效用户ID、有效组ID
  • 添加组ID
  • 进程组ID
  • 会话期ID
  • 控制终端
  • 设置-用户-ID标志和设置-组-ID标志
  • 当前工作目录
  • 根目录
  • 文件方式创建屏蔽字
  • 信号屏蔽和排列
  • 对任一打开文件描述符的在执行时关闭标志
  • 环境
  • 连接的共享存储段(共享内存)
  • 资源限制

父子进程之间的区别是:

  • fork的返回值
  • 进程ID
  • 不同的父进程ID
  • 子进程的tms_utime,tms_stime,tms-cutime以及tms_ustime设置为0
  • 父进程设置的锁,子进程不继承
  • 子进程的未决告警被清除
  • 子进程的未决信号集设置为空集
创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的父进程和子进程之间的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。