/***  pthread_atfork 示例程序*  *  作者:rtoax*  日期:2020年11月18日*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>#define LOG_ERROR(err, msg) do { errno = err; perror(msg); exit(-1); } while(0)#define log_parent(fmt...)  do{printf("\033[33m[%d]", getpid());printf(fmt);printf("\033[m");}while(0)
#define log_child(fmt...)  do{printf("\033[32m[%d]", getpid());printf(fmt);printf("\033[m");}while(0)int count = 0;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void sig_handler(int signum)
{printf("\033[m Catch Ctrl-C.\n");exit(1);
}void atfork_prepare() {int err;log_parent("atfork_prepare: pthread_mutex_lock ...\n");err = pthread_mutex_lock(&lock);if (err != 0) LOG_ERROR(err, "atfork_prepare: pthread_mutex_lock failed");
}void atfork_parent() {int err;log_parent("atfork_parent: pthread_mutex_unlock ...\n");err = pthread_mutex_unlock(&lock);if (err != 0) LOG_ERROR(err, "atfork_parent: pthread_mutex_unlock");
}void atfork_child() {int err;log_child("atfork_child: pthread_mutex_unlock ...\n");err = pthread_mutex_unlock(&lock);if (err != 0) LOG_ERROR(err, "atfork_child: pthread_mutex_unlock");
}void* thread_proc(void* arg) {while(1) {pthread_mutex_lock(&lock);count++;log_parent("parent thread:  count:%d\n",count);sleep(5);pthread_mutex_unlock(&lock);sleep(1);}return NULL;
}int main(int argc,char * argv[])
{int err;pid_t pid;pthread_t tid;signal(SIGINT, sig_handler);/* 创建线程 */pthread_create(&tid, NULL, thread_proc, NULL);/* atfork操作 */err = pthread_atfork(atfork_prepare, atfork_parent, atfork_child);if (err != 0) LOG_ERROR(err, "atfork");sleep(1);log_parent("parent is about to fork start...\n");pid = fork();if (pid < 0) {LOG_ERROR(errno, "fork");} else if (pid == 0) {// child processint status;log_child("child running\n");while(1) {pthread_mutex_lock(&lock);count ++;log_child("child: count:%d\n",count);sleep(2);pthread_mutex_unlock(&lock);sleep(1);}exit(0);}log_parent("parent is about to fork done...\n");pthread_join(tid, NULL);
}

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));相关推荐

  1. 数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)

    目录 一.树的双亲表示 存储结构 总代码 二.树的孩子表示 存储结构 总代码 三.树的双亲孩子表示 存储结构 一.树的双亲表示 存储结构 采用结构体数组的形式存储数据. (根结点parent=1:它没 ...

  2. Overload Overwrite Override

    C++: Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载. (1)相同的范围(在同一个类中): (2)函 ...

  3. dex文件结构(三):dex文件差分包分成

    作者:hackest 链接:https://www.jianshu.com/p/5a2e33a61ba2 当程序越来越大之后,出现了一个 dex 包装不下的情况,通过 MultiDex 的方法解决了这 ...

  4. 嵌套的Try-Catch块--------异常处理(3)

    当有一个Try块没有一个对应的异常可处理,则其父类的异常处理机制去处理.如果父类的异常处理机制不能处理,则java run-time system将会抛出一个异常. 例子: class Nest{pu ...

  5. java中的缩小_在Java中,加宽转换(隐式)和缩小转换(显式)之间有什么区别?...

    Java中的类型转换用于将一种类型的对象或变量转换为另一种类型.当我们将一种数据类型转换或分配给另一种数据类型时,它们可能不兼容.如果合适的话,它将顺利进行,否则会丢失数据. Java中的类型转换类型 ...

  6. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  7. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  8. 【Qt】QWidget类详解(函数篇)

    00. 目录 文章目录 00. 目录 01. 概述 02. Reimplemented Public Functions 03. Public Slots 04. Signals 05. Static ...

  9. C# override详解

    重载.重写.覆写,分别指的是overload.override.new. 一.override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名.参数类型与个数)相同.用于扩展或修改继承的方 ...

最新文章

  1. C#遍历得到指定文件夹下的所有文件和子文件夹
  2. CKfinder2.0.2版本破解
  3. 计算机it分几个学,2020德国计算机专业申请指南 IT专业学习有哪些难度
  4. 年龄计算、工作表合并、高级筛选(三)
  5. python收集数据程序_用一行Python代码进行数据收集探索!Python真牛逼!
  6. 【Java并发性和多线程】Java中的锁
  7. Docker 数据管理
  8. 使用面向 iOS 的本机插件扩展
  9. html实现颜色色板,JS实现的系统调色板完整实例
  10. JSON数组转LIST集合的两种方法
  11. SpringBoot和hadoop组件Hive的集成
  12. 【计算机组成原理】二、静态随机存储器实验
  13. 网络营销:如何进行H5活动宣传?
  14. 二叉树创建之先序法-递归算法
  15. 应用计算机解数学模型之我见,计算机模拟算法在数学建模中的应用
  16. dmd oracle,【智能科技学院】TF-SWUFE Oracle Club DMD方向召开第五周核心成员分享会...
  17. iOS内存分配与五大区域
  18. 计算机组成原理白中英第七章,计算机组成原理第七章课件(白中英版).ppt
  19. ecshop mysql 标题表_ECshop 每个数据库表结构说明_MySQL
  20. c语言中置逆三位正整数,C语言程序设计 – 第 05 章课后习题(11页)-原创力文档...

热门文章

  1. HTML5特性system,HTML5教程 FileSystemAPI整理
  2. 它在计算机房的旁边英文,计算机房设备搬迁协议 (中英文)
  3. c语言2阶数组指针,C语言的指针(进阶篇章之二)
  4. 合并柱_重要快讯!辽宁三市“合并获批”重大消息
  5. solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
  6. Spring框架----通用切入点表达式
  7. 部分基于layui的时间函数
  8. shell实现https登录
  9. 3.数据类型和变量---用Python做数学运算
  10. 1-Mybatis入门案例