杂谈
文章平均质量分 54
樱满无门
这个作者很懒,什么都没留下…
展开
-
diff命令实现
diff命令实现diff是类UNIX系统下的一个重要的系统工具,用于比较两个文本文件的差异。它有三种输出格式先给大家看看两个用于比对的文件原文file1:aebaghbggfile2:bcdgegjh格式一,普通格式:$ diff file1 file21,6d0< a< e< b< a< g< h7a2,3> c> d8a5> e9a7,8> j> h格式原创 2021-09-20 21:43:24 · 1254 阅读 · 0 评论 -
【汇编】正确使用IDIV指令
【汇编】正确使用IDIV指令div为无符号除法,idiv为有符号除法idiv进行的是128 / 64位除法,即被除数为128位、除数为64位。64位操作系统中寄存器大小当然只有64位,因此,idiv使用rdx:rax作为被除数即rdx中的值作为高64位、rax中的值作为低64位因此,在使用idiv进行计算时,rdx中不得为随机值,否则会发生浮点异常。可以在使用idiv前做如下处理:以10/2为例使用A&T汇编进行展示方法一:将rdx置为0movq $10, %r原创 2021-08-31 11:37:45 · 10383 阅读 · 0 评论 -
Ubuntu下管理Java版本
Ubuntu下管理Java版本有些时候需要在Java各个版本之间进行切换有一个叫jEvn的程序可以做到这一点,但是不论是apt还是snap都无法找到这个程序,官网又打不开另一个可以替代的方法是,在Ubuntu下,使用update-alternatives --config java命令进行java版本的切换...原创 2021-07-01 08:54:52 · 362 阅读 · 0 评论 -
达夫设备——swtich、while的结合
达夫设备达夫设备是switch语句和while语句结合在一起的一种很精妙的应用,它的主要作用是避开了大量的条件检验,减少了CPU的分支预测带来的性能损耗,主要用在复制大量的数据上虽然在编译技术和CPU技术高速发展的现在,达夫设备的作用已经微乎其微了,但是它仍然给我们提供了一些很好的思路首先,要移动一定数量的数据,最容易想到、也是最简单的方法是:while (n--) { *to++ = *from++;}这段代码中,条件检验的数量和进行数据复制的次数是一样的,都是n次这么做的缺点是,大量的原创 2021-06-29 01:35:46 · 326 阅读 · 0 评论 -
Latex使用中文
Latex使用中文使用CJKsudo apt install cjk-latexsudo apt install texlive-xetex使用xetex进行编译编译的时候记得设置字体%! Tex program = xelatex\documentclass{article}\usepackage{xeCJK}\setCJKmainfont{Microsoft YaHei}\begin{document} 中文 \LaTeX 示例。\end{document}其他方式原创 2021-06-14 16:00:56 · 181 阅读 · 0 评论 -
C语言使用GNU扩展实现简单智能指针
C语言使用GNU扩展实现智能指针GNU/C有一个__attribute__扩展叫cleanup:https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Variable-Attributes.html#Variable-Attributes它的作用是:当某个变量出了它的作用域的时候,自动执行绑定的某个函数这个出作用域,可以是跑出大括号,也可以是其他行为它可以有很多用途,取决于程序员的想象力,但是最直白的、最容易想到的,还是实现一个像C++里一样的智能指针这里有一原创 2021-06-08 10:18:13 · 392 阅读 · 0 评论 -
libc_hidden_def、libc_hidden_weak、libc_hidden_proto
libc_hidden_def、libc_hidden_weak、libc_hidden_proto在阅读glibc源码的时候,遇见了几个没见过的宏,几乎所有的函数都会使用这几个宏:libc_hidden_def、libc_hidden_weak、libc_hidden_proto因为我比较好奇,所以特地去找了一下有关这些宏的定义(主要也是想多学一点)Linux下学习源码,最方便的地方就是它的各种命令使用find ./ | grep -r "define libc_hidden_def",发现在in原创 2021-06-07 03:49:09 · 2031 阅读 · 0 评论 -
mtrace的使用
mtrace的使用mtrace是Linux下自带的内存泄露检测工具使用方法:在代码中包含#include <mcheck.h>头文件在开始检测的地方写上mtrace()在检测结束的地方协商muntrace()在GCC编译的时候加上-no-pie参数和-g参数在环境变量中设置MALLOC_TRACE,例如export MALLOC_TRACE=./mtrace.log运行程序,程序运行结束后,会生成一个log文件使用mtrace ./a.out ./log查看为什么使用-原创 2021-06-06 22:09:50 · 478 阅读 · 0 评论 -
strong_alias、weak_alias
strong_alias、weak_alias在阅读glibc源码的时候,遇见了几个没见过的宏因为我比较好奇,所以特地去找了一下有关这些宏的定义(主要也是想多学一点)在include/libc-symbols.h中,有我想要了解的两个宏:strong_alias、weak_aliasd的定义#ifndef __ASSEMBLER__/* GCC understands weak symbols and aliases; use its interface where possible, in原创 2021-06-03 21:31:55 · 1405 阅读 · 2 评论 -
动态链接库、GOT、PLT
动态链接库什么是动态链接库以下均为本人自己的理解,不一定正确,但是大致应当是差不多的在很久之前,没有库的概念,每一次写代码都是在从头造轮子后来,人们发现某一些功能是大部分程序里面都要用到的、共通的,且和具体程序没有该关系,例如向控制台打印一个字符等。于是,为了减少写代码的成本,人们把这些实现共通功能的代码汇聚起来,每一次需要使用的时候就用include或者import之类的方法去引用它。再后来,这类代码的量越来越大。这导致了两个问题:1,每一次编译的消耗越来越多;2,实际上并不会用到所有的代码,多原创 2021-06-03 10:36:38 · 559 阅读 · 0 评论 -
进程间通信——管道
进程间通信——管道最早的UNIX IPC方式使用是最简单的,局限也是最大的管道是半双工的两端进程必须是父子关系或者有共同祖先使用方式:一个进程使用系统调用pipe(int fd[2])创建管道,fd[0]为读端、fd[1]为管道的写端接下来,调用fork调用创建一个新的子进程。父子进程共享文件描述符,因此,fd也可以被子进程使用。这种使用会带来问题:同时进行读写,最终谁读到数据由进程调度决定。因此,为了达到数据通信的目的,在子进程写的时候,关闭父进程的写描述符、关闭子进程的读描述符,形成原创 2021-05-29 10:05:12 · 89 阅读 · 0 评论 -
Rust初体验
Rust初体验最近听闻Linux内核要加入Rust的支持,而且据说Rust这门语言既可以用于系统级别的开发又有现代高级语言的特质,并且没有C++那么臃肿,还可以实现内存安全,神乎其神的,所以特地安装了一个Rust学了一下在Rust官网可以获取全套教程,包括安装等在这篇文章里可以得到关于Rust的一些特性的介绍下面主要介绍我对Rust的感受和体会首先,印象深刻的是它的包管理工具Cargo,用起来很方便,美中不足是按tab键不知道为什么不能自动补全cargo的功能很丰富,可以使用cargo new创原创 2021-05-23 13:39:48 · 209 阅读 · 1 评论 -
C语言多线程运行时间计算
C语言多线程运行时间计算单线程下的运行时间可以使用clock()进行计算clock()计算的是the CPU time used so far,即占用的CPU时间而多线程和单线程不同的是,多线程会占用更多的CPU时间(多个线程同时运行),因此,多线程下使用clock()会造成结果过大使用clock_gettime来获取多线程下每个线程的运行时间int clock_gettime(clockid_t clk_id, struct timespec *tp);第一个参数要输入一个宏,一般使用的有:原创 2021-05-22 11:23:35 · 2754 阅读 · 0 评论 -
Linux下Vmware网卡vmnet丢失问题
Linux下Vmware网卡vmnet丢失问题发现网上的资源都是描述windows下的解决方案,并没有描述在Linux下安装虚拟机网卡的方法,因此进行分享解决方式:先输入ifconfig查看网卡信息,发现vmnet丢失使用sudo vmware-netcfg进行设置,添加对应的网卡,例如点击save后,再次使用ifconfig进行查看,发现网卡已经被添加完毕...原创 2021-05-20 18:29:59 · 324 阅读 · 0 评论 -
Linux下C语言获取网卡信息(IPv4)
Linux下C语言获取网卡信息(IPv4)getifaddrs、freeifaddrsioctlgetifaddrs、freeifaddrsgetifaddr ==> get interface address它将创建一个描述本地网络接口的链表#include <sys/types.h>#include <ifaddrs.h>int getifaddrs(struct ifaddrs **ifap);The getifaddrs() function c原创 2021-05-13 17:49:52 · 1599 阅读 · 0 评论 -
POSIX下简单线程池的实现
POSIX下简单线程池的实现什么是线程池?为什么要有线程池?进程是资源分配的基本单位线程是能独立运行的基本单位一个进程内的线程共享资源因此,线程的创建开销小于进程——不需要执行进程复制、分配页表等操作线程的同步开销小于进程——不需要进程间通信,因为线程之间能共享资源在客户机-服务器模型中,每当添加一个新的连接时,就需要创建一个新的线程进行响应。当连接结束后,需要释放当前的线程。线程的开销虽然小,但是并不是意味着没有开销并且,更加严重的问题是,如果同时有大量连接产生,那么,分配的线程的数量很原创 2021-05-07 16:41:32 · 222 阅读 · 2 评论 -
Linux下简单Shell的实现
Linux下简单Shell的实现参考自《操作系统概念》第七版第三章进程下的项目UNIX Shell和历史特点首先梳理一下Shell的工作原理Shell进程读入用户命令行的输入,然后建立一个子进程来完成这个命令,等待,当子进程完成后,父进程继续读入用户新的命令使用fork()命令新建一个子进程后,该子进程将会是父进程的复制品——唯一区别在于fork()的返回参数不同,fork是唯一一个调用一次返回两次的函数,对于父进程,它返回子进程的PID号,对子进程,它返回0要让子进程执行对应的程序,应当使用e原创 2021-05-06 19:11:46 · 1440 阅读 · 0 评论 -
Ubuntu 从源码安装Qt5
Ubuntu 从源码安装Qt5总览:下载源码、解压安装依赖使用CMake构建Makefilemake下载源码、解压Qt下载站:https://download.qt.io/Qt 5.12下载链接:https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xzQt 5.12 是一个LTS版本为什么不使用Qt6?因为在下一步安装依赖的时候,会产生问题下载结束后,打开到压缩包所在目原创 2021-05-02 11:47:54 · 862 阅读 · 0 评论 -
Linux下监听53号端口捕获DNS查询报文
Linux下监听53号端口捕获DNS查询报文计算机网络课设要求写一个能正常工作的DNS resolver,这就要求写出来的解析器能监听应用程序发出的查询报文。即当应用程序需要查询某个网址对应的IP地址时,它会先往DNS resolver发送一条查询报文。这个解析器会解析这条报文,然后先在本地高速缓存中寻找有无对应的IP地址,若没有则去其他它知道的DNS服务器进行查找。获取结果后,将报文返回。在这其中,53号端口就是解析器和服务器监听的端口。使用sudo netstat -aptn | grep 53原创 2021-04-23 18:03:27 · 2358 阅读 · 0 评论 -
Linux下使用Lindent脚本格式化C语言代码
Linux下使用Lindent脚本格式化C语言代码Linux内核源码中,scripts目录下有一个脚本Lindent,可以用来格式化内核风格的C语言源代码使用locate Lindent可以找到它的位置内容如下:#!/bin/sh# SPDX-License-Identifier: GPL-2.0PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"RES=`indent --version | cut -d' ' -f3`if [ "$RE原创 2021-04-23 13:00:46 · 652 阅读 · 0 评论 -
在Ubuntu下安装中文man pages
在Ubuntu下安装中文man pagesUbuntu下apt提供以下的manpages安装:manpages manpages-fr-extra manpages-posixmanpages-de manpages-hu manpages-posix-devmanpages-de-dev manpages-it manpages-ptmanpages-dev manpages-ja m原创 2021-04-21 11:35:38 · 1003 阅读 · 0 评论 -
CRC冗余校验码及查表法
CRC冗余校验码及查表法什么是CRC编码它将一个长度为k的位串看作是系数是0或者1的k-1次多项式使用一个长度为r+1的生成多项式进行模2计算,生成一个长度为r的字符序列,能检测长度小于等于r的所有突发错误,当突发错误长度为r+1时,只有其刚刚好等于生成多项式,才检测不出来。多项式的最高位、最低位系数必须为1(我不知道为什么)计算方法:(此处使用的减法是模2减法,不进位不借位,相当于XOR运算)例如:使用G(x)=11001检测位串1011011010110110000011001----原创 2021-04-17 12:43:30 · 1093 阅读 · 0 评论 -
Fork杂谈——printf
Fork杂谈——printf在一本书上看到这样子的两段代码:int main(){ printf("Hello, world!\n"); fork(); return 0;}int main(){ printf("Hello, world!"); fork(); return 0;}它们的运行结果分别是Hello, world!和Hello, world!Hello, world!出现这种情况的原因在于,printf函数的缓冲区是行刷新的(原谅我不知道那个术语是什么),就是原创 2021-04-14 08:05:52 · 243 阅读 · 1 评论 -
杂谈——继承的研究(一)
继承的研究(一)我已经学到的继承是这么回事:派生类拥有父类的所有变量和方法因为还没有看C++深入理解对象模型或者之类的这种书,我也不想直接查资料,因此准备自己写几行代码进行实验现在我有这几个疑问当父类与子类变量同名的时候,怎么进行区分当父类与子类函数同名的时候,怎么进行处理当父类与子类函数和变量同名的时候,怎么进行处理父类与子类变量同名父类与子类变量同名也分成这几种情况,我将一一进行探讨父类public变量与子类public变量同名父类private变量与子类private变原创 2021-03-10 15:51:09 · 89 阅读 · 0 评论 -
杂谈——对C++对象的研究
杂谈——对C++对象的研究先看这么一段代码#include <iostream>using namespace std;static int times = 0;class Test{ public: Test(): id(times ++) { cout << "create " << id << endl; } ~Test() { cout << "destroy " <<原创 2021-03-09 13:41:13 · 88 阅读 · 0 评论 -
使用Git进行团队协作
使用Git进行团队协作使用Git从Remote拉取代码有这几种形式:HTTPSSHZIP下载其中HTTP方式拉取的代码在每次上传的时候都需要输入帐号密码,并不好使用SSH方式拉取的代码不需要输入帐号密码,很好如何获取SSH密钥?参考链接打开~/.ssh进行查看~/.ssh$ lsknown_hosts known_hosts.old使用ssh-keygen -t rsa命令会有这几个提示:Enter file in which to save the key (/home原创 2021-03-04 20:53:18 · 289 阅读 · 2 评论 -
Makefile进阶使用
Makefile进阶使用Makefile有一本手册,按道理来说我应该看手册学习,但是我懒,而且我觉得有那个时间学那么多肯定会忘记的东西还不如玩点游戏来得实在以这一个Makefile为例,以后我写的Makefile都以这个为模板#!MakefileC_SOURCES = $(shell find . -name "*.c")C_OBJECTS = $(patsubst %.c, %.o, $(C_SOURCES))S_SOURCES = $(shell find . -name "*.s")S原创 2021-01-24 02:21:45 · 203 阅读 · 0 评论 -
getopt源码寻找尝试
getopt源码寻找尝试getopt函数的作用是简单的参数分析,例如gcc -o main main.c其中,-o称之为option,main称之为optstring,main.c称之为parameterC语言在头文件unistd.h中定义了getopt函数unistd.h是C语言中提供对POSIX操作系统API访问功能的头文件的名称。使用$ vim /usr/include/unistd.h对其进行访问其中有这么一句话:#ifdef __USE_POSIX2/* Get def原创 2021-01-14 12:12:09 · 932 阅读 · 0 评论 -
正则表达式_排除特定字符/字符串
正则表达式_排除特定字符/字符串使用场景:使用git add -A指令提交一个文件夹中所有的代码文件,忽略所有的可执行文件。抽象化匹配一些字符串,找出其中不含后缀,即.的字符串理解排除特定字符.结果:^(?!\.).*?$意义:排除字符.扩展排除任意字符串:^(?!字符串).*?$参考资料:正则表达式使用规则参考博文...原创 2020-12-25 12:04:43 · 10443 阅读 · 0 评论 -
Ubuntu下将rm命令替换为trash命令
Ubuntu下将rm命令替换为trash命令rm命令是一个很可怕的命令,因为它不会给你后悔的机会,删了就是删了,再也找不回来了(据说能在lost+found里面恢复,但是操作难度好像很大,反正新手是不适合使用的)。如果删的是个人文件还好,起码损失不大。如果以后到了公司不小心把重要文件删除了,那就没了。如果一个不小心把系统的重要配置删除了又不知道怎么恢复,那就惨了,只好重装系统了。重装系统意味着以前配置的所有环境、做的所有桌面美化全部付之一炬。为了更加安全地使用rm命令,有必要做一些改善。通过locat原创 2020-12-23 11:11:27 · 1074 阅读 · 1 评论 -
Ubuntu 20.04 设置 动态壁纸
Ubuntu 20.04动态壁纸默认你已经下好gnome的主题编辑器tweaks了。如果没有下载,使用sudo apt install gnome-tweaks进行下载打开/usr/share/backgrounds/contest/,有一个focal.xml,里面存放的就是动态壁纸的信息。将这个xml文件复制一份,然后进行编辑,例如<background> <starttime> <year>2020</year> <原创 2020-12-23 02:44:55 · 3893 阅读 · 0 评论 -
ubuntu下firefox使用HTML 5播放器看B站
ubuntu下FireFox使用HTML 5播放器看B站firefox使用flash是真的难顶,一直闪白。发现bilibili其实可以使用html 5播放器。使用sudo apt install ubuntu-restricted-extras然后重启浏览器就行了,不用再花时间下载flash了而且flash是不是马上就不被支持了?果然还是firefox好用。...原创 2020-12-23 02:36:30 · 14328 阅读 · 1 评论 -
Ubuntu 20.04使用Firefox缺少Flash的解决方案
Firefox使用Flash的解决方案在做作业的时候想听B站直播,但是新装的Firefox并没有flash,只好手动进行安装。经过测试,无法使用flash官网下载的压缩包,原因不详。可能是因为我参考的博客都是好几年前的了。现在再使用下载压缩包->解压->放置到火狐目录下的方法,要么检测不到,要么报错。我的系统:$ uname -aLinux yingmanwumen 5.4.0-58-generic #64-Ubuntu SMP Wed Dec 9 08:16:25 UTC 2020原创 2020-12-21 00:23:23 · 1054 阅读 · 0 评论 -
github误将密码上传解决方案
github误将密码上传解决方案今天发现一不小心把学号和密码上传到了github。虽然说是0 folk和0 star,但是毕竟是敏感信息,万一我还没毕业前发达了怎么办。参考了一些博客的解决方案,发现CSDN大多数都是复制粘贴的解决方案。根本没用。失败的做法最开始的时候尝试直接更改之后提交,就是在本地修改源文件,然后git add -A、git commit、git push但是我一个好朋友发现了在github提交记录里面仍然可以看到我的个人信息…我忘记了还有提交历史记录这个东西。然后我参考了这原创 2020-12-18 00:05:46 · 1002 阅读 · 0 评论 -
Ubuntu 18.04 无法自动检测耳机解决方法
Ubuntu 18.04 无法自动检测耳机解决方法如果最开始接触的是Windows,恐怕会对windows的多媒体控制中心印象深刻,鼠标点一下就可以进行各种音效设置。但是在linux上,这一方面还不是很方便。因为linux主要还是用在服务器上比较多,与windows这种老牌的私人桌面系统相比,在个人电脑的使用体验上会差很多,例如颜色不够鲜艳(也有可能是我的电脑配置太低。因为它很便宜)、触摸屏经常会失灵(也有可能是我的电脑太便宜)、偶尔卡死(因为使用了桌面软件,linux下的桌面应用还不成熟。不过也有可能原创 2020-12-17 00:20:15 · 2478 阅读 · 2 评论 -
排序算法——猴子排序
猴子排序让一群猴子在打印机前昼夜不停地敲打键盘,最终有可能能输入一部莎士比亚作品集——尽管概论微乎其微。同理,把一堆扑克牌扔到天上,等它们落下来的时候有概率会刚刚好从小到大排成一列。现在有一个无序的数组,我们让一只猴子来帮我们进行排序:#include <stdio.h>#include <stdlib.h>#include <time.h>#include <stdbool.h>#include <string.h>#defi原创 2020-12-16 00:03:35 · 6885 阅读 · 3 评论 -
printf函数是如何隐藏内存错误sysmalloc error
printf函数对内存的作用在写代码的时候,如果出现了动态分配的内存越界,就会报sysmalloc assertion错误(在较低的优化等级下不会出现该错误)但是,在某些时候,如果在恰当的位置添加了printf/scanf函数,那么即使写出了内存越界的代码,也不会报错这个时候,如果某些程序员比较愚笨,他就会认为是编译器错误,甚至认为是C语言的缺陷,因为他发现添加printf和不添加printf的效果差异有那么大,但是其实,主要的错误还是内存越界。使用valgrind可以轻松地进行检测。但是这里有一个原创 2020-12-15 13:36:04 · 306 阅读 · 0 评论 -
如何在linux中实现简单翻译器
如何在linux中实现简单翻译器我本来只是有个单词不会想查找,然后想在linux里面找一些简单的命令行翻译器,结果百度到的几款翻译器都很拉垮。这让我萌生了自己写一个简单的翻译器的念头。大致想法翻译器这个东西肯定不是十分钟就能写出来的,我肯定要使用接口来获取翻译的结果,或者使用爬虫获取翻译网站的信息。最开始我想到的是使用百度翻译的接口。介绍以下curl命令,它能获取网页的源代码。通过观察,我发现百度翻译的网站要翻译的词语直接放在了url里面然后我通过查看网页的资源获取了显示翻译结果文本的html原创 2020-12-14 15:10:53 · 1008 阅读 · 2 评论