![](https://img-blog.csdnimg.cn/20210407221639327.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux下C语言应用编程
文章平均质量分 75
Linux下C语言应用编程
Overboom
这个作者很懒,什么都没留下…
展开
-
Linux系统应用编程 --- 多线程之线程回收
线程和进程一样,子线程退出的时候其内核资源主要由主线程回收,线程库中提供的线程回收函叫做 pthread_join(),这个函数是一个阻塞函数,如果还有子线程在运行,调用该函数就会阻塞,子线程退出函数解除阻塞进行资源的回收,函数被调用一次,只能回收一个子线程,如果有多个子线程则需要循环进行回收。另外通过线程回收函数还可以获取到子线程退出时传递出来的数据,函数原型如下:#include <pthread.h>// 这是一个阻塞函数, 子线程在运行这个函数就阻塞// 子线程退出, 函数解除阻原创 2021-11-29 23:45:00 · 4698 阅读 · 0 评论 -
Linux系统应用编程 --- 多线程同步之信号量
1. 信号量函数信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。信号量不一定是锁定某一个资源,而是流程上的概念,比如:有 A,B 两个线程,B 线程要等 A 线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。信号量(信号灯)与互斥锁和条件变量的主要不同在于” 灯” 的概念,灯亮则意味着资源可用,灯灭则意味着不可用。信号量主要阻塞线程,不能完全保证线程安全,如果要保证线程安全,需要信转载 2021-04-18 16:27:46 · 998 阅读 · 1 评论 -
Linux系统应用编程 --- 多线程同步之条件变量
1.条件变量函数严格意义上来说,条件变量的主要作用不是处理线程同步,而是进行线程的阻塞。如果在多线程程序中只使用条件变量无法实现线程的同步,必须要配合互斥锁来使用。虽然条件变量和互斥锁都能阻塞线程,但是二者的效果是不一样的,二者的区别如下:1)假设有 A-Z 26 个线程,这 26 个线程共同访问同一把互斥锁,如果线程 A 加锁成功,那么其余 B-Z 线程访问互斥锁都阻塞,所有的线程只能顺序访问临界区2)条件变量只有在满足指定条件下才会阻塞线程,如果条件不满足,多个线程可以同时进入临界区,同时..转载 2021-04-18 16:18:00 · 286 阅读 · 0 评论 -
Linux系统应用编程 --- 多线程同步之读写锁【rwlock】
1. 读写锁函数1.1 读写锁概念介绍读写锁是互斥锁的升级版,在做读操作的时候可以提高程序的执行效率,如果所有的线程都是做读操作, 那么读是并行的,但是使用互斥锁,读操作也是串行的。读写锁是一把锁,锁的类型为 pthread_rwlock_t,有了类型之后就可以创建一把互斥锁了:pthread_rwlock_t rwlock;之所以称其为读写锁,是因为这把锁既可以锁定读操作,也可以锁定写操作。为了方便理解,可以大致认为在这把锁中记录了这些信息:锁的状态:锁定 / 打开 锁定的是什转载 2021-04-18 16:11:36 · 309 阅读 · 0 评论 -
Linux系统应用编程 --- 线程同步
转载链接:作者: 苏丙榅链接: https://subingwen.cn/linux/thread-sync/#1-2-%E5%90%8C%E6%AD%A5%E6%96%B9%E5%BC%8F为什么需要线程同步,笼统的说,有下面三个原因:1.共享资源,多个线程都可对共享资源操作2.线程操作共享资源的先后顺序不确定3.处理器对存储器的操作一般不是原子操作假设有 4 个线程 A、B、C、D,当前一个线程 A 对内存中的共享资源进行访问的时候,其他线程 B, C, D 都不可以对这块内存.转载 2021-04-18 15:04:37 · 268 阅读 · 1 评论 -
Linux系统应用编程 --- 多线程同步之互斥锁【mutex】
1. 互斥锁函数互斥锁是线程同步最常用的一种方式,通过互斥锁可以锁定一个代码块,被锁定的这个代码块,所有的线程只能顺序执行 (不能并行处理),这样多线程访问共享资源数据混乱的问题就可以被解决了,需要付出的代价就是执行效率的降低,因为默认临界区多个线程是可以并行处理的,现在只能串行处理。在 Linux 中互斥锁的类型为 pthread_mutex_t,创建一个这种类型的变量就得到了一把互斥锁:pthread_mutex_t mutex;在创建的锁对象中保存了当前这把锁的状态信息:锁定还是打转载 2021-04-18 15:17:09 · 469 阅读 · 0 评论 -
Linux系统应用编程 --- 线程原语
1. pthread_create#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);pthread_t *thread:传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID)const pthread_attr_t *attr:线程属性设置,如使用默原创 2021-04-18 13:31:41 · 147 阅读 · 0 评论 -
Linux系统应用编程 --- 线程基本概念
1. 线程的概念LWP: light wight process,轻量级进程,本质还是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间Linux下:进程:最小的执行单位线程:最小分配资源单元,可看成是只有一个进程的线程2. Linux线程实现原理1、轻量级线程也有PCB,创建线程使用的底层函数和进程一样,都是clone2、从内核里看进程和线程...原创 2021-04-18 12:23:37 · 147 阅读 · 0 评论 -
Linux系统应用编程 --- 信号
0. Linux提供了那些信号?信号编号32之前的信号,称之为unix经典信号。信号编号32之后的信号,称之为实时信号,驱动编程常用1. 信号产生种类1.1 特殊终端按键Ctrl+CSIGINTCrtl+Z SIGTSTPCtrl+\SIGQUIT1. 2硬件异常1)除0操作2)访问非法内存1. 3 Kill函数或者kill指令#include ...原创 2021-04-18 00:47:54 · 129 阅读 · 0 评论 -
Linux系统应用编程 --- 信号处理函数(sigaction实现信号捕捉设定)
sigaction实现信号捕捉#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction 定义:struct sigaction {void (*sa_handler)(int);voi...原创 2019-04-06 12:54:21 · 694 阅读 · 0 评论 -
Linux系统应用编程 --- 信号处理函数(sigprocmask、sigpending函数)
信号集处理函数 int sigemptyset(sigset_t *set); 清空信号集,将信号集全部置0int sigfillset(sigset_t *set); 将信号集全部置1int sigaddset(sigset_t *set, int signo) ...原创 2019-04-06 12:35:21 · 896 阅读 · 0 评论 -
Linux系统应用编程---进程间通信(二)【内存共享映射mmap】
参考链接:https://blog.csdn.net/qq_44361695/article/details/99075993https://segmentfault.com/a/1190000014616732http://www.cppblog.com/jerryma/archive/2011/08/02/152279.html1. 内存共享映射的概念mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作。mmap也设置了两种...原创 2021-04-17 23:58:11 · 269 阅读 · 1 评论 -
Linux系统应用编程---进程间通信(一)【管道pipe fifo】
0. 进程间通信(IPC inter process communication)的概念每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。1. 管道的工作原理2. pipe(有名管道)函数原型#include <u...原创 2021-04-15 23:13:40 · 176 阅读 · 0 评论 -
Linux系统应用编程 --- Linux下C进程内存布局
1. C进程下,内存是怎么布局的?C进程内存布局如下图原创 2021-04-15 22:06:30 · 153 阅读 · 0 评论 -
Linux系统应用编程 --- 进程原语(三)
wait & waitpdi1. 僵尸进程和孤儿进程的概念僵尸进程(1)子进程先于父进程结束。子进程结束后父进程此时并不一定立即就能帮子进程“收尸”,在这一段(子进程已经结束且父进程尚未帮其收尸)子进程就被称为僵尸进程。(2)子进程除 task_struct 和栈外其余内存空间皆已清理(3)父进程可以使用 wait 或 waitpid 以显式回收子进程的剩余待回收内存资源并且获取子进程退出状态。【父进程帮子进程收尸是要调用函数的】(4)父进程也可以不使用 wait 或者 wa原创 2021-04-14 23:34:26 · 219 阅读 · 0 评论 -
Linux系统应用编程 --- 进程原语(二)
exec函数1. exec函数作用用fork创建子进程后执行的是和父进程相同的程序,可以通过if判断pid的返回值让子进程执行不同的代码分支,这样设计程序不灵活。通过调用exec函数,用新程序将子进程的用户空间代码和数据替换,直接去执行新程序。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。2. execc族函数原型其实有六种以exec开头的函数,统称exec函数:#include <unistd.h> int execl(const char .原创 2021-04-14 22:56:36 · 159 阅读 · 0 评论 -
Linux系统应用编程 --- 进程原语(一)
进程原语一. fork函数1. 函数原型pid_t fork(void);子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。2. 以具体的程序讲解fork函数特点第一段代码#include <stdio.h>#include <sys/types.h>#include <unistd.h> int main(void){ //fork创建一个新进程 pid_t p1 = -1;原创 2021-04-13 23:32:18 · 232 阅读 · 0 评论 -
Linux系统应用编程 --- 虚拟地址空间的理解
操作系统会为每个进程分配0-3G的虚拟空间,3G-4G是留给内核空间的假设物理内存为2G,那个操作系统如何给每个进程分配内核空间和用户空间?1、为什么不同进程的内核空间可以共用?因为应用层是无法修改内核空间的内容的2、操作系统是怎么管理内存空间的?(1)虚拟内存映射表,按照page去管理内存的,1page = 4096bytes所以我们在malloc内存的时候,如果先malloc2000字节,在malloc 3000字节,就会分配两个page,造成内存浪费,所以应该按照409原创 2021-04-13 21:51:09 · 139 阅读 · 0 评论 -
Linux系统应用编程 --- ext2文件系统
参考链接:https://www.linuxidc.com/Linux/2019-08/159814.htmhttps://www.linuxidc.com/Linux/2019-08/159815.htm1. 文件系统的概念文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,.原创 2021-04-10 23:54:06 · 257 阅读 · 0 评论 -
Linux系统应用编程 --- 文件I/O实现输出重定向
实现输出重定向,当用C标准printf打印 时,打印到指定的output.log文件思路:1)printf默认输出到标注输出文件描述符指向的终端2)关闭标准输出文件描述符,那么新建文件的文件描述符就替代了标准输出文件描述符。#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#原创 2021-04-10 22:35:51 · 171 阅读 · 0 评论 -
Linux系统应用编程 --- 文件I/O
1. 文件描述符Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。文件描述符是一个非负整数,用于唯一标识计算机操作系统中打开的文件。 它描述了数据资源,以及如何访问该资源。下面这张图, 不同进程拥有自己独立的PCB,PCB是存放进程管理和控制信息数据的一个结构体,其中包含了管理文件的指针,每个进程都会默认打开三个文件,对应文件描述符为0,1,2.标准输入(standard input)的文件描述符是 0,标准输出(standard output)的文件原创 2021-04-08 22:50:27 · 239 阅读 · 0 评论