自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 VSCode:设置顶部文件标签页滚动条的宽度

使用VSCode打开多个文件后,顶部的文件标签可以通过滚动条进行滚动,但是缺点是该滚动条太窄了,不好选择。2.选择工作台->编辑管理->Title Scrollbar Sizing->Large。3.可以看到滚动条的宽度变大了。

2024-05-11 23:08:53 303

原创 VSCode:隐藏工程中的文件和目录

通过files.exclude可以看到将文件和目录排除了,无法在项目中看到这些文件。1.在项目目录(也就是vscode打开的目录)下创建子目录。有时也需要隐藏工程中不必关注的文件和目录。假设工程中的文件结构如下。介绍了如何排除搜索目录。

2024-05-11 21:56:28 320

原创 VSCode:设置搜索时的排除目录

有时文件太多,或者有些文件或目录可以不用关注,这时可以通过设置排除目录和文件来实现。可以看到当搜索main时,a.c,b.c和m.c中的main都被搜索到了。其中"**/m.c"表示任意目录下的m.c文件都会被排除搜索。1.在项目目录(也就是vscode打开的目录)下创建子目录。"x/"表示目录x下的任意文件都会被排除搜索。VSCode搜索时默认会搜索目录下所有文件。可以看到只搜索到了文件a.c,达到了目的。此时通过vscode搜索。

2024-05-09 23:25:58 532

原创 C:STDIN_FILENO和stdin的区别

可以看到程序时可以直接使用stdout的,而不需要先通过fopen返回一个指向FILE的指针。1.STDIN_FILENO定义于文件/usr/include/unistd.h。可以看到通过STDOUT_FILENO可以直接向标准输出输出内容。作为read,write,close等系统调用的文件描述符使用。作为fopen,fprintf等io库函数的指针使用。2.stdin声明于文件stdio.h。

2024-05-09 22:04:37 68

原创 C:获取文件大小的两种方式

ftell可以返回文件当前位置的偏移量,所以可以先通过fseek将文件当前位置挪到尾部,然后再通过ftell获取文件的大小。2.通过fstat,该函数可以获取文件的相关信息,其中有关于文件大小的值。文件testfile.txt的内容是:123456。可以看到正确的获取了文件的大小。

2024-04-09 11:59:57 202

原创 C:检查字符串中是否有违法字符

2.含有某个特殊字符,且该特殊字符不是以斜杆\开头的。如果满足任意一个条件,则返回错误值。错误值代表不满足的检查项。1.含有某个特殊字符。

2024-04-08 09:18:27 107

原创 Linux开发:恢复标准输入/出文件描述符

可以看到先通过 stdIn=dup(0)将默认的标准输入保持,然后重定向后,再通过dup2(stdIn, 0);即可恢复默认的标准输入。介绍了可以通过dup系列函数将标准输入/出重定向到其他文件上,那么如果恢复默认的标准输入/出呢?可见被重定向恢复后,cin还是从之前的文件中读入。这是因为cin所代表的是输入输出流。暂未找到恢复cin的方法,后续找到后再补充。

2024-03-25 21:58:36 44

原创 Linux开发:dup, dup2, dup3

dup系列api的主要用途是为指定的文件描述符复制/指定一个新的描述符,使得新旧文件描述符指向内核中打开文件的描述表的同一个位置。如果新文件描述符所使用的值已经被open了,那么先关闭它,再重新复制到旧文件描述符上。由于标准输出文件描述符1被关闭了,因此在使用dup复制时,会使用最小的可用文件描述符,也就是1,这时文件描述1便和fd1指向了hi.txt。介绍了打开一个文件会获得一个文件描述符,该文件描述符指向内核中打开文件的描述表的一个位置,而该位置记录了当前打开文件的一些信息。因此cin >> s;

2024-03-25 00:07:10 179

原创 Linux开发:多进程通过open同时读取文件

那么f2为什么会共享读取偏移量呢,这是因为f2中open是在父进程中执行的,获取的文件描述符指向了打开文件的描述表上一个位置,然后通过fork,父子进程是共享当前的打开的文件描述符,这样,父子进程就通过该文件描述符指向了打开文件的描述表上同一个位置,因此共享了读取偏移量。所以每一次open都会返回不同的文件描述符,指向了打开文件的描述表上不同的位置,即使是同一个被打开文件,只要调用了多次open,就会通过不同的文件描述符指向打开文件描述表上不同的位置,所以是无法共享读取偏移量的。

2024-03-21 23:13:15 104

原创 Linux开发:管道零拷贝splice

