自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux下反编译apk(apktool)

如果想要试着写一个淘宝或者网易云音乐,我们会需要它里面的一些小图标,这些图标在网山很难搜到,而且它们的布局文件网上也是没有的,下面就介绍如何在linux下使用apktool反编译安装包apk得到其中的小图表和布局文件。解压后将文件夹重命名为apktool,文件夹中有两个文件,一个是aapt,一个是apktool,两个都是可执行文件。即完成了apktool的下载和部署,下面就可以进入到包含apk的目录下,使用apktool反编译了。第三步,将apktool目录下的三个文件都拷贝到bin目录下。

2024-06-12 18:18:12 344

原创 python之字符串的API

还有一种查找的方式就是通过index()和rindex,index是从左往右的第一次出现的位置,rindex是从右往左第一次出现的位置,但是如果查找一个不存在子串就会报错。查找是一个很常用的接口,分为从前往后查找和从后往前查找,就是find()和rfind(),都会饭hi要查找得到字符串第一次出现的位置,如果没找到那么返回-1。lstrip()去除左边的空格,rstrip()去除右边的空格,strip()去除两边的空格。这个就是简单的统计 字串出现的次数,一般会应用在让你统计一篇文章的关键词之类的。

2024-01-27 21:14:11 867 1

原创 python之字符串的简单操作

其实这里有一个优化的小细节,就是这个计算字符串的函数len(),在这个循环中,每循环一次,字符串的长度就要计算一次,这样很浪费资源,如果字符串的长度很大,就会暴露出这个问题,因此我们可以修改成 先计算字符串的长度,在进入循环。零就是字符串的起始位,这里就对应着 ‘你’,字符串的下表是从零开始的,当 [ ] 里面的值超过字符串长度减一时,会报错下表越界,因为这个字符串的长度是你已经指定好的。从-1开始取,取到最后,但是步长也是-1,就能直接反着取了,实现逆序,这个-1其实也可以省略。

2024-01-26 22:08:23 895 1

原创 Linux之互斥锁、死锁、读写锁、条件变量、生产者消费者模型

在任何平台下,都会牵扯到锁这一概念,其实在任何平台下的锁都是差不多的。这里的互斥锁,线程A和线程B访问共享资源,要先获得锁,如果锁被占用,则加锁不成功需要等待对方释放锁,若锁没有被占用,则获得锁成功加锁,然后操作共享资源,操作完成后,必须解锁,同理B也是和A一样。也就是说不能有两个进程访问共享资源。条件变量本身不是锁,但是也可以造成线程阻塞;通常配合互斥锁一起使用。使用条件变量可以使线程阻塞,等待某个条件的发生,当满足条件时,解除阻塞。

2024-01-07 21:14:27 924 1

原创 Linux之守护进程和线程初步(守护进程的介绍和创建;线程的创建,设置线程分离....pthread)

守护进程也叫精灵(deamon)进程,是Linux后台服务进程,通常独立于控制终端并且周期性的执行某些任务或者等待处理某些发生的事件。守护进程具有以下特点:它是后台服务进程,独立于控制终端,周期性的执行某种任务,不受用户登录和注销的影响。

2023-11-20 00:42:02 164 1

原创 Linux之信号(signal kill alarm raise abort settimer sigaction SIGCHLD回收子进程)

signal函数的原型如上,其第一个参数是要注册的信号的值,一般都传入相应的宏,第二个参数是一个回调函数,也就是自己写的处理信号的函数。下面看一个关于signal函数的简单例子。

2023-11-04 00:29:00 94 1

原创 Linux之进程间通信IPC(pipe fifo mmap)

Linux环境下,各进程地址空间相互独立,任何一个进程内的变量在另一个进程中都是不可见的,所以进程之间是不能访问的,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2在从中读走,这个就叫做进程通信,简称IPC。

2023-10-19 01:16:30 63 1

原创 Linux之进程的创建与回收(fork,wait/waitpid exec函数家族)

产后这个问题的原因是我们没有设置阻塞,父进程不会阻塞等待子进程,这个逻辑只会执行一次,子进程很可能没有被回收,因此要想子进被回收就需要一个循环反复执行这个逻辑,直到wpid的值为-1即表示所有的进程被全部回收,方可退出。既然有父进程先执行完就一定有子进程先执行完的情况,子进程先执行完,父进程没有完成对子进程的回收,因此子进程就成为了一个僵尸进程,注意僵尸进程是一个已经执行完的进程,不能再使用kill命令将其杀死,但是可以通过kill命令杀死它的父进程,让这个子进程被init进程领养,最后完成子进程的回收。

2023-10-11 01:52:25 178

