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. python在sqlite动态创建表源码

    代码之余,将开发过程中经常用的代码片段备份一下,如下的代码是关于python在sqlite动态创建表的代码,应该能对各位有所用. import sqlite3 as db conn = db.conn ...

  2. Python网络爬虫-信息标记

    信息标记的三种形式: XML(扩展标记语言) JSON(js中面向对象的信息表达形式,由类型的(string)键值对组成) "name":"北京理工大学" YA ...

  3. K邻近回归算法

    代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 10:40:22 2018 @author: zhen &qu ...

  4. 记一次 c 语言 的 多线程查找 简单实现

    //仅供参考学习 1 #define _CRT_SECURE_NO_WARNINGS //屏蔽 vs 的a #include <stdio.h> #include <stdlib.h ...

  5. c/c++ 继承与多态 文本查询的小例子(智能指针版本)

    为了更好的理解继承和多态,做一个文本查询的小例子. 接口类:Query有2个方法. eval:查询,返回查询结果类QueryResult rep:得到要查询的文本 客户端程序的使用方法: //查询包含 ...

  6. git在开发中的一些使用

    git 获取远程分支: 步骤如下: 首先:git fetch --all 其次:git checkout 分支名 例如:git checkout pmt-45424-TOUCHWEB 这样就可以获取到 ...

  7. 移除 iview的Input组件默认background效果

    .class名 .ivu-input-group-prepend{ background:rgba(255,255,255,0); color: #fff; }

  8. Education CodeForces Round 63 Div.2

    A. Reverse a Substring 代码: #include <bits/stdc++.h> using namespace std; int N; string s; int ...

  9. Mysql中的explain和desc

    查询分析器 desc 和 explain 作用基本一样,explain速度快一点 explain 一条SQL语句出出现以下参数, 其中id,select_type,table 用于定位查询,表示本行参 ...

  10. monkeyrunner简介

    monkeyrunner简介 MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Py ...