SPLICE_F_MOVE:如果输出是文件,这个值则会使得操作系统内核尝试从输入管道缓冲区直接将数据读入到输出地址空间,这个数据传输过程没有任何数据拷贝操作发生。假如需要通过管道在父子进程间传递一个文件的数据,那么普通的做法,是从文件中读出数据,通过管道传递,然后再将数据写回文件。off_out:如果fd_out是管道,那么必须传递NULL即可,否则表示写入数据的偏移量。off_in:如果fd_in是管道,那么必须传递NULL即可,否则表示读取数据的偏移量。fd_out:数据目的地的文件描述符。

2024-03-21 21:52:47 144

原创 Linux开发:设置文件或目录的S_ISVTX

需要注意的是,被设置了S_ISVTX的目录,只能包含其目录下的一级文件或子目录,该目录本身不受保护,深层子目录也不被保护。drwxrwxrwx 2 test1 test1 4096 3月 17 20:44 aaa。-rwxrwxrwx 1 test1 test1 0 3月 17 20:51 ccc。1.通过用户test1创建一个目录/home/test1/aaa,并赋予aaa所有权限。介绍了在创建文件时可以设置S_ISVTX,那么这个S_ISVTX 是做什么的呢?

2024-03-17 21:05:21 46

原创 Linux开发:S_ISUID,S_ISGID的使用场景

r--r----- 1 xxx xxx 6 3月 17 15:59 ./hello.txt。---x--x--x 1 xxx xxx 16816 3月 17 15:01 ./file。---x--x--x 1 xxx xxx 16816 3月 17 15:59 ./file。---x--s--x 1 xxx xxx 16816 3月 17 15:59 ./file。---s--x--x 1 xxx xxx16816 3月 17 15:01 ./file。

2024-03-17 17:58:31 64

原创 Linux开发:open打开文件

在使用时,先把umask按位取反,然后与用户指定的权限进行按位与,得到的结果即为文件的权限,因此可以看到上面的例子中,创建文件时申请的权限是0777,然后当前的umask是0002,那么通过运算后得到的结果为0777 & 0775 = 0775,权限也就是rwxrwxr-x。可以看到文件是以写的方式创建的,文件的权限设置的是只读,创建后文件的权限也是只读,但是可以通过创建文件时的文件描述符进行写操作。来指明新文件的访问权限。如果创建文件时的文件描述符被关闭了,那么后续的操作也要符合文件的权限要求。

2024-03-17 13:22:38 199

原创 Linux开发:父子进程间通过匿名管道传输数据

1.read读取数据时,一次行最多可以读到read缓存区长度的数据,如果管道中的数据小于read缓存区,那么将只读取实际长度的数据,不会等待数据缓存区被填满,实际读取到的数据长度由read返回。2.如果子进程不关闭pipefd[1],那么当父进程写完数据退出后,由于子进程的写文件描述符还没关闭,所以子进程会一直阻塞在read无法退出。7.通过write向管道中写入数据,如果管道已满,则写操作会被阻塞。6.通过read从管道中读取数据,如果没有数据,则读操作会被阻塞。3.父进程fork,创建子进程。

2024-03-14 22:31:56 37

原创 Boost:通过noncopyable禁止拷贝和复制

可以看到由于使用的是默认拷贝构造函数,所以在构造a2时,a2.str和a1.str指向了同一块内存,因此在析构会被释放两次,造成段错误。Boost在C++11退出delete前,通过noncopyable也可以解决这个问题。可以看到noncopyable将拷贝构造和赋值运算符声明为了私有。C++11可以通过删除默认的拷贝构造和赋值运算符来解决这个问题。段错误 (核心已转储)

2024-03-13 21:45:43 39

原创 Linux开发:通过sendfile高效的拷贝文件数据

out_fd:在内核版本v2.6.33之前必须是个socket,但是从v2.6.33开始可以是可以是任意文件。可以看到数据从内核空间到用户空间,然后又从用户空间到内核空间,做了两次无意义的传送。1.读操作时需要先把数据从磁盘中读取到内核空间然后再把数据拷贝到用户空间。2.写操作把数据从用户空间拷贝到了内核空间,然后又从内核空间写道磁盘中。创建一个测试用的src_file.txt文件。in_fd:必须是支持mmap操作的文件描述符。可以看到用户空间耗时9秒,内核空间耗时近4秒。

2024-03-13 21:40:59 285

原创 Boost:获取通过asio调度任务的执行结果

可以看到通过post_function_use_future发布了两个任务到asio上,并且运行在不同的执行线程上,然后可以通过get获取任务的执行结果。通过这种方法需要注意的是post_function_use_future需要传递一个没有参数的函数,所以可以通过lambda包装有参数的函数。可以看到,sayHello处理完自己的工作后,会继续发布任务,发布完任务后,会继续处理其他任务。也可以通过post_function_use_future在多个io_context中传递。

