title: fork子进程

data: 2019/3/21 20:24:39

toc: true

这里实在学习socket编程前的小知识点,用来创建多个服务端

学习文档

函数可以有两个返回值?初探神奇的fork()函数

当 fork()遇上for循环, 使用fork()函数的坑,请你注意!

速记

  • fork并不保证父子进程的执行顺序,会存在父进程先比子进程结束,这个时候子进程的就可能由系统进程1( PID为 1 的 init)接管
  • 子进程返回 0
  • 父进程返回子进程的进程号 (PID)
  • 粗浅的理解就是fork之后创建了一个一模一样的上下文,子进程也是从下一句话开始的,只不过fork获得的返回值在子进程中得到的是0

简单代码

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h> int main()
{
pid_t pid1;
pid_t pid2; printf("%d\n", 1);
pid1 = fork();
printf("%d\n", 2);
pid2 = fork(); printf("pid1:%d, pid2:%d\n", pid1, pid2);
}

这里会打印

1
2
2
pid1:2101, pid2:2102
pid1:2101, pid2:0
pid1:0, pid2:2103
pid1:0, pid2:0

也就是fork后从此处就有两个同样的进程开始了

僵尸进程signal(SIGCHLD, SIG_IGN)

https://blog.csdn.net/u010571844/article/details/50419798

https://baike.baidu.com/item/僵死进程/4870712?fr=aladdin

SIGCHLD信号,子进程结束时, 父进程会收到这个信号。如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。

fork子进程的更多相关文章

  1. localtime死锁——多线程下fork子进程

    近期測试我们自己改进的redis,发如今做rdb时,子进程会一直hang住.gdb attach上.堆栈例如以下: (gdb) bt #0 0x0000003f6d4f805e in __lll_lo ...

  2. 缺陷的背后(四)---多进程之for循环下fork子进程引发bug

    导语 业务模块为实现高并发时的更快的处理速度,经常会采用多进程的方式去处理业务.多进程模式下常见的三种bug:for循环下fork子进程导致产生无数孙子进程,僵尸进程,接口窜包.本章主要介绍第一种常见 ...

  3. 转:fork()子进程创建

    源地址:http://blog.chinaunix.net/uid-23037385-id-2565472.html fork()子进程创建 在 UNIX 系统中,用户创建一个新进程的唯一方法就是调用 ...

  4. fork子进程僵尸问题及解决方案

    额,原来用 c 写 cgi 的时候用过 fork .那时候 cgi 的生命很短,所以遇到的问题压根没出现过.这次也是更加深入的对 fork 机制进行了一下了解. 参考这里的文档:http://ju.o ...

  5. fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)

    今天看到一道题,要求是父进程fork出两个子进程,子进程1需要给子进程2发送一个数据,然后子进程2再将这个数据发送给父进程 具体思想如下. 父进程fork出来的子进程的pid,只有父进程保存下来了, ...

  6. fork()子进程与waitpid()

    #!/usr/bin/perl use warnings; use strict; use POSIX ":sys_wait_h"; $SIG{CHLD} = sub{ my $p ...

  7. Linux API fork 子进程 创建 & 无名管道通信

    #include<unistd.h> #include<stdio.h> int main() { ]; ]; pipe(filedes); printf("my p ...

  8. fork 子进程,父进程对于变量的共享

    经过代码的练习发现: fork创建的子进程会完全复制父进程的代码包括变量,既复制fork之前创建的变量. 但是在创建子进程后,子进程与父进程对同一个变量的改变将相互不受影响,即使获取同一变量的地址是一 ...

  9. epoll在fork子进程中的问题

    epoll_create 创建的 文件描述符和其他文件描述符一样,是被fork出的子进程继承的,那也就是子进程可以使用这个epoll fd添加感兴趣的io(epoll_ctl),然后是可以影响到父进程 ...

随机推荐

  1. C语言经典算法 - 多维矩阵转一维矩阵的代码

    下边内容内容是关于C语言经典算法 - 多维矩阵转一维矩阵的内容,应该能对码农也有好处. #include <stdio.h>#include <stdlib.h>int mai ...

  2. Node编码规范

    编码规范 1. 缩进 采用2个空格缩进,而不是tab缩进.空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来紧凑.明快. 2. 变量声明 永远用var声明变量,不加v ...

  3. MySQL 基础知识梳理学习(七)----sync_binlog

    一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法.搭建MySQL集群,可以进行数据库层面的读写分离.负载均衡或数据备份.基于MySQL原生的Replic ...

  4. [转载]——说说IO

    本文转载自"和你在一起"的"说说IO"系列文章https://pengjiaheng.iteye.com/,总共分为8篇,特意整理.收录在此,支持原创.尊重原创 ...

  5. Delphi中使用ISuperObject解析Json数据

    Java.Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即Isuper ...

  6. RAC Wait Event: gcs log flush sync 等待事件 转

    RAC Wait Event: gcs log flush sync https://www.hhutzler.de/blog/rac-wait-event_gcs_log_flush_sync/#o ...

  7. QPalette

    Help on class QPalette in module PyQt5.QtGui: class QPalette(sip.simplewrapper) |  QPalette() |  QPa ...

  8. PHP+Mysql 实现数据库增删改查

    PHP和Mysql可以对数据库进行简单的增删改查,本文介绍了新闻列表的后台管理. Mysql数据库创建 创建一个新闻列表的数据库: 1. 查询数据库 1.1. 创建文件dbconfig.php,保存常 ...

  9. 随心测试_数据库_002 <数据库系统组成>

    软测工程师:作为综合运用多学科知识,保障软件质量的重要岗位.需要我们学以致用,在工作中不断学习提升.以下:软测人员必备_数据库核心技能学习点,供大家学习参考. 数据库系统组成_必备 1. 简介:数据库 ...

  10. 算法笔记-exgcd

    扩展欧几里得 扩展欧几里德算法是用来在已知a, b求解一组x,y, 使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理). 扩展欧几里德常用在求解模线性方 ...