自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 收藏
  • 关注

原创 git常用操作

1、拉取远程指定分支,git clone -b 2、切换分支, git checkout

2024-04-02 09:14:58 118

原创 IMEI、IMSI、ICCID是什么?意义和区别?通信模组或手机的唯一识别码

2位,中国移动使用00、02、04、07,中国联通GSM系统使用01、06、09,中国电信CDMA系统使用03、05,电信4G使用11,中国铁通使用20。A:做设备后台管理编号,以上的其实都可以,都是全球唯一ID。(2)如果是双卡设备,可能同个设备会有两个IMEI。第三部分:MSIN,移动订阅用户识别代码(Mobile subscription identification number)。由15位数字组成,全球唯一ID,用来区别每一部移动通信设备。A:IMEI是移动设备识别码,IMSI是移动用户识别码。

2024-01-30 15:09:43 1812

原创 Linux互斥锁pthread_mutex_lock和pthread_mutex_unlock

当一个进程中存在两个及以上的线程时,线程间会互相争夺共享资源,导致单个线程中的执行秩序会被打乱。我们在使用的时候,应该把 *mutex定义为全局变量,这样所有的线程都能使用。参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。参数说明: *mutex 互斥锁的索引(名称),注意这里同样是指针变量。2、销毁互斥锁pthread_mutex_destroy();1. *mutex 互斥量的索引(名称),为指针变量;

2023-12-22 09:09:57 493

原创 Linux管道popen和pclose

函数功能:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。返回值:若成功返回shell的终止状态(也即子进程的终止状态),若出错返回-1,错误原因存于errno中。这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。

2023-12-20 15:45:57 457

原创 linux条件变量pthread_cond_wait和pthread_cond_signal函数

3、当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);本次分析linux中的条件变量,条件变量本身不是锁,但它也可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会合的场所。1.4.pthread_cond_timedwait函数。

2023-12-20 14:37:39 1032

原创 Linux共享内存shmget,shmat,shmdt,shmctl函数

2.key=IPC_PRIVATE 可以不加IPC_CREAT就可以创建IPC对象,这种方式创建的IPC对象只能用于有亲缘关系的进程通信。IPC_EXCL:一般和IPC_CREAT一起使用,表示如果打开的IPC对象已存在,则报错。共享内存是一种最为高效的进程间通讯方式,进程可以直接读写内存,不需要任何数据的复制。IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中。IPC_CREAT:如果共享内存不存在,则创建一个共享内存,否则直接打开已存在的。0 读写。

2023-12-18 17:22:35 446

原创 Linux消息队列 msgget()、msgsend()、msgrcv()、msgctl()

如果它的值大于零,将获取具有相同消息类型的第一个信息。msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。msg_sz 是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。3、消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。

2023-12-18 10:37:41 444

原创 SecureCRT设置log保存路径和格式

SecureCRT设置log保存路径和格式。

2023-12-15 14:40:49 655

原创 linux异步通知与异步I/O

F_SETOWN:一般是使用语句 fcntl(common_fd, F_SETOWN, getpid()),对于某些多进程共用的文件描述符,比如标准输入输出,我们要让操作系统知道这些信号要发往哪个进程。因为每一个进程都有标准输入输出,所以我们需要让操作系统知道当前的标准输入输出属于哪个进程,从而可以对进程发送信号。通过signal(SIGIO, input_handler) 对标准输入文件描述符STDIN_FILENO启动信号机制。

2023-12-14 17:50:02 73

原创 fcntl函数简介和使用

以设置文件描述符为 0 的文件为例,将文件描述符设置为非阻塞状态,需要用到上述表格的第三个功能,获得/设置文件状态标记。非阻塞模式下,read函数如果发现数据尚未就绪,系统是以出错的形式返回的,很显然数据未就绪不算错误,那么要如何区分真正的错误 和 数据未就绪时的出错呢?执行成功时,不同的cmd可能会对应不同的返回值,没有列举在下面的,比如F_SETFL,可能返回值类型为void。fcntl 函数的作用是操作一个文件的文件描述符,而设置成非阻塞IO只是 fcntl 函数的功能之一。