2024-03-07 11:39:53 134

原创 C++:获取函数的返回值类型

invoke_result提供了方法获取函数的返回类型,但是使用起来有一点比较麻烦,就是需要提供完整的参数列表。可以看到,通过这种方式可以获取到普通函数,成员函数及lambda的返回值类型。

2024-03-07 09:17:52 85

原创 Boost:asio通过post调度任务

可以看到通过post可以把一个函数封装到lambda中,发送给线程来执行。从而完成任务的调度。介绍了多个线程绑定在一个io_service上,然后可以根据线程的忙闲情况分配任务到线程上。介绍了Crow接收到http请求后,如何把任务通过post分配到线程中处理。

2024-03-06 11:38:55 211

原创 Boost:asio通过make_work_guard保持io_service一直处于run

可以通过asio::make_work_guard保持io_service一直被阻塞在run函数中,等待后续被注册的异步任务。可以看出即使没有异步任务,run也一直保持这阻塞状态,直到运行了reset。通常如果没有异步任务注册到io_service上,那么run会立刻返回。

2024-03-06 11:33:08 76

原创 sdbusplus:为connection绑定bus

可以看到所new_method_call定义于bus::bus,而connection 继承于bus::bus,所以自然可以使用new_method_call。可以看出在构造connection时,如果没有指定总线,那么会默认通过sdbusplus::bus::new_default()构造一个总线。所以可以通过bus::details::bus_friend::get_busp获取到sd_bus*connection可以通过重载的构造函数来指定bus,但参数类型并不是bus而是sd_bus*

2024-03-03 21:59:19 434

原创 C++(23):lambda如果没有参数可以省略()

可以看到C++23中进一步的优化了lambda,使其更加便于使用。在定义lambda时,如果没有参数,那么C++23可以省略()

2024-03-02 11:42:55 30

原创 C++(23):新增size_t字面量

可见通过这种方式定义的变量与size_t是同一种类型。C++23新增"zu"作为size_t的字面量类型。

2024-03-02 11:35:23 127

原创 Shell:字符串的截取和替换

