`

《APUE》:线程和fork(父子进程锁)

阅读更多
《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。

程序简介:多线程的进程通过fork函数创建子进程时,如果要清除各种锁的状态,可以通过调用pthread_atfork函数建立fork处理程序。

//《APUE》程序12-7:pthread_atfork实例  
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <signal.h>  
#include <pthread.h>  
 
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER; 
 
void prepare(void) 

    printf("preparing locks...\n"); 
    pthread_mutex_lock(&lock1); 
    pthread_mutex_lock(&lock2); 

 
void parent(void) 

    printf("parent unlocking locks...\n"); 
    pthread_mutex_unlock(&lock1); 
    pthread_mutex_unlock(&lock2); 

 
void child(void) 

    printf("child unlocking locks...\n"); 
    pthread_mutex_unlock(&lock1); 
    pthread_mutex_unlock(&lock2); 

 
void *thr_fn(void *fn) 

    printf("thread started...\n"); 
    pause(); 
    return 0; 

 
int main(void) 

    pid_t pid; 
    pthread_t tid; 
    //BSD系统和MAC OS系统不支持pthread_atfork  
#if defined(BSD) || defined(MACOS)  
    printf("pthread_atfork is unsupported\n"); 
#else  
    //见注解2  
    pthread_atfork(prepare, parent, child); 
    pthread_create(&tid, NULL, thr_fn, NULL); 
    sleep(2); 
    printf("parent about to fork...\n"); 
 
    pid = fork(); 
    if( 0 == pid ) 
        printf("child returned from fork\n"); 
    else 
        printf("parent returned from fork\n"); 
#endif  
 
    return 0; 

运行示例(红色字体的为输入):

www.linuxidc.com @ubuntu:~/code$ gcc temp.c -lpthread -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp

thread started...
parent about to fork...
preparing locks...
parent unlocking locks...
parent returned from fork
child unlocking locks...
child returned from fork


注解:
1:父进程通过fork创建了子进程。子进程不但继承了父进程整个地址空间的副本,也继承了所有的互斥量,读写锁和条件变量的状态,如果父进程包含多个线程,子进程在fork返回之后,如果不是紧接着使用exec的话,就要清理锁状态。
2:pthread_atfork最多可以安装三个帮助清理锁的函数。prepare函数将在fork创建子进程之前被调用,通常可以用来获取进程中的所有锁;parent在fork创建子进程后返回前在父进程中被调用,可以用来释放父进程中的锁;child在fork创建子进程后fork返回前在子进程中被调用,可以用来释放子进程中的锁。给这三个参数传递NULL,表示不调用该函数。
分享到:
评论

相关推荐

    APUE:UNIX 环境中的高级编程

    APUE详细讲解了线程的创建、同步与调度,包括线程函数的定义、线程属性的设置、线程同步机制如互斥锁(mutexes)、条件变量(condition variables)和读写锁(read-write locks)。这些概念对于编写高效、无冲突的多...

    APUE:unix环境下的高级编程代码&ppt

    2. **进程管理**:包括进程创建(fork())、进程执行(exec()系列函数)、进程间通信(管道、套接字、信号量、消息队列等)、进程同步和互斥(如mutexes、semaphores)。 3. **线程编程**:在Unix环境中,线程是轻...

    APUE:UNIX环境中的高级编程

    7. **多线程编程**:使用`pthread.h`头文件中的函数进行线程创建、同步和互斥锁等操作。 8. **网络编程**:包括套接字API,如`bind()`, `listen()`, `connect()`, `send()`, `recv()`等,以及TCP/IP和UDP协议的使用...

    apue:来自http的源代码包-Source code learning

    1. **进程管理**:这部分代码展示了如何创建、终止进程,以及如何利用fork、exec系列函数实现进程间的通信和协作。例如,`waitpid.c`解释了如何等待子进程结束并获取其状态信息。 2. **文件I/O**:`stdio_ex.c`和`...

    APUE(Unix环境高级编程)中文pdf

    APUE涵盖了许多关键的Unix编程主题,包括进程管理、文件I/O、信号处理、系统调用接口、标准库函数、多线程编程、网络编程、内存管理和错误处理等。以下是对这些知识点的详细阐述: 1. **进程管理**:Unix系统中的...

    My-APUE:存储我的APUE代码和注释

    守护进程和高级I / O 进展间通信 全书脉络清晰,提纲挈领,又有很多不错的实例,我相信每一个看完这本书的人都会受益匪浅。不过在一些内容上我觉得作为后起之秀的《 Linux / UNIX系统编程手册》有很多不错的地方或者...

    APUE::four_leaf_clover:APUE的练习或测试代码

    UNIX 是多进程操作系统,在两次运行 ./a.out 的时间间隔内,有两个程序被操作系统调起成为执行实例,成为占用 CPU 和内存资源的进程,并被内核分配了唯一标识符进程ID,分别为 852 和 853。 1.3 下面函数声明中,...

    Apue unix高级编程的源码

    1. **进程管理**:包括进程创建(fork)、进程终止(exit)、进程间通信(pipe、socket、message queue、semaphore、shared memory)等。`apue.2e`中的代码可能会展示如何使用这些机制实现进程间的协同工作。 2. **...

    apue 代码

    6. **多线程编程**:介绍线程的概念、线程创建、线程同步(互斥锁、条件变量、读写锁)和线程通信(信号量、线程取消)。 7. **错误处理**:如何正确处理和报告系统调用和库函数的错误,以及使用`errno`和`perror()...

    apue.2e.zip

    2. **线程编程**:讲解线程创建、同步(互斥锁、条件变量、读写锁)、调度和取消等,帮助理解多线程环境下的程序设计。 3. **文件系统与I/O**:介绍文件系统的基本操作,如打开、关闭、读写、定位,以及低级I/O...

    apue.rar_apue_apue pudn

    APUE这本书涵盖了广泛的主题,包括进程管理、文件I/O、网络编程、多线程、信号处理、内存管理等。每个章节都配有相应的示例代码,帮助读者理解和实践这些概念。在压缩包中的“www.pudn.com.txt”可能是一个链接到更...

    UNIX环境高级编程 Advanced Programming in the UNIX_ Environment(中文版+英文版+源码)

    了解如何通过fork、exec、wait等系统调用来控制进程的生命周期,以及如何处理进程间的交互和协作。 2. **文件系统**:深入理解UNIX文件系统模型,包括文件操作、目录结构、权限管理、硬链接与软链接。学习open、...

    APUE(linux环境c编程)

    3. **进程管理**:包括进程创建、进程控制、进程间通信(IPC)等主题,如fork、exec、wait、pipe、socket、信号量、消息队列和共享内存等。 4. **文件和I/O系统**:讲解了文件系统的基本操作,如打开、关闭、读写...

    rust-apue:UNIX环境中的高级编程。 Rust中的代码

    APUE手册中的程序(UNIX:registered:环境中的高级编程)。 进步 第1章:简介 第2章:无文件:() 第3章:fileio 第4章:filedir 去做 列表 TODO: ... 如何建造 export DYLD_LIBRARY_PATH=/Applications/Xcode...

    apue:我的“UNIX环境高级编程”在线课程资源汇编

    而《UNIX环境高级编程》(APUE, Advanced Programming in UNIX Environment)无疑是这个领域的圣经,是每位开发者必读的神作。精准的用语、精良的语言组织,经历了漫长岁月的千锤百炼,可谓无出其右。数年来,这本书曾...

    APUE中文第二版.zip

    8. **多线程编程**:介绍线程的创建、同步、互斥锁、条件变量、线程局部存储等概念,以及在多线程环境下解决问题的方法。 9. **错误处理**:如何正确地处理和报告程序运行时的错误,编写健壮的UNIX程序。 10. **...

    APUE:APUE(Unix环境中的高级编程)的个人作业答案

    为什么创造这个项目 此项目为《 UNIX环境高级编程》的课后习题个人答案,这种偏实际应用的书,需要配合每一章后面的习题使用效果更佳。 每一章的习题答案放在独立的目录中,代码以习题号命名,例如第一章第一题的...

    基于linux学习apue

    2. **进程管理**:掌握创建子进程(fork)、进程间通信(管道、套接字、共享内存、消息队列等)和进程调度的概念。 3. **信号处理**:学习如何捕获、发送和处理信号,用于程序的异常处理和同步。 4. **网络编程**...

    apue2

    11. **线程编程**:虽然UNIX早期不支持线程,但现代UNIX如Linux已支持POSIX线程(pthread),APUE2也对此进行了详细介绍,包括线程创建、同步、互斥锁等。 通过学习APUE2,开发者不仅可以掌握UNIX系统编程的基本...

Global site tag (gtag.js) - Google Analytics