2023-12-14 15:48:03 279

原创 Linux统计网卡流量

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。注意:因为proc是伪文件系统,只存在内存中,所以这里统计的数据的时间起止时间是:系统启动到命令执行,如果此时系统发生重启,数据将会清零。其实,我们平时经常用的很多查看网卡实时流量的命令,都是通过读取该目录下的实时流量,并通过简单计算得到的。errs: 由设备驱动程序检测到的发送或接收错误的总数。

2023-12-14 10:33:44 50

原创 /proc/sys/net/ipv4/ 下网络参数的理解

假如您将此值设为大于1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己的ICMP ECHO请求或那些广播地址的请求。默认值为 60 秒。如果您的系统是负载很大的web服务器,那么也许需要降低该值,这类 sockets 可能会耗费大量的资源。

2023-12-07 09:21:26 629

原创 signal函数简介及使用

signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。信号用作进程间通信,报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。C++中的对应头文件是csignal。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。(4). SIGINT:交互的用户按键请求,如同时按下Ctrl+C键。(1). SIGABRT:程序异常中止,如调用abort函数。(3). SIGILL:非法函数映像,如非法指令。

2023-11-28 17:15:16 125

原创 Linux信号量sem_init,sem_wait,sem_post

线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。pshared控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则信号量就可以在多个进程之间共享,value为sem的初始值。该函数用于以原子操作的方式将信号量的值减1。信号量的函数都以sem_开头,线程中使用的基本信号量函数有4个,它们都声明在头文件semaphore.h中。该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。

2023-11-28 11:32:17 1295

原创 Linux文件操作open、write、read、close、lseek、sync

O_EXCL 如果同时使用O_CREAT而且该文件又已经存在时,则返回错误, 用途:以防止多个进程同时创建同一个文件;O_CREAT 如果文件不存在,则创建该文件,并使用第3个参数设置权限,如果文件存在 ,则只打开文件;例: open(“/dev/hello”, O_RDONLY|O_CREAT|O_EXCL, 0777)成功:返回新的文件描述符(返回的文件描述符是该进程未打开的最小的文件描述符);S_IRUSR | S_IWUSR 文件的所有者对该文件可读可写。

2023-09-21 08:55:07 92

原创 time、gmtime和localtime,时间、格林威治和本地时间

localtime是将时区考虑在内了,转出的当前时区的时间。但是注意,有些嵌入式设备上被裁减过的系统,时区没有被设置好,导致二者转出来的时间都是0时区的。3、同类型的函数还有localtime():得到本地时间,该函数同gmtime函数唯一区别是,在转换小时数不需要加上8了。通过此函数gmtime()是0时区,把UTC时间转换成北京时间的话,需要在年数上加1900,月份上加1,小时数加上8。1、首先从time()函数,返回一个从1970年1月1日 00:00:00到现在的秒数。

2023-09-08 14:32:12 648

原创 C语言内存管理 malloc、free、calloc、realloc、memcpy、memmove、memset、memcmp

如果原空间后没有足够的空间,则在堆区另找一块大小合适的空间,释放原来的内存空间,返回一个新的内存地址。C语言提供了一个动态内存开辟的函数,该函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。该函数为num个大小为size的元素开辟一块空间,并把每个元素初始化为0;如果ptr指向的空间不是动态开辟的,则free函数的行为是标准未定义的;如果在调整内存空间时,原空间后有足够的空间,就在原空间后直接追加;如果开辟成功,则返回一个指向开辟好的空间的指针;size为调整后的新大小;

2023-08-31 15:04:08 130

原创 c语言文件操作 fopen、fwrite、fread、fclose、fgets、fputs

5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。如果成功的打开一个文件, fopen()函数返回文件指针, 否则返回空指针。3. 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。4. 若要向一个文件追加新的信息,用“a ”方式打开文件。2. 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。

2023-08-31 10:49:44 117

