学习记录
文章平均质量分 66
伊库塔花花
这个作者很懒,什么都没留下…
展开
-
ubuntu21.10搭建ebpf环境,BCC和bpftrace
1. 安装虚拟机虽说centos是生产环境中的标准系统,但是从个人学习角度还是推荐ubuntu,各种软件安装包都能方便地找到,操作界面时也很漂亮。之前一直在centos7.6上折腾,自己升级内核版本,自己安装各种高版本依赖,有一段时间被折磨得放弃了很久。这次决定直接从最新版的ubuntu21.10开始学习,centos8可能也会好很多,只是我没有尝试过。1.1. 下载镜像选择下载最新的桌面版就好,下载地址 https://cn.ubuntu.com/download/desktop,写这篇总结的时候版原创 2022-05-02 12:31:27 · 5576 阅读 · 2 评论 -
centos7安装bcc和简单测试
系统环境uname -r5.10.2-1.el7.elrepo.x86_64cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)升级内核版本 https://www.cnblogs.com/xzkzzz/p/9627658.html按照官方的安装流程安装https://github.com/iovisor/bcc/blob/master/INSTALL.md#centos—source安装依赖更新安装会花一些时间sudo原创 2022-04-14 23:14:53 · 2472 阅读 · 0 评论 -
golang 使用下标复制切片的踩坑记录
最近排查了一个问题,最后发现是由于对golang的切片实现不熟悉导致踩了坑。切片的底层结构由数组指针,切片容量cap,切片当前长度len组成。一、切片的三种初始化方式的区别字面值会根据传入的字面值初始化底层数组并创建切片例子arr := []int{1, 2, 3}下标初始化会创建一个指向原数组的切片结构体,不会拷贝原数组或者原切片中的数据,所以修改新切片的数据也会修改原切片。例子arr := [3]int{1, 2, 3}slice := arr[0:1]make关键原创 2022-03-05 00:09:58 · 591 阅读 · 0 评论 -
APUE学习笔记(十七)高级进程间通信
17.1 Unix域套接字UNIX 域套接字用于在同一台计算机上运行的进程之间的通信。UNIX 域套接字就像是套接字和管道的混合。一对相互连接的UNIX域套接字可以起到全双工管道的作用。和网络套接字相比:在同一计算机上使用,效率更高;仅复制数据,不进行协议处理;域套接字提供流和数据报两种接口,数据报服务是可靠的;借助UNIX域套接字轮询XSI消息队列创建消息队列,监听消息#include "apue.h"#include <netdb.h>#include <sys原创 2021-06-19 22:11:41 · 233 阅读 · 0 评论 -
APUE学习笔记(十六)网络IPC
16.1 套接字描述符套接字是通信端点的抽象,用套接字描述符访问套接字。套接字描述符本质上是一个文件描述符,但是不是所有接受文件描述符的函数都接受套接字描述符。为创建一个套接字,调用socket函数。套接字通信是双向的,可以采用shutdown函数来禁止一个套接字的I/O。套接字类型描述SOCK_DGRAM固定长度、无连接、不可靠的报文传递SOCK_RAWIP协议的数据报接口SOCK_SEQPACKET固定长度、有序、可靠、面向连接的报文传递SOCK_ST原创 2021-06-19 22:10:49 · 196 阅读 · 0 评论 -
APUE学习笔记(十五)进程间通信
管道和FIFO仍能有效引用于大量应用程序,但是在新程序中要避免使用消息队列和信号量,而应当考虑使用全双工管道和记录锁。15.1 管道管道的局限性:半双工只能在具有公共祖先的两个进程之间使用管道是通过调用pipe函数创建的当读一个写端已被关闭的管道时,在所有数据都被读取后read返回0,表示文件结束。如果写一个读端已被关闭的管道,则产生信号SIGPIPE。例子1使用管道传递数据#include "apue.h"int main(void) { int n; int原创 2021-06-19 22:09:47 · 176 阅读 · 0 评论 -
APUE学习笔记(十二)线程控制
12. 1 线程属性如果在创建线程时就知道不需要了解线程的终止状态,就可以使用pthread_attr_setdetachstatepthread_attr_init对线程属性进行初始化,pthread_attr_destroy执行清理工作。对于进程来说虚地址空间的大小是固定的,但对于线程来说,同样大小的虚地址空间必须被所有的线程栈共享。如果线程栈的虚地址空间都用完了,用pthread_attr_setstack函数来改变新建线程的栈位置。如果希望改变默认的栈大小但又不想自己处理线程栈的分配问题,原创 2021-06-19 22:06:43 · 152 阅读 · 0 评论 -
APUE学习笔记(十三/十四)守护进程和高级IO
13. 守护进程要创建一个守护进程需要遵循一个固定的步骤,可以参考下面的例子。例子#include <fcntl.h>#include "apue.h"#include <sys/resource.h>#include <syslog.h>void daemonize(const char *cmd) { int i, fd0, fd1, fd2; pid_t pid; struct rlimit rl; struct原创 2021-06-19 17:30:14 · 121 阅读 · 0 评论 -
APUE学习笔记(十一)线程
11. 1 线程概念进程可以有多个控制线程,每个线程处理各自独立的任务。一个进程的所有信息对该进程的所有线程都是共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。1. 多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享,而多个线程共享相同的存储地址空间和文件描述符。2. 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码。3. 有些问题可以分解使用多线程从而提高整个程序的吞吐量。4. 交互的程序可以通过使用多线程来改善响应时间。11.2 线原创 2021-06-19 01:07:33 · 143 阅读 · 0 评论 -
APUE学习笔记(十)信号
10.1 信号概念mac和linux都支持31种信号。不存在编号为0的信号。产生信号的方式:当用户按某些终端键时引发终端产生的信号硬件异常产生信号:除数为0、无效的内存引用等用户可用kill命令将信号发送给其他进程进程调用kill函数可将任意信号发送给另一个进程或进程组当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号处理信号的方式:忽略此信号。SIGKILL和SIGSTOP这两种信号不能被忽略,它们向内核和超级用户提供了使进程终止的可靠方法。捕捉信号。不能捕捉SIGK原创 2021-06-18 02:39:48 · 329 阅读 · 0 评论 -
APUE学习笔记(九)进程关系
9.1 终端登录这里终端是本地的或者是远程的。登录unix系统都经由内核中的终端设备驱动程序。BSD系统的过程:init读取文件/etc/ttys,对每一个允许登录的终端设备调用一次fork,它所生成的子进程则exec getty程序。getty打开终端设备,exec login程序。至此,登录用户的登录shell开始运行。9.2 网络登录网络登录时 在终端和计算机之间的连接不再是点到点的。在网络登录情况下,login仅仅是一种可用的网络服务。为使同一个软件既能处理终端登录又能处理网络登录,系统使原创 2021-06-17 01:52:37 · 170 阅读 · 0 评论 -
APUE学习笔记(八)进程控制
8.1 进程标识每个进程都有一个非负整型表示的唯一进程ID。进程ID是可重用的。ID为0的进程通常是调度进程,常常被称为交换进程(swapper)。 该进程是内核的一部分,它并不执行任何磁盘上的程序。ID为1通常是init进程,在自举过程结束时由内核调用。#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char* argv[]) { printf(原创 2021-06-17 01:46:51 · 385 阅读 · 0 评论 -
APUE学习笔记(七)进程环境
7.1 main函数c程序总是从main函数开始执行。在调用main前先调用一个特殊的启动例程,从内核取得命令行参数和环境变量值。7.2 进程终止正常终止(1) 从main返回;(2) 调用exit;(3) 调用_exit或_Exit;(4) 最后一个线程从其启动例程返回(5) 从最后一个线程调用pthread_exit_exit和_Exit立即进入内核, exit则先执行一些清理处理,对于所有打开流调用fclose函数,然后返回内核。返回值退出函数都带一个整型参数,称为终止状态。原创 2021-06-17 00:58:54 · 127 阅读 · 0 评论 -
APUE学习笔记(五)标准IO库
5.1 流和FILE所有I/O函数都是围绕文件描述符的。 当打开一个文件时返回一个文件描述符,该文件描述符就用于后续的I/O操作。标准I/O库的操作是围绕流(stream) 进行的。标准I/O文件流可用于单字节或多字节(“宽” )字符集。 流的定向决定了所读、写的字符是单字节还是多字节的。fwide函数可用于对未定向的流设置定向。当打开一个流时标准I/O函数fopen返回一个指向FILE对象的指针。5.2 缓冲标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。标准I/O原创 2021-06-17 00:43:32 · 151 阅读 · 0 评论 -
APUE学习笔记(四)文件和目录
4.1 statstat/lstat函数返回文件的信息结构体stat。st_mode中包含了文件的格式信息。例子判断文件或目录类型#include "apue.h"int main(int argc, char *argv[]) { int i; struct stat s; char *ptr; for (i = 1; i < argc; i++) { if (lstat(argv[i], &s) == -1)原创 2021-06-17 00:18:06 · 141 阅读 · 0 评论 -
APUE学习笔记(三)文件IO
3.1 文件描述符对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。例子: 0表示stdin, 1表示stdout, 2表示stderr.文件描述符的变化范围是0~OPEN_MAX-1,早期允许每个进程打开19个文件。对很多系统来说,文件描述符范围是无限的。3.2 open和openat调用open或openat函数可以打开或创建一个文件。 int open(const char *path, int oflag, ...); int openat(int fd, c原创 2021-06-17 00:16:26 · 107 阅读 · 0 评论 -
APUE学习笔记(二)unix标准和实现
2.1 标准化ISO C C程序设计语言标准POSIX 指的是可移植操作系统接口(Portable Operating System Interface)。该标准的目的是提升应用程序在各种UNIX系统环境之间的可移植性。Single UNIX Specification(SUS,单一UNIX规范)是POSIX.1标准的一个超集。 它定义了一些附加接口,扩展了POSIX.1规范提供的功能。POSIX.1相当于Single UNIX Specification中的基本规范部分。2.2 实现对标准的实原创 2021-06-16 01:57:28 · 185 阅读 · 0 评论 -
APUE学习笔记(一)unix基础知识
1.1 Unix体系内核的接口被称为系统调用。公用函数库构建在系统调用接口之上。shell和公共函数都能直接进行系统调用,应用程序可以直接进行系统调用,也可以使用shell和公共函数库里的函数,从而间接进行系统调用。1.2 登录shell是一个命令行解释器,它读取用户输入然后执行命令。shell的用户输入通常来自于终端(交互式shell),有时则来自于文件(称为shell脚本)。1.3 文件和目录除了斜线(/)和空格之外,都可以用于文件名;由斜线分隔的多个文件名构成路径名。#include原创 2021-06-16 01:51:14 · 326 阅读 · 0 评论 -
APUE学习笔记 准备
1. 前言最后花了一些时间学习了下《unix环境高级编程》。这本书其实买了半年了一直都没有时间打开。平时上班的时候都纠结于一些边角料的工作和细枝末节的技术问题,感觉自己的提升太少了,所以觉得还是要找时间好好补一补基础知识。虽然买了书,但是实际上大部分时间都是在看电子版的pdf。纸本书太厚没办法随身带,而且由于和室友合住,晚上熄灯了之后根本没法看书。所以还是电子版的比较方便。2. 开始2.1 准备工作IDE: clion 2020.3 mac编译工具: cmake源代码下载:http://ww原创 2021-06-16 01:31:34 · 148 阅读 · 0 评论 -
c语言学习简要笔记
大学的时候学习过c语言,不过一直都没怎么用过,到现在基本已经都还给老师了。所以想着找个时间补补课,所以在网上找了一个c语言课程,跟着老师一起学习了下。ps: 上班之后才觉得花钱买课一点都不是负担,只是没有时间和精力去学习。1. 搭建环境这里使用的是window10环境。安装msys2包管理工具,官网下载exe安装就好。安装visul sudio, 选择社区版本就好了安装clion,使用的是2020.3安装mingw。打开msys2,使用命令安装依赖pacman -Syupac原创 2021-04-24 20:17:34 · 873 阅读 · 6 评论 -
kafka-go源码简单笔记
1.问题最近在项目中用到了kafka,客户端使用的是开源的kafka-go,版本v0.4.8。前端时间kafka集群缩容之后,发现客户端写数据总是返回连接超时错误。一般而言,客户端都是会动态更新元数据的,但是为什么总是失败呢?只好把源代码梳理了下。2.调用过程中间调用过程还是有点复杂的,估计我也讲不清楚就不尝试了。感兴趣的朋友可以结合源码和下面的导图自己看下。3.问题分析3.1为什么写数据总是返回错误对于我遇到的问题,主要关注两个地方。一个是发送数据时的Writer.WriteMessages原创 2021-04-15 02:13:51 · 1113 阅读 · 1 评论 -
curl请求添加cookie
一个例子,使用curl 命令发送请求,一些需要登录鉴权的网站使用cookie的,可以添加cookie到请求中。#添加自己的cookieck=""#设置分页大小ps=10# 多次请求for i in $(seq 1 2)dourl="$uri?&page_idx=$i&page_size=$ps"echo "url: $url"#发送请求,--cookie设置cookie,-H 设置header# 返回的内容有压缩的,使用gunzip进行压缩#结果保存到res.txt中原创 2021-03-06 20:21:50 · 4941 阅读 · 0 评论 -
localdns和httpdns的区别
localdns发送udp请求到53端口,httpdns发送http请求到dns服务器localdns存在问题,httpdns进行了规避域名缓存问题,可能导致负载均衡失效域名转发问题,无法获得真实客户端ip,可能导致跨运营商访问出口NAT问题,无法获得真实客户端ip域名更新问题,无法获取最新结果解析延迟,遍历多层dns服务器,时间较长参考链接 https://zhuanlan.zhihu.com/p/102839806...原创 2021-02-24 01:26:12 · 1111 阅读 · 0 评论 -
新建systemd自启动服务
0. golang程序package mainimport ( log "github.com/sirupsen/logrus" "time")func main() { for { log.Infof("hello, %v", time.Now()) time.Sleep(5*time.Second) }}编译安装go build -o myAppsudo install myApp /usr/local/myApp1. 编写unit service服务分为系原创 2021-02-23 01:23:58 · 485 阅读 · 0 评论 -
linux 性能分析命令
常用的几个系统性能分析的命令,以后遇到实际问题的时候再结合例子记录下。uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 sar -n TCP,ETCP 1 top 1. uptime展示当前时间,机器运行时间,用户数,1分钟,5分钟,15分钟CPU平均负载2. dmesg | tail查看最近10条的系统信息,可以用于系统设备故障诊断原创 2021-02-21 21:54:25 · 440 阅读 · 0 评论 -
proto文件转为golang结构体
proto文件转为golang结构体的方法总结1. 安装protoc插件go get github.com/golang/protobuf/protoc-gen-go安装完成之后,会在GOPATH/bin下的bin目录里看到下载的protoc-gen-go。可以在这个目录下执行命令,在其他目录下直接执行protoc命令可能会找不到命令,可以添加下路径。2. 添加路径#拷贝二进制文件cp protoc-gen-go /usr/local/bin/#添加环境变量vim ~/.bash_prof原创 2021-02-15 17:43:54 · 2605 阅读 · 0 评论 -
从文本中匹配出ip并填加双引号
转载自https://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html在每行的头添加字符,比如"HEAD",命令如下:sed 's/^/HEAD&/g' test.file在每行的行尾添加字符,比如“TAIL”,命令如下:sed 's/$/&TAIL/g' test.file1."^“代表行首,”$"代表行尾2.’s/$/&TAIL/g’ 中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就原创 2020-12-04 22:49:27 · 354 阅读 · 0 评论 -
protobuf对象 转为Json串写入elastic search遇到的问题总结
背景从kafka中消费数据后拿到的是protobuf序列化后的字节数组,转化为Java中的proto对象后,需要将这些protocol对象继续处理成Json串写入elasticsearch。各种问题Json工具选择刚开始尝试使用fastJson等工具来执行序列化,结果发现对于protobuf这种特殊对象,这些序列化工具都会报错,比如fastJson会提示UnsupportedOperationException: This field is not of enum type。最后在网上查找资料,发现原创 2020-07-08 00:22:25 · 1876 阅读 · 0 评论 -
beego项目中sso系统与权限系统的接入
最近在项目中需要在后端项目中接入sso系统和权限系统。之前在学习Java时其实也学习过,过了一个寒假就什么都不记得了。SSO接入现在sso系统已经很强大,前端完成主要功能,而后端实现对应的接口api/login和api/logout即可实现前后端的接入。这里只记录基本的逻辑顺序前端打开页面时,前端框架自动调用sso系统,执行登录操作sso登录成功后,前端会调用后端的login接口,传入从前端获得的service和ticketlogin函数会以service和ticket,再次向sso系统接口执行原创 2020-07-06 00:34:52 · 692 阅读 · 0 评论 -
IPv4和IPv6的格式和判断—Java和Go中的相关的方法(源码待加)
IPv4格式32位,4个字节的数字表示。点分格式展示为0-255.0-255.0-255.0-255因此,IPv4格式还比较好判断。IPv4 java正则表达式判断"^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$"^表示行开始,$表示行结束,?表示0或者1个(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d) //0-25525[0-5] 如果是25开头的三位数,原创 2020-07-05 00:40:12 · 1673 阅读 · 0 评论 -
Java不同分层的模型转换
在项目中不同层次之间,为了降低耦合性,便于维护和拓展,通常使用不同的模型。DTO (Data Transger Object) 为数据传输对象,通常将底层的数据聚合传给外部系统,它通常用作 Service 和 Manager 层向上层返回的对象。需要注意的是:如果作为分布式服务的参数或返回对象,通常要实现序列化接口。Param 为查询参数对象,适用于各层,通常用作接受前端参数对象。Param...原创 2019-12-06 22:59:09 · 1172 阅读 · 0 评论 -
Java深拷贝和浅拷贝
Java的对象拷贝是指实现了Cloneable接口的对象调用clone()方法来创建新的对象的方式。该函数会创建该类的新实例,并初始化所有属性对象。属性对象本身并不会自动调用 ,因此此方法实现的是浅拷贝而不是深拷贝。因此我们可以了解到,浅拷贝将返回该类的新的实例,该实例的引用类型对象共享。拷贝也会返回该类的新的实例,但是该实例的引用类型属性也是拷贝的新对象。浅拷贝和深拷贝的主要区别在于对于...原创 2019-12-06 22:10:14 · 94 阅读 · 0 评论 -
Java序列化
不同的序列化方法:Java 序列化的优点是:对对象的结构描述清晰,反序列化更安全。主要缺点是:效率低,序列化后的二进制流较大。Hession 序列化二进制流较 Java 序列化更小,且序列化和反序列化耗时更短。但是父类和子类有相同类型属性时,由于先序列化子类再序列化父类,因此反序列化时子类的同名属性会被父类的值覆盖掉,开发时要特别注意这种情况。Kryo 优点是:速度快、序列化后二...原创 2019-12-06 21:12:29 · 88 阅读 · 1 评论 -
从操作系统层面理解Java程序执行
转载自阿里巴巴中间件肉眼看计算机是由 CPU 、内存、显示器这些硬件设备组成,但大部分人从事的是软件开发工作。计算机底层原理就是连通硬件和软件的桥梁,理解计算机底层原理才能在程序设计这条路上越走越快,越走越轻松。从操作系统层面去理解高级编程语言的执行过程,会发现好多软件设计都是同一种套路,很多语言特性都依赖于底层机制,今天董鹏为你一一揭秘。结合 CPU 理解一行 Java 代码是怎么执行的根...转载 2019-12-06 15:03:41 · 840 阅读 · 1 评论