echo ${a%%,*},表示从右侧开始向左,通配到最后一个,*后,取剩余的字符。echo ${a%,*},表示从右侧开始向左,通配到第一个,*后,取剩余的字符。${a##*,},表示从左侧开始向右,通配最后一个*,后,取剩余的字符。${a#*,},表示从左侧开始向右,通配第一个*,后,取剩余的字符。${a#he},表示从左侧开始,匹配到完整的he后,取剩余的字符。${a%88},表示从右侧开始,匹配到完整的88后,取剩余的字符。

2024-02-29 22:58:04 313

原创 C++(23):auto(x)拷贝

可以看出来,通过auto(a)与通过A(a)的结果一样,都是先复制出一个对象,然后以右值的形式进行调用。

2024-02-29 21:59:29 54

原创 C++(23):在constexpr函数中调用consteval函数

那么可否在constexpr函数中判断为常量函数调用的情况下调用consteval函数呢?C++20又引入了is_constant_evaluated用于检查是否为常量环境调用。可以看到函数add可以根据不同的参数,选择不同的运行函数进行计算。虽然类似常量函数,但constexpr可以退化为普通函数。consteval函数是真正的常量函数。

2024-02-26 22:28:10 386

原创 Linux开发:pam6 check_user示例

需要说明的是,示例中在调用pam_start时使用了linux-pam提供的通用conversation函数misc_conv。也正是因为此函数,所以当对用户进行认证管理时,可以在控制台输出"Password:"提示用户输入密码,并关闭了回显。然后当用户输入密码后又通过该conversation函数把用户的输入传递给了pam服务模块中。1.通过pam_start发起pam,调用函数时指明使用的pam配置文件,如本例中使用的是check。3.通过pam_acct_mgmt可以对用于进行账号管理。

2024-02-26 22:08:41 55

原创 Linux开发:pam5 Ubuntu22.04中编译linux-pam

注:可通过./configure --help | less查看可配置的项, 并通过./configure 进行配置。linux-pam不仅包含了源代码还有相关的文档以及例子,是学习pam的一个很好的参考。Ubuntu22.04中使用的是linux-pam。进入linux-pam/ci目录,执行。编译完成后,可以通过如下命令检查。在linux-pam目录执行。在linux-pam目录执行。可以执行如下命令进行安装。安装完成后文件会被安装在。

2024-02-25 12:33:01 184

原创 C++(20):通过is_constant_evaluated判断函数当前的是否在常量环境下

可以看到当使用常量调用add时,通过is_constant_evaluated可以在函数中判断出当前是在常量环境中执行。constexpr函数当通过变量进行调用时,自动会退化为普通函数。

2024-02-24 20:48:52 162

原创 C++(20):find, find_if, find_if_not

C++20增强了泛型算法find/find_if/find_if_not用于在容器中查找符合条件的元素.find_if_not搜索不满足条件的值,返回迭代器。find_if根据条件来搜索容器,返回迭代器。find搜索容器,返回迭代器。

2024-02-24 10:33:00 60

原创 Linux开发:PAM4 pam_start

pam_conversation解析出消息后,根据应用程序的设计,有可能直接在终端上就显示了“Please input password:”,然后关闭回显等待用户直接输入密码,也后可能是把此消息发送给远端sshd,或是某个图形界面应用,然后等待其将密码传送回应用程序。3.PAM服务模块先设置好prompt消息内容,比如:“Please input password:”,再设置消息类型为PAM_PROMPT_ECHO_OFF,然后将此消息通过会话函数发送给应用程序。1.应用程序调用pam_start,设置。

2024-02-11 17:56:31 288

原创 VSCode:替换空行

2.在查找输入框中输入:^\s*(?1.按Ctrl+H弹出替换窗口。3.点击使用正则表达式。

2024-02-10 18:08:06 638

原创 Linux开发:PAM3 Ubuntu(22.04)安装PAM开发库

Ubuntu22.04默认是不带pam开发库的,需要通过以下命令进行安装。

2024-02-10 15:10:12 545

原创 Linux开发:PAM2 配置文件

PAM验证成功的必要条件,也就是说所有被标记为required的模块,都需要被依次调用,并且全都返回成功的情况下,本次PAM验证才能返回成功。PAM配置文件通常保存在/etc/pam.d/目录下,当应用程序进行认证时,会选择对应的PAM配置文件,而PAM配置文件又对PAM服务具体使用哪些模块(动态链接库)进行了描述,从而动态的加载PAM模块完成认证。每一个PAM服务会占一行,完成PAM调用时,会依次调用对应PAM服务的每个服务模块,依据每个PAM服务模块的返回值,以及控制标记来决定本次PAM调用的结果。

2024-02-09 20:59:17 241

原创 Linux开发:PAM1 介绍

2)account:主要用于非验证的账户管理,比如账户的合法性检查,账号的属性检查,如是否允许登录,是否已过期,是否处于有效的登录时间,是否已达到最大登录数量限制,用户的登录位置(如root只允许通过控制台登录)的检查。通过这种方式,应用程序与底层的认证逻辑实现进行了解耦,而且PAM API与PAM SPI是两套通用的接口定义,从而简化了认证的开发,系统管理员也可以通过修改PAM配置文件,在不重新编程的情况下,完成对认证服务的调整。2)通过account的验证后,需要通过auth模块,验证密码的合法性。

2024-02-09 13:04:28 230

原创 C++:通过count和find判断vector中是否包含某个数据

需要说明的是,count需要计数,所以会遍历整个vector,所以效率会低一些。

2024-02-04 19:13:32 437

原创 TypeScript:将arraybuffer类型数据转换为json

那么响应数据将被保存在arraybuffer类型的数组中,可以通过如下方式将其转为为json。通过axios发送http请求时,如果设置了。

2024-02-04 14:59:22 1057

原创 C++(20):is_invocable

C++20引入了is_invocable,用于判定某个可执行类型(函数,lambda,函数对象等)的函数签名。is_invocable的第一个参数是函数类型,后面的参数是参数类型,可以通过其成员value来查看结果。可以看到通过is_invocable进行检查时,参数类型是兼容匹配的,不需要完全匹配。1.is_invocable/is_invocable_v检查函数参数类型。2.is_invocable_r_v检查函数返回值及参数类型。is_invocable_v可以直接返回值。

2024-02-03 22:40:45 112

原创 Web后端:CSRF攻击及应对方法

CSRF攻击是开发Web后端时需要重点解决的问题。那么什么是CSRF攻击呢?CSRF跨站点请求伪造(Cross—Site Request Forgery),其主要利用的是Cookie的一个弱点,就是Cookie 最初被设计成了允许在第三方网站发起的请求中携带:关于Cookie :HTTP 协议是的,可以通过 Cookie 来维持客户端与服务端之间的“会话状态”。服务端通过响应头设置 Cookie 到客户端,而客户端浏览器会自动在下次向服务器发送请求时添加名为。

2024-02-03 16:01:12 1496

原创 C++(20):通过concept及nlohmann将数据转换为字符串

可以看到各种原生类型都可以直接转换为stirng。自定义的结构体也可以比较容易得转换为string。

2024-02-01 23:05:25 292

空空如也

空空如也

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

TA关注的人

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