int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
/*** 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));相关推荐
- 数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)
目录 一.树的双亲表示 存储结构 总代码 二.树的孩子表示 存储结构 总代码 三.树的双亲孩子表示 存储结构 一.树的双亲表示 存储结构 采用结构体数组的形式存储数据. (根结点parent=1:它没 ...
- Overload Overwrite Override
C++: Overload(重载):在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型.顺序不同),即函数重载. (1)相同的范围(在同一个类中): (2)函 ...
- dex文件结构(三):dex文件差分包分成
作者:hackest 链接:https://www.jianshu.com/p/5a2e33a61ba2 当程序越来越大之后,出现了一个 dex 包装不下的情况,通过 MultiDex 的方法解决了这 ...
- 嵌套的Try-Catch块--------异常处理(3)
当有一个Try块没有一个对应的异常可处理,则其父类的异常处理机制去处理.如果父类的异常处理机制不能处理,则java run-time system将会抛出一个异常. 例子: class Nest{pu ...
- java中的缩小_在Java中,加宽转换(隐式)和缩小转换(显式)之间有什么区别?...
Java中的类型转换用于将一种类型的对象或变量转换为另一种类型.当我们将一种数据类型转换或分配给另一种数据类型时,它们可能不兼容.如果合适的话,它将顺利进行,否则会丢失数据. Java中的类型转换类型 ...
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序
1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- 【Qt】QWidget类详解(函数篇)
00. 目录 文章目录 00. 目录 01. 概述 02. Reimplemented Public Functions 03. Public Slots 04. Signals 05. Static ...
- C# override详解
重载.重写.覆写,分别指的是overload.override.new. 一.override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名.参数类型与个数)相同.用于扩展或修改继承的方 ...
最新文章
- C#遍历得到指定文件夹下的所有文件和子文件夹
- CKfinder2.0.2版本破解
- 计算机it分几个学,2020德国计算机专业申请指南 IT专业学习有哪些难度
- 年龄计算、工作表合并、高级筛选(三)
- python收集数据程序_用一行Python代码进行数据收集探索!Python真牛逼!
- 【Java并发性和多线程】Java中的锁
- Docker 数据管理
- 使用面向 iOS 的本机插件扩展
- html实现颜色色板,JS实现的系统调色板完整实例
- JSON数组转LIST集合的两种方法
- SpringBoot和hadoop组件Hive的集成
- 【计算机组成原理】二、静态随机存储器实验
- 网络营销:如何进行H5活动宣传?
- 二叉树创建之先序法-递归算法
- 应用计算机解数学模型之我见,计算机模拟算法在数学建模中的应用
- dmd oracle,【智能科技学院】TF-SWUFE Oracle Club DMD方向召开第五周核心成员分享会...
- iOS内存分配与五大区域
- 计算机组成原理白中英第七章,计算机组成原理第七章课件(白中英版).ppt
- ecshop mysql 标题表_ECshop 每个数据库表结构说明_MySQL
- c语言中置逆三位正整数,C语言程序设计 – 第 05 章课后习题(11页)-原创力文档...
热门文章
- HTML5特性system,HTML5教程 FileSystemAPI整理
- 它在计算机房的旁边英文,计算机房设备搬迁协议 (中英文)
- c语言2阶数组指针,C语言的指针(进阶篇章之二)
- 合并柱_重要快讯!辽宁三市“合并获批”重大消息
- solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
- Spring框架----通用切入点表达式
- 部分基于layui的时间函数
- shell实现https登录
- 3.数据类型和变量---用Python做数学运算
- 1-Mybatis入门案例