
linux进阶
文章平均质量分 67
linux进阶
却道天凉_好个秋
这个作者很懒,什么都没留下…
展开
-
linux进阶57——service文件中环境变量文件的使用
service文件中环境变量文件的使用原创 2022-11-29 18:38:54 · 1943 阅读 · 0 评论 -
linux进阶56——systemd实现程序日志保存成文件
systemd实现程序日志保存成文件原创 2022-11-26 16:24:33 · 3196 阅读 · 0 评论 -
linux进阶55——service文件
service文件介绍原创 2022-11-24 21:07:27 · 4542 阅读 · 0 评论 -
linux进阶54——无锁队列的实现
(1)windows下实现(未调用windows API版本)template<class T>class node{public: T pdata; node* next;};template<class T>class SQueue{private: node<T> *front; node<T> *tear;public: SQueue(); ~SQueue(); bool empty(); T pop(原创 2021-09-28 21:53:01 · 380 阅读 · 0 评论 -
linux进阶53——strace排查cpu占用率的问题
(1)查看某一进程所有的系统调用并输出到文件中strace -o /home/output.txt -T -tt -e trace=all -p 进程id(2)查看某个进程中最耗时的线程步骤1: ps --efL | grep 进程名 | grep -v grep步骤2: gdb attach 线程号步骤3: bt(3)查看某一进程cpu占用比较高的线程1) top -H -p 进程id ----------查看耗时的线程2) strace -o /home/outp原创 2021-09-28 21:44:36 · 2442 阅读 · 0 评论 -
linux进阶52——pthread_cond_t
1. 概念条件变量是线程可用的另一种同步机制 条件变量给多个线程提供了一个会合的场所 条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生 条件变量是线程中的东西,就是等待某一条件的发生,和信号一样2. 使用场景条件变量要与互斥量一起使用,条件本身是由互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量 其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定以后才能计算条件3. 数据类型pthread_cond_t4. 条件变量初始化与释放①静态初转载 2021-09-09 22:17:29 · 10524 阅读 · 1 评论 -
linux进阶52——pthread_rwlockattr_t(读写锁属性)
1. 结构体pthread_rwlockattr_t2. 属性进程共享:读写锁支持的唯一属性就是进程共享属性,它与互斥量的进程共享属性是相同的虽然POSIX只定义了读写锁属性,但不同的平台的实现可以自由地定义额外的、非标准的属性。3. 结构体初始化#include <pthread.h>int pthread_rwlockattr_init(pthread_rwlockattr_t* attr);int pthread_rwlockattr_destroy(pth转载 2021-09-08 22:14:48 · 983 阅读 · 0 评论 -
linux进阶51——pthread_rwlock_t(读写锁)
1. 概念读写锁与互斥量类似。但是互斥量要么是锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁 不过读写锁允许更高的并行性,而且有更多的状态读写锁可以有3种状态:①读模式下加锁 ②写模式下加锁 ③不加锁状态2. 使用当读写锁是写加锁状态时:在这个锁被解锁之前,所有试图对这个锁加锁的线程都会阻塞(不论是读还是写) 当读写锁是读加锁状态时:所有试图以读模式对它进行加锁的线程都可以得到访问权。但是任何希望以写模式对此锁进行加锁的线程都会阻塞,直到所有的线程释放它们的读锁为止转载 2021-09-05 22:16:00 · 8837 阅读 · 2 评论 -
linux进阶50——无锁CAS
1. 概念转载 2021-08-23 20:25:34 · 1340 阅读 · 1 评论 -
linux进阶49——syscall
1. 概念syscall()是一个小的库函数,它调用系统调用,该系统调用的汇编语言接口具有指定的带指定参数的数字。syscall()在进行系统调用之前保存CPU寄存器,从系统调用返回时恢复寄存器,如果发生错误,将系统调用返回的任何错误代码存储在errno。2. 函数定义#define _GNU_SOURCE /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.原创 2021-08-22 22:41:49 · 2562 阅读 · 0 评论 -
linux进阶48——网络编程:UDP程序设计
UDP——服务器程序设计步骤1)创建一个socket,用函数socket();2)绑定IP地址、端口等信息到socket上,用函数bind();3)循环接收数据,用函数recvfrom();4)关闭网络连接UDP——客户端程序设计步骤1)创建一个socket,用函数socket();2)绑定IP地址、端口等信息到socket上,用函数bind();3)设置对方的IP地址和端口等属性;4)发送数据,用函数sendto();5)关闭网络连接;示例udp_s原创 2021-08-18 19:59:26 · 216 阅读 · 0 评论 -
linux进阶47——pthread_cond_wait()
1. 条件变量条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 2. 创建与注销条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下:pthread_cond_t cond=PTHREAD_COND_INITIALIZER 初始化条件变量:..转载 2021-08-16 22:20:49 · 2286 阅读 · 0 评论 -
linux进阶46——网络编程:TCP程序设计
TCP——服务器程序设计步骤1)创建一个socket,用函数socket();2)绑定IP地址、端口等信息到socket上,用函数bind();3)设置允许的最大连接数,用函数listen();4)等待来自客户端的连接请求,用函数accept();5)收发数据,用函数send()和recv(),或者read()和write();6)关闭网络连接;TCP——客户端程序设计步骤1)创建一个socket,用函数socket();2)设置要连接的服务器的IP地址和端口等属原创 2021-08-15 17:27:00 · 200 阅读 · 0 评论 -
linux进阶45——多线程程序设计(五):线程清除
线程清除压栈函数定义#include <pthread.h>void pthread_cleanup_push(void (*rtn)(void *), void *arg);将清除函数压入清除栈。返回值无参数rtn:清除函数arg:清除函数的参数线程函数出栈函数定义#include <pthread.h>void pthread_cleanup_pop(int execute);将清除函数弹出清除栈。返回值无参原创 2021-08-15 13:15:27 · 405 阅读 · 0 评论 -
linux进阶44——多线程程序设计(四):线程标识
线程标识函数定义#include <pthread.h>pthread_t pthread_self(void);获取调用线程的tid。返回值返回调用线程的id。参数无源码实现pthread_t__pthread_self (void){ return (pthread_t) THREAD_SELF;}strong_alias (__pthread_self, pthread_self)# define THREAD_SELF \原创 2021-08-15 11:15:57 · 208 阅读 · 0 评论 -
linux进阶43——多线程程序设计(三):线程等待
线程等待函数定义#include <pthread.h>int pthread_join(pthread_t tid, void **rval_ptr);阻塞调用线程,直到指定的线程终止。返回值成功返回0,失败返回错误码。错误码定义如下:ERRORS EDEADLK A deadlock was detected (e.g., two threads tried to join with each other); or原创 2021-08-12 22:48:28 · 150 阅读 · 0 评论 -
linux进阶42——多线程程序设计(二):终止线程
终止线程函数定义#include <pthread.h>void pthread_exit(void* rval_ptr);终止调用线程。返回值RETURN VALUE This function does not return to the caller.参数rval_ptr:线程退出返回值的指针。示例1——使用return终止#include <stdio.h>#include <pthread.h>#i原创 2021-08-12 22:24:45 · 130 阅读 · 0 评论 -
linux进阶41——多线程程序设计(一):创建线程
1. 创建线程1.1 函数定义#include <pthread.h>int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);1.2 返回值成功返回0,失败返回错误编号。1.3 参数tidp:线程id; attr:线程属性(通常为空)原创 2021-08-12 21:56:10 · 224 阅读 · 0 评论 -
linux进阶40——futex
1. 概念Futex 是Fast Userspace muTexes的缩写,由Hubertus Franke, Matthew Kirkwood, Ingo Molnar and Rusty Russell共同设计完成。Futex按英文翻译过来就是快速用户空间互斥体。其设计思想其实 不难理解,在传统的Unix系统中,System V IPC(inter process communication),如 semaphores, msgqueues, sockets还有文件锁机制(flock())等进程原创 2021-08-09 21:38:18 · 3246 阅读 · 0 评论 -
linux进阶39——信号量
1. 概念信号量与其他进程间的通信方式不大相同,主要用途是保护临界资源。进程可以根据它判断是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。2. 分类二值信号量:信号量的值只能取0或1,类似于互斥锁。但两者有不同:信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。计数信号量:信号量的值可以取任意非负值。3. 创建信号量3.1 函数定义#include <sys/types原创 2021-08-04 21:12:23 · 249 阅读 · 0 评论 -
linux进阶38——消息队列
1. 概念消息队列就是一个消息的链表。可以把消息看作是一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读取消息。2. 分类POSIX消息队列 系统V消息队列3. 特性系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。4. 创建键值消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必须提供该消息队列的键值。4.1 函数定义#include <原创 2021-08-01 23:07:35 · 487 阅读 · 0 评论 -
linux进阶37——共享内存
1. 概念共享内存就是允许两个或多个进程共享一定的存储区。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。注:共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步。2. 特点两个进程地址通过页表映射到同一片物理地址以便于通信,你可以给一个区域里面写入数据,理所当然你就可以从中拿取数据,这也就构成了进程间的双向通信,而且共享内存是IPC通.转载 2021-07-29 21:32:18 · 631 阅读 · 0 评论 -
linux进阶36——信号
1. 概念linux系统支持的所有信号均定义在/usr/include/asm/signal.h,其中常见的信号有:SIGNKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进程停止或结束时用来通知父进程2. 发送信号2.1 函数原型#include <signal.h>int kill(pid_t pid, int signo);int raise(int signo);kill函数将信号发送给进程或进程组。raise函数允许进程向自身发送信原创 2021-07-28 18:58:01 · 283 阅读 · 0 评论 -
linux进阶35——有名管道
1. 概念有名管道又称为FIFO文件,因为我们对有名管道的操作可以采用操作文件的方法,如使用open,read,write等。与普通文件的区别:读取fifo文件的进程只能以"RDONLY"方式打开fifo文件; 写fifo文件的进程只能以"WRONLY"方式打开fifo文件; fifo文件里面的内容被读取后,就从管道中消失了。但是普通文件里面的内容读取后还存在;2. 创建有名管道(fifo文件)2.1 函数原型#include <sys/stat.h>int mk原创 2021-07-27 22:01:35 · 817 阅读 · 0 评论 -
linux进阶34——无名管道
1. 管道通信1.1 概念一个进程在管道的尾部写入数据(管道的作用:数据的共享),另一个进程从管道的头部读出数据。管道包括无名管道和有名管道。无名管道只能用于父进程和子进程间的通信,有名管道可用于运行于同一系统中的任意两个进程间的通信。1.2 特点管道通讯是单向的,有固定的读端和写端; 数据被进程从管道读出后,在管道中的数据就不存在了; 当进程去读取空管道的时候,进程会阻塞; 当进程往满管道写入数据时,进程会阻塞; 管道的容量是64KB(#define PIPE_BUFFERS.原创 2021-07-25 18:37:29 · 431 阅读 · 0 评论 -
linux进阶33——动态链接库
前言前面一篇介绍了静态链接库,静态链接库的实现方式为直接注入目标程序,随目标程序一起加载进内存,会造成空间的浪费。而动态链接库是在目标程序运行时加载的,同时解决了程序更新、部署等问题。1. 概念linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中采用*.so.*方式命名的是动态链接库。2. 特点对库函数的链接推迟到程序运行时执行; 可以实现进程之间的资源共享; 便于程序升级;3. 制作流程gcc -c test.c -o test.o gcc -f原创 2021-07-25 15:36:21 · 1059 阅读 · 0 评论 -
linux进阶32——静态函数库
1. 静态函数库与动态函数库静态函数库:库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾;动态函数库:库程序是在运行目标程序时(中)加载的,库文件通常以.so结尾;2. 存放位置linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中采用*.so.*方式命名的是动态链接库,以*.a方式命名的是静态函数库。如图所示:[root@192 lib]# ls /usr/libaudit gcc libanl-2.17.so原创 2021-07-18 15:20:23 · 802 阅读 · 0 评论 -
linux进阶31——一个死锁的练习
代码如下:#include <iostream>#include <thread>#include <mutex>using namespace std;std::mutex mtx;void testDeadLock(){ mtx.lock(); cout<<"test deadlock"<<endl; mtx.unlock();}void PrintLock(int n, char c){ mtx.lock原创 2021-07-05 20:34:58 · 321 阅读 · 0 评论 -
linux进阶30——守护进程
1. 概念1.1 引入在现实生活中, 许多大型的软件或服务器必须保证7*24小时(一周7天,一天24小时)无障碍的运行,例如淘宝网、百度搜索引擎、支付宝等等,那么像这样一种要一直运行的程序怎么实现呢?究其本质其实就是我们的守护进程。1.2 定义守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,W..转载 2021-06-30 20:35:57 · 754 阅读 · 0 评论 -
linux进阶29——进程与线程(二):多线程概述
1. 并行编程原创 2021-06-09 22:20:15 · 201 阅读 · 0 评论 -
linux进阶28——进程与线程(一): 概念
1. 概念原创 2021-06-07 20:48:22 · 180 阅读 · 1 评论 -
linux进阶27——递归锁和非递归锁
1. 概念递归锁:在同一个线程可以多次获取同一个锁,不会产生死锁;非递归锁:在同一个线程中,加锁后不可以再次获取该锁,如果获取可能产生死锁;2. 应用;linux下的互斥量pthread_mutex_t是非递归锁,但是可以通过在创建互斥量时设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t设置为递归锁。读写锁是非递归锁。尽量不要使用递归锁,即同一个线程中,尽量不要重复锁定同一个锁,读锁也不可以。另外加锁最好避免互相嵌套,否则也容易死锁。...转载 2021-06-21 22:06:25 · 1172 阅读 · 0 评论 -
linux进阶26——区域锁
1. 概念区域锁(Scoped locking)不是一种锁的类型,而是一种锁的使用模式(pattern)。这个名词是Douglas C. Schmidt于1998年在其论文Scoped Locking提出,并在ACE框架里面使用。但作为一种设计思想,这种锁模式应该在更早之前就被业界广泛使用了。区域锁实际上是RAII模式在锁上面的具体应用。RAII(Resource Acquisition Is Initialization)翻译成中文叫“资源获取即初始化”,最早是由C++的发明者Bjarne St.转载 2021-06-21 21:20:17 · 369 阅读 · 0 评论 -
linux进阶25——调试coredump的两种方法
1.dmesg+addr2line调试原创 2021-06-20 22:54:32 · 1018 阅读 · 0 评论 -
linux进阶25——tcpdump详解
1. 应用场景原创 2021-06-16 22:02:51 · 2137 阅读 · 0 评论 -
linux进阶24——GDB(十):gdb调试死锁
2个线程,加锁后轮流输出数据,其中1个线程,误将pthread_mutex_unlock(),写成pthread_mutex_lock()代码如下:转载 2021-06-04 22:01:40 · 1421 阅读 · 0 评论 -
linux进阶23——GDB(九):gdb调试coredump
1. coredump转载 2021-06-02 20:56:12 · 4635 阅读 · 0 评论 -
linux进阶22——GDB(八):调试coredump文件时函数名显示为问号的解决方案
问题现象:[root@localhost day7]# lscore.test1.2051 core.test1.2066 test1 test1.cpp[root@localhost day7]# gdb core.test1.2066 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL原创 2021-06-01 22:59:39 · 3360 阅读 · 2 评论 -
linux进阶21——GDB(七):禁用和删除断点
一段c语言程序:#include <stdio.h>int main(){ int num = 0; scanf("%d", &num); printf("%d", num); return 0;}1. 查看转载 2021-05-31 20:25:13 · 4692 阅读 · 0 评论 -
linux进阶20——GDB(六):查看变量命令(print和display)
一段c语言程序:#include <stdio.h>int main(){ int num,result=0,i=0; scanf("%d", &num); while(i<=num){ result += i; i++; } printf("result=%d\n", result); return 0;}1. p转载 2021-05-31 19:35:00 · 4205 阅读 · 0 评论