Linux系统编程
文章平均质量分 67
Linux平台下系统编程知识分享
Stack Overflow?Tan90
Linux系统开发者,计科专业,曾任职于某道Linux系统开发高级讲师、某上市公司系统开发
展开
-
ubuntu下载安装libevent
官网上下载最新稳定版本,然后拖到你的linux系统中,解压。或者可是使用wget在线下载。本文下载的是最新版本,其他版本同操作。上述程序,捕捉2号信号,并设置捕捉超时时间5秒。ubuntu下载安装libevent。若出现下面的文件,则安装成功。进入解压后的目录,执行。原创 2023-08-09 00:31:20 · 895 阅读 · 0 评论 -
死锁的原因与处理
我们先看一个生活中一个死锁的例子其实我们的生活中经常会有各种各样的死锁现象发生,同样在操作系统编程上也存在着各种各样的一不小心就会陷入死锁问题!死锁产生的原因(1)系统资源的竞争 通常系统中拥有的不可剥夺资源,其数量不满度多个进程运行的需要,造成进程在运行时,会因为争夺资源而陷入僵局(类似于马路上两个陌生人同时看到100元钱,两个人同时去捡,谁都不肯放手,两个人就一直在哪里一人扯着一半在那僵持着自行脑补画面感)。只有对不可剥夺的资源进行争夺才可能发生死锁,对可剥夺的资源的竞争不会发生死锁。(原创 2020-09-20 20:01:28 · 337 阅读 · 0 评论 -
linux虚拟机 ip变为127.0.0.1时,恢复原来ip
如果提示上述信息,表示权限不够,执行命令前面加上sudo。当虚拟机 ip变为127.0.0.1。执行: dhclient -v。转载 2023-04-26 22:32:58 · 358 阅读 · 0 评论 -
c++实现string的写时复制技术(COW)——注释超细版
c++实现string的写时复制技术(COW)——注释超细版COW(copy-on-write)前言当字符串进行复制的时候,如很长的字符串(2k大小),如果全部采用堆空间存储的话那是非常浪费空间的,复制一次变成4k大小,两次6k…所以为了节约空间,在两个字符串都是相同内容的时候,将复制后的指针指向原始字符串的地址空间,然后采用引用计数的方式对该空间的引用数+1;当修改某一指针的内容时,其实就是改变了字符串数据,那么显然变成了一个新的字符串,这时候就需要给这个新的字符串重新申请一块堆空间了,然后对原始原创 2021-12-27 23:28:16 · 3718 阅读 · 3 评论 -
高效事件处理模式reactor模式
服务器编程之高效事件处理模式reactor模式reactor模式它要求主线程只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程。除此之外,主线程不做任何其它实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。工作流程主线程往epoll内核事件表中注册socket上的读就绪事件主线程调用epoll_wait等待socket上有数据可读当socket上有数据可读时,epoll_wait通知主线程。主线程则将socket可读事件放入请求队列原创 2021-12-27 11:27:18 · 418 阅读 · 0 评论 -
aligned内存对齐
__attribute__((aligned(n)))内存对齐使用环境Linux version 4.15.0-29-generic (buildd@lgw01-amd64-057) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3))关于设置内存对齐方式上有两种方式:__attribute__((aligned(n)))编译器按照n个字节对齐#pragma pack(n) 编译器将按照n个字节对齐;#pragma pack () 取消指定对齐,恢复缺省对齐原创 2021-12-03 18:28:43 · 619 阅读 · 0 评论 -
socket网络编程简介
socket网络编程简介使用tcp协议下的网络编程,基本的API讲解服务端的流程,如下使用socket生成套接口,用于和客户端建立连接int socket(int domain, int type, int protocol);成功返回文件描述符,该描述符用于和对端建立连接使用。失败返回-1,并置错误码参数1:使用IPV4协议填AF_INET,使用IPV6协议填AF_INET6参数2:选择通信的类型:TCP协议填SOCK_STREAM参数3:协议编号,默认填0使用bind函数原创 2021-10-20 11:25:30 · 73 阅读 · 0 评论 -
进程间通信之信号(1)
信号(1)信号的基本概念信号是事件发生时对进程的通知机制。或者说是软中断(硬中断的软件模拟),收到信号的时间是无法准确知道。信号分为两个类型,通过kill -l可以查看系统中所有信号(前面数字是信号的编号也是后面宏的值) 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) S原创 2021-09-27 20:53:41 · 81 阅读 · 0 评论 -
System V IPC -- 信号量
System V IPC – 信号量信号量不同于其它IPC,它本身是不携带消息数据的,它的功能主要实现进程的同步的。上一篇讲解共享内存的时候说过,多个进程会出现同时操作共享内存的情况,多个进程访问临界资源可能会造成错误,所以需要互斥的访问,那么信号量恰好可以实现对共享内存的互斥访问!(信号量和共享内存是一对好兄弟)信号量是由内核维护的一个整数,一般该值 ≥ 0;信号量正是由内核维护的一个整数,所以对信号量的操作是原子操作,是由内核保证的!信号量最简单的理解:可以理解成是资源的剩余数量。如体育馆上有3个原创 2021-09-24 17:49:43 · 103 阅读 · 0 评论 -
System V IPC -- 共享内存
System V IPC – 共享内存共享内存故名思意,一段可以被共享的内存区域,两个及以上的进程都可以使用该区域进行数据的交互,进程使用该内存的时候需要将该内存附加到本进程的地址空间中,当需要发送数据的时候,只需要将数据复制到共享内存中即可,当需要读取数据时,同样复制出来即可。这种IPC机制无需内核介入,相比于管道、消息队列收发数据时,需要进行用户空间与内核空间进行数据拷贝的方式来说,共享内存这种IPC技术速度更快(虽然每个进程也存在通过系统调用来执行复制操作的开销)由于共享内存的这种特性,应该知道原创 2021-09-24 14:52:43 · 90 阅读 · 0 评论 -
system V IPC --消息队列
System V IPC – 消息队列消息队列的创建#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int msgflg);返回值:成功返回消息队列的标识符,失败返回-1并置错误码参数1:key值(通常是IPC_PRIVATE或者使用ftok生成:https://blog.csdn.net/weixin_48617416/artic原创 2021-09-24 10:01:27 · 103 阅读 · 0 评论 -
system V IPC key值
system V IPC key最详细教程在使用System V IPC时,无论调用shmget()、semget()、msgget()哪一个函数,它的第一个参数都是key_t key,这个key可以被转换成IPC的标识符,每一个标识符都代表唯一一个IPC,那么如何生成唯一的标识符呢?最常用的有两种做法!IPC_PRIVATE:在使用get创建IPC对象时,使用IPC_PRIVATE宏作为key的值,这样每次调用get都会生成一个全新的对象。但是生成的IPC键值都是相同的了0x00000000原创 2021-09-23 15:10:49 · 199 阅读 · 0 评论 -
线程的同步-条件变量
线程的同步线程为了实现同步专门引入一种机制叫做条件变量,当然线程实现同步还有其它方式如互斥锁信号量等!条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 ------摘自百科条件变量和互斥锁的使用非常类似,互斥锁的用法在我的博客中也有详细讲解(https://blog.csdn.net/weixin_48617416/article/de原创 2021-09-22 10:26:51 · 82 阅读 · 1 评论 -
线程终止清理函数
线程终止清理函数一个线程在执行的时候可以被其它线程cancel,也可能遇到程序崩溃等情况造成线程意外退出;假如线程此时申请了堆空间,或者加了锁之后,意外退出造成堆空间或者锁没有被清理,会出现比较严重的后果,尤其是锁!所以当正在运行的线程一旦出现意外退出后该怎么处理呢?-----使用线程终止清理函数!函数原型://这是一对函数,需要成对的使用void pthread_cleanup_push(void (*routine)(void *), void *arg);//参数1:线程清理函数//参数2原创 2021-09-18 17:31:57 · 192 阅读 · 2 评论 -
线程的取消
线程的取消什么是线程的取消?一个线程杀死另外一个线程,就叫线程的取消线程如何取消其它线程?发送cancel信号,目标线程收到cancel信号后的行为是可以进行设置的;一般有三种行为:1、忽略cancel信号,2、立刻终止线程,3、运行至取消点后终止线程(这是默认的行为)什么是取消点?取消点就是一些特殊的函数,但是man手册并没有给出准确的函数,一般认为会引起阻塞的函数都是取消点,对于一些不是阻塞性的函数也可能是取消点!(具体是不是,还是要实际测一下,不过man帮助还是提拱了原创 2021-09-18 15:22:41 · 345 阅读 · 0 评论 -
线程和进程的对比
线程和进程的对比进程是资源分配的最小单位,拥有自己独立的资源空间,如代码段、数据段、堆栈段。所以cpu在进程之间切换时,需要保存较多的上下文,增加了cpu非运算执行时间,降低了cpu的利用率。所以为了解决进程切换造成较大的开销就引入了线程!一个进程中至少有用一个默认的线程,一个进程内可以创建多个线程,同一个进程内的所有线程共享进程的地址空间(也就是拥有的资源)。但同时线程也拥有自己少量的独有的栈空间。线程是cpu运算调度的最小单位,因为线程只拥有少量的栈空间,所以cpu切换一个进程内的线程,只需要保原创 2021-09-17 12:07:49 · 171 阅读 · 0 评论 -
Linux线程的创建
Linux线程的创建这里讲POSIX线程的Linux实现,使用的NPTL线程库基本概念:一个进程中至少含有一个主线程(这个是默认的,不需要程序员手动创建),同一个进程中可以创建多个子线程,这些子线程共享进程的地址空间需要注意的是:进程之间创建者进程称为父进程,被创建的进程称为子进程;进程中默认的线程称为主线程,其它统称都叫子线程!线程的创建#include <pthread.h>int pthread_create(pthread_t *thread, const pt原创 2021-09-17 11:46:04 · 289 阅读 · 0 评论 -
TIME-WAIT
TIME-WAIT什么是TIME-WAIT状态?TIME-WAIT是tcp四次挥手时,主动断开方在回复第四次挥手之后进入的一个状态。这个状态一般维持2MSL时间,Linux下是60秒,可以通过下面的命令查看cat /proc/sys/net/ipv4/tcp_fin_timeout60如果是服务端主动断开,由于是绑定本机的地址,所以如果没有设置服务端地址可重用(后面会介绍方法,先别急),是没办法在60秒内重新启动服务端的。如果是客户端主动断开,即使没设置地址可重用,也是可以马上可以重原创 2021-09-08 20:53:56 · 90 阅读 · 0 评论 -
Linux线程中锁的探索
Linux线程中锁的探索 锁的作用就是实现进程/线程对临界资源的独占式访问。线程中有很多锁可以供我们使用,如互斥锁、读写锁、自旋锁等,下面就简单总结一下这些锁的使用方式及应用场景!互斥锁 互斥锁可以说是最广泛使用的一种锁了互斥锁的初始化有两种方式://1.静态方式pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//2.动态方式:使用int pthread_mutex_init(pthread_mutex_t *restrict mu原创 2021-07-29 16:33:58 · 196 阅读 · 0 评论 -
关于send一个断开的连接相关问题总结
关于send一个断开的连接相关问题总结ssize_t send(int sockfd, const void *buf, size_t len, int flags),send的第一个参数是对端的socket描述符,如果在传输数据的时候,对端断开了连接,send会返回-1,并且返回EPIPE错误码。如果代码中没有对send返回-1的处理,第二次再send的时候会收到SIGPIPE信号!上面的话是在上课的时候对学生讲的。但是在写代码的时候,发现有时send一个断开的连接,第一次有时也会收到SIGPIPE原创 2021-07-21 14:43:47 · 905 阅读 · 0 评论 -
进程间通过线程锁实现互斥
进程间通过线程锁实现互斥前言我们知道进程间实现互斥一般使用信号量等,而线程实现互斥一般使用的是线程锁。那么可以不可以使用线程锁,应用到进程之间实现互斥呢?本着探索的精神,试着写出了代码,通过实际代码运行结果的确是行得通的。思想:先创建互斥锁变量、互斥锁属性变量,然后把锁属性设置为进程间共享方式创建一块共享内存,然后把锁变量传入共享内存。同时定义一个变量num,初始化为2千万fork创建一个子进程,父子进程同时对num减1操作,直至为0。然后分别记录每个进程执行了多少次如果父子进程操作次数相原创 2021-05-21 15:59:32 · 343 阅读 · 0 评论