原创 C语言字符串函数scanf、printf、gets、puts、strlen、strcpy、strtok、strcat、atoi、atof、strtol、strcmp、strstr、strerror

最近在重温C语言的一些基础知识,感觉C语言字符串操作还是比较难的,在学习的过程中总结了一些常用的字符串相关函数,包括C语言字符串输入、字符串输入、计算字符串长度、字符串赋值、字符串分割、字符串拼接、字符串与整型的转换等。输入字符串时,遇到回车或空格,输入结束,并且自动在串后面加上结束标志’\0’;输出字符串时,遇到字符串结束标志’\0’,输出结束。说明:二维字符数组,用于同时存储和处理多个字符串。说明:一维字符数组,用于存储和处理一个字符串。(1)scanf()和printf()1.字符串输入与输出。

2023-07-24 11:43:09 114

原创 OpenSSL RSA签名和校验

【代码】OpenSSL RSA签名和校验。

2023-07-19 10:31:47 444

原创 OpenSSL AES对称加密

EVP_CipherInit_ex()、EVP_CipherUpdate() 和 EVP_CipherFinal_ex() 是可用于解密或加密的函数。EVP_DecryptInit_ex()、EVP_DecryptUpdate()和EVP_DecryptFinal_ex()是对应的解密操作。对称加密也被称为共享密钥加密,是一种将相同密钥用于加密和解密的加密方式。在对称加密中,加密和解密使用的是相同的密钥,因此需要确保密钥的安全性。接收方使用相同的密钥对加密后的数据进行解密。适合用于大量数据的加密。

2023-07-13 09:51:06 1400

原创 python排序算法

【代码】python排序算法。

2023-06-21 17:43:28 96

原创 ubuntu16.04安裝python3.7.1

makePATH=PATH。

2023-06-09 13:08:23 271

原创 linux查看某个进程内存占用情况以及/proc/pid/status解释

State: S (sleeping) /进程的状态信息,具体参见http://blog.chinaunix.net/u2/73528/showart_1106510.html/VmRSS: 4212 kB /应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)/VmData: 463672 kB /程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据/SigQ: 19/1111 /待处理信号的个数/目前最大可以处理的信号的个数/

2023-06-08 09:09:37 1191

原创 CMake设置路径

DESTINATION后面的路径可以自行制定,根目录默认为CMAKE_INSTALL_PREFIX,可以试用set方法进行指定,如果使用默认值的话,Unix系统的默认值为 /usr/local, Windows的默认值为 c:/Program Files/${PROJECT_NAME}。比如字linux系统下若LIBRARY的安装路径指定为lib,即为/usr/local/lib。5.设置了Debug版本和Release版本下可执行文件的后缀名。4.设置Debug版本和Release版本下库文件的后缀名。

2023-06-07 17:14:53 6650

原创 socket编程

协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。若无错误发生,则connect()返回0。第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

2023-05-25 11:25:41 97

原创 AT命令xx

AT+QGPS= 1 开启GPS功能,激活NMEA端口开始上报GPS NMEA数据,也可通过AT指令端口获取NMEA GPS数据。AT+QGPSCFG = 对GPS参数进行配置,此步骤不进行亦可使用(采用默认参数)。AT+CGSN 获得模块的IMEI(国际移动设备标识)序列号。AT+QENG=“servingcell” 获取小区信息。AT+CGMI 获得模块厂商标识。AT+QCCID 获得模块的QCCID。AT+CGMR 获得模块的软件版本。AT+CGMM 获得模块标识。

2023-05-22 10:28:10 1308

原创 Linux常用命令

压缩后缀名为可以为tar.gz。

2023-05-09 18:52:36 55

原创 makefile编译脚本,理解$@、$^和$<

工作作用,将头文件放在include文件夹,cpp文件放在source文件夹,test.cc为可执行文件。打印用info,Makefile提供了三个命令。表示比目标还要新的依赖文件列表。三、Makefile中打印日志信息。Makefile中,格式为这样的。$^ 表示所有的依赖文件。$< 表示第一个依赖文件。Makefile文件为。目标:需要依赖的条件。

