![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 58
「已注销」
搬砖工
展开
-
【Linux 多进程】IPC之有名管道FIFO
命名管道也被称为FIFO文件,是一种特殊的文件。由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一。(1)创建命名管道用如下两个函数中的其中一个,可以创建命名管道。#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *filename, mo...原创 2019-06-29 10:33:14 · 166 阅读 · 0 评论 -
【Linux 多线程】自旋锁与互斥锁区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。Pthreads提供了多种锁机制:Mutex(互斥量):pthread_mutex_t...原创 2019-06-20 11:29:47 · 5443 阅读 · 0 评论 -
【Linux 多线程】进线程同步之自旋锁
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变...原创 2019-06-20 11:11:36 · 411 阅读 · 0 评论 -
【Linux多线程】线程同步之信号量
什么是信号量?线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。而只有0和1两种取值的信号量叫做二进制信号量,在这里将重点介绍。而信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。我们可以使用二进制信号量来完成这个工作。...原创 2019-05-22 22:49:11 · 221 阅读 · 0 评论 -
【Linux多线程】条件变量之生产者-消费者模型
线程同步典型的案例即为生产者消费者模型,而借助条件变量来实现这一模型,是比较常见的一种方法。假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源,生产者向其中添加产品,消费者从中消费掉产品(生产者向队列中插入数据,消费者则在生产者发出队列准备好(有数据了)后接收消息,然后取出数据进行处理)。实现的关键点在以下几个方面: 生产者和消费者都对条件变量的使用加...原创 2019-05-19 11:39:50 · 404 阅读 · 1 评论 -
【Linux多线程】线程同步之条件变量
一 条件变量的APUE定义:条件变量是线程的另外一种同步机制,这些同步对象为线程提供了会合的场所,理解起来就是两个(或者多个)线程需要碰头(或者说进行交互-一个线程给另外的一个或者多个线程发送消息),我们指定在条件变量这个地方发生,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号。条件变量同锁一起使用使得线程可以以一种无竞争的方式等待任意条件...原创 2019-05-19 11:18:39 · 155 阅读 · 0 评论 -
【Linux多线程】线程同步之互斥锁
互斥锁概念:锁机制是同一时刻只允许一个线程执行一个关键部分的代码。执行步骤说明1. 初始化锁int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。互斥锁的属性在创建锁的时候指定,在Li...原创 2019-05-18 10:29:15 · 420 阅读 · 0 评论 -
【Linux多线程】线程同步
线程同步的概念:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程...原创 2019-05-18 10:09:11 · 161 阅读 · 0 评论 -
【Linux多线程】线程属性pthread_attr_t
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。//线程属性结构如下: typedef struct { int etachstate; //线程的分离状态 int schedpolicy; //线程调度策略 structsched_param schedparam; //线程的调度参数 int inherits...原创 2019-05-18 09:45:00 · 655 阅读 · 0 评论 -
【Linux多线程】pthread_cancel函数
#include<pthread.h>int pthread_cancel(pthread_tthread)发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。若是在整个程序退出时,要终止各个线程,应该在成功发送CANCEL指令后,使用pthread_join函数,等待指定的线程已经完全退出以后,再继续执行;否则,...原创 2019-05-17 23:29:49 · 881 阅读 · 0 评论 -
【Linux多线程】pthread_detach函数
创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid) ;但是调用pthread_join(pthread_id)后,如果该线程没有运行结束...原创 2019-05-17 23:12:36 · 1195 阅读 · 0 评论 -
【Linux多线程】pthread_exit函数
线程的终止可以调用pthread_exit函数来结束。也就是说,一个线程可以隐式的退出,也可以显式的调用pthread_exit函数来退出。pthread_exit函数唯一的参数value_ptr是函数的返回代码。#include <pthread.h>void pthread_exit(void *retval);代码:/*thread.c*/ #in...原创 2019-05-15 22:40:36 · 1343 阅读 · 0 评论 -
【Linux多线程】 pthread_join函数
函数pthread_join用来等待一个线程的结束,线程间同步的操作。#include <pthread.h>int pthread_join(pthread_t thread, void **retval);描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回...原创 2019-05-15 22:25:04 · 1007 阅读 · 0 评论 -
【Linux多线程】线程标识
(1) 比较两个线程ID#include <pthread.h>int pthread_equal(pthread_t tid1, pthread_t tid2);ret-若相等则返回非0值,否则返回0值(2) 获取线程自身ID#include <pthread.h>pthread_t pthread_self(void);ret-调用线程的线程...原创 2019-05-12 21:49:25 · 191 阅读 · 0 评论 -
【Linux多线程】pthread_creat函数
创建线程函数:#include<pthread.h>int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void*(*start_rtn)(void*), void *restrict a...原创 2019-05-12 21:25:23 · 226 阅读 · 0 评论 -
【Linux多线程】线程函数
POSIX线程(POSIX threads)是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。线程库实行了POSIX线程标准通常称为Pthreads。POSIX线程具有很好的可移植性,pthreads定义了...原创 2019-05-06 00:12:02 · 99 阅读 · 0 评论 -
【Linux多线程】线程的基本概念
1、什么是线程?资源管理的基本单元:进程;系统调度的基本单元:线程。线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程在某一个时刻只能做一件事情,有了多个控制线程以后,在程序的设计成在某一个时刻能够做不止一件事,每个线程处理独自的任务。需要注意的是:即使程序运行在单核处理器上,也能够得...原创 2019-05-05 19:42:57 · 179 阅读 · 0 评论 -
【Linux网络编程】标准IO之读文件流
1、freadfread() 和文件IO中的 read() 类似:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);参数:void *ptr : 读取数据存储的内存空间的地址 size_t size : 单个元素的大小 size_t nmemb: 读取数据元素的个数 FIL...原创 2019-05-26 11:43:31 · 351 阅读 · 0 评论 -
【Linux网路编程】标准IO之fseek
修改文件流读写偏移量fseek() 和文件IO中的 lseek() 类似,用于修改文件流读写的偏移量int fseek(FILE *stream, long offset, int whence);参数:FILE *stream: 指向文件的文件指针 long offset : 偏移量移动的距离 int whence : 偏移量的基址 ...原创 2019-05-26 11:34:39 · 240 阅读 · 0 评论 -
【Linux网络编程】标准IO之写文件流
1、fwritesize_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);参数:const void *restrict ptr: 写入数据在内存空间存储的地址 size_t size : 单个元素的大小 size_t nit...原创 2019-05-26 11:16:06 · 288 阅读 · 0 评论 -
【Linux网络编程】标准IO之fopen/fclose/perror
标准IO库要使用标准IO库,需要包含头文件<stdio.h>。该库为用户创建了一个连接底层系统调用的通用接口,它是ANSI C标准制定的库,因此具有可移植性(文件IO是基于Unix的POSIX标准,不可移植到Windows)。同文件IO类似,它需要先打开一个文件以建立一个访问途径,文件IO的访问途径是通过文件描述符,标准IO的访问途径是流(stream),它被实现为指向结构FI...原创 2019-05-26 10:58:04 · 243 阅读 · 0 评论 -
【Linux网络编程】系统调用
内核版本:Linux-4.19操作系统通过系统调用为运行于其上的进程提供服务。那么,在应用程序内,调用一个系统调用的流程是怎样的呢?我们以一个假设的系统调用 xyz() 为例,介绍一次系统调用的所有环节。说明:如上图所示,系统调用执行的流程如下:1. 应用程序代码调用 xyz(),该函数是一个包装系统调用的库函数;2. 库函数 xyz() 负责准备向内核传递的参数,并触发软中...原创 2019-05-26 10:13:38 · 342 阅读 · 0 评论 -
【Linux网络编程】TCP/IP模型
一 TCP/IP四层模型TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。基于TCP/IP的参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和应用层。1. 应用层应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.2. 传输层传输层对应于OS...原创 2019-05-26 09:55:08 · 324 阅读 · 0 评论 -
【Linux网络编程】OSI模型
一 OSI参考模型二 分层功能(1)物理层(Physical Layer)物理层是OSI参考模型的最低层,它利用传输介质为数据链路层提供物理连接。它主要关心的是通过物理链路从一个节点向另一个节点传送比特流,物理链路可能是铜线、卫星、微波或其他的通讯媒介。它关心的问题有:多少伏电压代表1?多少伏电压代表0?时钟速率是多少?采用全双工还是半双工传输?总的来说物理层关心的是链路的机械、电气...原创 2019-05-26 09:48:51 · 527 阅读 · 0 评论 -
【Linux网络编程】TCP/IP协议族体系结构
1、TCP/IP协议族1.1 数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网、令牌环等)上的传输。主要的协议ARP和RARP经过数据链路层封装的数据成为帧,有以太网帧、令牌环帧,其中,以太网帧的格式:MTU最大传输单元,即帧最多能携带多少上层协议数据(比如IP数据报),正因为如此,过长的IP数据报可能需要分片传输。说明:以太网帧的MTU=1500,...原创 2019-05-24 22:34:07 · 203 阅读 · 0 评论 -
【Linux】ARM与X86简要区别
1、x86和arm架构定位不同,arm基于精简指令(RISC),本身定位于嵌入式平台,简化了硬件逻辑的设计,减少了晶体管,从而降低功耗,流水线等控制并不复杂,进一步降低了晶体管数量,主要是面对轻量级的、目标明确单一的程序,所以主要都是移动端使用;2、而x86基于复杂指令集CISC,有很多机器指令,只为完成某项专门任务,所以使得硬件逻辑很复杂,加上其他流水线指令集并行、超线程、虚拟化等,复杂度很...原创 2019-06-15 10:26:21 · 3972 阅读 · 0 评论 -
【Linux】CISI与RISC指令集
(一)CISC1. CISC体系的指令特征1) 使用微代码。指令集可以直接在微代码存储器(比主存储器的速度快很多)里执行,新设计的处理器,只需增加较少的电晶体就可以执行同样的指令集,也可以很快地编写新的指令集程序。2) 庞大的指令集。可以减少编程所需要的代码行数,减轻程序员的负担。高级语言对应的指令集:包括双运算元格式、寄存器到寄存器、寄存器到存储器以及存储器到寄存器的指令。2. ...原创 2019-06-15 10:22:49 · 1028 阅读 · 0 评论 -
【Linux 命令】modinfo
Linux modinfo命令用于显示kernel模块的信息。modinfo会显示kernel模块的对象文件,以显示该模块的相关信息。命令:modinfo [-adhpV][模块文件]参数:-a或--author 显示模块开发人员。-d或--description 显示模块的说明。-h或--help 显示modinfo的参数使用方法。-p或--parameters 显示模...原创 2019-06-14 22:32:16 · 547 阅读 · 0 评论 -
【Linux命令】dd命令
Linux dd命令用于读取、转换并输出数据。dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。参数说明: if=文件名:输入文件名,缺省为标准输入。即指定源文件。 of=文件名:输出文件名,缺省为标准输出。即指定目的文件。 ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。 obs=by...原创 2019-06-01 11:44:47 · 651 阅读 · 0 评论 -
【Linux】什么是写时拷贝?
一、写时拷贝顾名思义就是“写的时候才分配内存空间”。这实际上是一种拖延战术。 例如:二、传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据或许可以共享,Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至避免拷贝数据的技术。内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空...原创 2018-10-24 22:07:55 · 2639 阅读 · 0 评论 -
【Linux】进程与线程的本质区别?
简而言之,线程是进程的一部分,进程是程序的一部分。异同:1、进程是资源分配的基本单位,而线程是调度的基本单位;2、进程与进程之间是独立的,一个进程的异常终止不会影响其它进程,而线程与线程之间大部分是共享的,一个线程的异常终止会影响其它线程,会使进程终止;3、线程与线程大部分共享,但是也有一部分数据私有,线程ID、上下文(切换时候寄存器中的值)、自己独享一个栈空间、错误码、信号屏蔽字、...原创 2018-10-28 10:42:02 · 1295 阅读 · 0 评论 -
【Linux】基本命令
1、关机 shutdown -h now2、重启 reboot3、查看ip ifconfig/ip_addr4、查看主机名 输入hostname5、常见的SSH连接工具 WinSCP、secureCRT、Xshell6、ls 命令显示当前目录的内容,后面可以跟绝对路径或者相对路径 查看绝对路径操作: 查看相对路径操作: 查看根路径的操作:...原创 2018-10-06 23:43:37 · 239 阅读 · 0 评论 -
【apue】笔记:文件I/O
1、不带缓冲的I/O每个读写都调用内核中的一个系统调用。这些不带缓冲的I/O函数不是ISO C的组成部分。2、文件描述符1)对于内核而言,所有打开的文件都通过文件描述符引用;2)为非负整数;3)当打开或者传建一个新文件时,内核向进程返回一个文件描述符;4)POSIX应用程序,0、1、2应替换成STDIN_FILENO、STDOUT_FILENO、STDERR_FILE...原创 2018-10-03 17:47:06 · 196 阅读 · 0 评论 -
【Linux】查看内核命令
cat /proc/versionuname -runame -a原创 2019-06-20 11:21:58 · 7654 阅读 · 0 评论 -
【Linux】/proc文件系统
/proc文件系统是一种特殊的、由软件创建的文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间。/proc下面的每个文件都绑定于一个内核函数,用户读取文件时,该函数动态地生成文件的内容。也可以通过写/proc文件修改内核参数/proc目录下的文件分析 /proc/$pid 关于进程$pid的信息目录。每个进程在/proc 下有一个名为其进程号的目录。例:$...原创 2019-06-20 16:40:12 · 210 阅读 · 0 评论 -
【Linux 内核】1 kmalloc函数
函数原型#include Linux/slab.h> void *kmalloc(size_t size, int flags); size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配内存,不过底层还是要和伙伴系统交互...原创 2019-05-30 00:08:18 · 907 阅读 · 0 评论 -
【Linux 内核】查看与删除.ko
例如我们要查询和删除的内核模块为hello.ko查看已加载的驱动模块列表在任何目录下: lsmod|grep hello.ko卸载驱动模块在任何目录下:rmmod hello.koinsmod/rmmod显示的模块名称,而不是对应的ko文件名...原创 2019-06-14 22:18:24 · 8982 阅读 · 0 评论 -
【Linux 内核】加载.ko的两种方法:insmod与modprobe
假设要加载的驱动程序模块名为hello.ko加载驱动模块方法一:进入hello.ko驱动模块文件所在的目录,然后直接insmod hello.ko方法二:将hello.ko文件拷贝到/lib/module/#uname -r#/目录下,这里,#uname -r#意思是,在终端中输入uname -r后显示的内核版本及名称。然后depmod(会在/lib/module...原创 2019-06-14 22:13:13 · 6511 阅读 · 0 评论 -
【Linux 内核】linux中.so、.ko、.a、.o文件区别
1、对于.so文件.so文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问。2、对于.ko文件.ko文件是内核态的动态链接库,用于内核态的动态链接使用,可以用于内核之间的模块相互调用。用户态的代码不可直接调用内核态的代码,但是可以通过其他方式进行通信。3、对于.a文件.a文件是用于静态链接时,使用的静态库。4、对于.o文件...原创 2019-06-14 22:36:00 · 5767 阅读 · 0 评论 -
【Linux 内核】container_of宏浅析
1、container_of宏作用一般的我们通过结构体变量的地址可以找到其成员的地址,但是反过来一般是行不通的。在linux内核中就有这样的一个宏:container_of,它可以实现根据结构体成员的地址,找到这个结构体变量的地址,从而对结构体中的其他成员进行访问。2、container_of宏的内核定义container_of宏在Linux内核的tools\perf\util\inc...原创 2019-06-16 10:05:22 · 242 阅读 · 0 评论