原创 Linux之文件和目录相关函数介绍(open close read write lseek stat/lstat opendir readdir closedir dup/dup2/fcntl )

open和close函数就是用来打开和关闭文件的,open函数打开文件会返回相应的文件描述符,这两个函数要放在一起使用,open函数可以带第二个参数通过命令 man 2 open 可以查看open函数的信息如上,open函数一共有三种用法,只要知道它第一个参数传入的是文件路径,那个flags就是对文件的操作(只读,追加等等),mode_t mode表示它的权限(读写执行权限 分别在属主,文件所属组,文件的其他用户中的体现)

2023-10-02 11:35:14 165 1

原创 Linux 之 makefile

在linux环境下编译文件的时候,我们经常用 gcc xxx.c -o xxx 类似这样去生成可执行文件,当我们遇到要同时编译很多个文件的时候该怎么办呢,总不能一个一个罗列出来吧,这就引出了我们今天的主角 makefile ,makefile就是可以把很多个.c文件放一起编译,只需要将源文件放入一个新编辑的文件中,以后只对那一个文件进行编译即可,每次只要执行一个make命令就能完成所有的编译,能够提高编译的效率。下面就让我们来介绍一下makefile的一些简单规则吧。目标:依赖。

2023-09-24 02:00:57 208 1

原创 C++11多线程(下)

接着上次的的测试函数继续往下看,我们仔细分析一下 isGet这个函数,就可以发现它的unique_lock<>()执行次数非常多,每次进入到 isGet 这个函数就会加锁,这样会拉低程序的运行效率,下面提供两个解决方案:(1)双重锁定(双重检查)上一次我们在写单例类的时候已经说到过这个问题,双重检查会大大减少锁定的次数,提高程序的效率。if (!l1.empty())//双重检查if (!先对 l1 进行判空操作,如果l1是空,则就不会加锁,这样就会大大减少加锁的次数从而提高程序效率。

2023-09-18 18:38:16 130

原创 C++11 多线程(中)

lock()内的两个互斥量,对顺序没有要求。unique_guard()可以取代lock_gaurd(),unique_guard()可能会占用更多的内存,但是unique_guard()的使用会比lock_guard()更灵活,上面我么说到过lock_guard()的第二个参数adopt_lock,当然unique_guard()也支持这个参数,和lock_guard()的作用是一样的,下面我们就来看看unique_guard()的不同的第二个参数。

2023-09-10 19:49:18 164 1

原创 C++11 多线程 (上)

进程是资源分配的基本单位,是程序的一次执行过程,结合实际,比如打开一个QQ,就是启动了一个进程,在vs里面运行一个程序也是一个进程。线程是调度的基本单位,引入线程的目的就是要提高程序运行的效率,一个进程可以包括多个线程,但是一个进程只有一个主线程,打开电脑的任务管理器可以很清楚的看到当前在运行的进程和线程。

2023-09-02 20:21:32 234

原创 C++里的四大强制类型转换(static_cast、dynamic_cast、const_cast和reinterpret_cast)和RTTI

此处会输出转换失败,对于此处有一种说法是:dynamic_cast 会在程序运行过程中遍历继承链,如果途中遇到了要转换的目标类型,那么就能够转换成功,如果直到继承链的顶点(最顶层的基类)还没有遇到要转换的目标类型,那么就转换失败,映射到此处,pa创建的A类对象就是继承链的顶部了,不能再向上遍历继承链,因此转换失败.此处说明一下void*类型的指针是无类型的指针,就是它可以指向任何类型的指针,如果将其他的指针转换成void*类型的指针,在使用的时候要记得转回去,不然会出错。下面举一个转换失败的例子。

2023-08-21 00:54:10 258 1

原创 C++左值,右值,std::move,移动构造函数

在有必要的情况下尽量添加移动构造函数和移动构造赋值运算符,达到减少拷贝构造和赋值运算的目的,当然,一般只有在new分配了大量内存的这种类才需要移动构造函数和移动赋值运算符。不抛出异常的移动构造函数、移动赋值运算符都应该加上关键字noexcept。一个本该调用移动构造函数和移动赋值运算符的地方,如果类中没有提供,系统会调用拷贝构造函数和拷贝赋值运算符代替。

2023-08-13 18:54:48 527 1

原创 判断两个链表是否相交

最后有一个注意事项就是当两个链表一起走判断后面的交点的时候是根据地址判断,不是根据值判断,举例如下。然后就要找到长长链表,让长链表先走,最后两个链表一起走。首先求出两个链表的长度。

2023-08-03 16:39:39 34

空空如也

空空如也

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

TA关注的人

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