2023-05-09 16:54:40 1356

原创 makefile编译脚本

3、通过.o中间文件,同时编译两个文件。2、同时编译2个文件。

2023-05-07 12:49:22 156

原创 pthread多线程

pthread是linux下C语言执行多线程操作的基础,操作多线程的操作全部在pthread.h头文件中,因此想要创建一个线程并且操作线程的话,就需要引入头文件,跟线程密切相关的操作包括创建、退出以及主线程的等待(主线程一般是指main函数)该方法类似于fork中的wait,但不同的是,该方法面向的对象是线程而非进行,主线程会一直挂起,直到关注的子线程返回。参数attr用来设置线程的属性,一般我们设置为NULL,即采用系统的默认设置。函数的第一个参数返回的是一个线程的指针,该指针唯一的标识创建的线程。

2023-05-06 10:07:25 816

原创 leetcode217. 存在重复元素

给你一个整数数组 nums。如果任一值在数组中出现 至少两次 ,返回 true;如果数组中每个元素互不相同,返回 false。1、利用hashmap统计数组中每个元素的出现次数,若出现次数大于1,直接返回true,否则返回false。输入:nums = [1,1,1,3,3,4,3,2,4,2]输入:nums = [1,2,3,1]输入:nums = [1,2,3,4]

2023-05-04 14:43:53 38

原创 leetcode148. 排序链表

3、新建一个cur2链表节点,指向给定链表的头结点,用于将排序后的数组重新倒入链表;给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。1、新建一个cur链表节点,指向给定链表的头结点,用于将链表元素放入数组;输入:head = [-1,5,3,4,0]输入:head = [4,2,1,3]输出:[-1,0,3,4,5]4、最后返回head即可。输出:[1,2,3,4]输入:head = []

2023-05-04 11:37:07 46

原创 leetcode217. 存在重复元素

给你一个整数数组 nums。如果任一值在数组中出现 至少两次 ,返回 true;如果数组中每个元素互不相同,返回 false。输入:nums = [1,1,1,3,3,4,3,2,4,2]1、遍历数组,通过hashmap统计每个元素出现次数。2、如果出现过,返回true,没出现过放入map。3、遍历完数组没有出现过,则返回false。输入:nums = [1,2,3,1]输入:nums = [1,2,3,4]

2023-04-23 16:03:23 70

原创 leetcode414. 第三大的数

此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1。给你一个非空数组,返回此数组中 第三大的数。如果不存在,则返回数组中最大的数。解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。解释:第三大的数不存在, 所以返回最大的数 2。输入:[2, 2, 3, 1]解释:第三大的数是 1。输入:[3, 2, 1]利用set去重,升序。

2023-04-23 14:33:54 56

原创 leetcode34. 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。输入:nums = [5,7,7,8,8,10], target = 8。输入:nums = [5,7,7,8,8,10], target = 6。如果数组中不存在目标值 target,返回 [-1, -1]。3、upper_bound找到最后一个出现位置的下一个。输入:nums = [], target = 0。4、元素不存在直接返回{-1,-1}输出:[-1,-1]输出:[-1,-1]

2023-04-21 16:22:31 323

原创 leetcode35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。请必须使用时间复杂度为 O(log n) 的算法。

2023-04-21 15:09:54 67

原创 leetcode704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。2、二分查找、使用stl的lower_bound。解释: 9 出现在 nums 中并且下标为 4。解释: 2 不存在 nums 中因此返回 -1。

2023-04-21 14:47:53 54

原创 leetcode74. 搜索二维矩阵

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。4、对每一行二分查找 使用stl的binary_search。3、对每一行二分查找 使用stl的lower_bound。每行的第一个整数大于前一行的最后一个整数。

2023-04-21 12:22:42 62

原创 leetcode207. 课程表

先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。输入:numCourses = 2, prerequisites = [[1,0],[0,1]]例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。学习课程 1 之前,你需要完成课程 0。

2023-04-20 17:06:12 369

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除