STDIN STDOUT, STDERR

STDIN STDOUT, STDERR Unix/Linux/BSD 都有三个特别文件,分别 标准输入 即 STDIN , 在 /dev/stdin , 一般指键盘输入, shell里代号是 0 标准输出 STDOUT, 在 /dev/stdout, 一般指终端(terminal), 就是显示器, shell里代号是 1 标准错误 STDERR, 在 /dev/stderr 也是指终端(terminal), 不同的是, 错误信息送到这里 shell里代号是 2 stdout和stderr 有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件 ls -l /proc/8669/fd/ total 0 lrwx------ 1 root root 64 4月 25 20:57 0 -> /dev/pts/7 lrwx------ 1 root root 64 4月 25 20:57 1 -> /dev/pts/7 lrwx------ 1 root root 64 4月 25 20:57 2 -> /dev/pts/7 所以,细想一下就知道,向1或2两个fd写东西,在内核里走的是完全相同的路径,不可能存在一会儿缓存一会儿不缓存的情况。 ...

2011-11-19 · 1 min · 169 words · -

Debian/Ubuntu 系统 Update-rc.d

Debian/Ubuntu 系统 Update-rc.d https://wangyan.org/blog/ubuntu-update-rc-d.html Ubuntu或者Debian系统中update-rc.d命令,是用来更新系统启动项的脚本。这些脚本的链接位于/etc/rcN.d/目录,对应脚本位于/etc/init.d/目录。在了解update-rc.d命令之前,你需要知道的是有关Linux 系统主要启动步骤,以及Ubuntu中运行级别的知识。 一、Linux 系统主要启动步骤 读取 MBR 的信息,启动 Boot Manager。 加载系统内核,启动 init 进程, init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。 init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别。通常情况下 /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg,Xwindow 为 Linux 下的图形用户界面系统。 启动登录管理器,等待用户登录。 二、运行级别 Ubuntu中的运行级别 0 (关闭系统) 1 (单用户模式,只允许root用户对系统进行维护。) 2 到 5 (多用户模式,其中3为字符界面,5为图形界面。) 6 (重启系统) 切换运行级别 init [0123456Ss] 例如: init 0 命令关机; init 6 命令重新启动 启动项管理工具 sudo apt-get install sysv-rc-conf //或者使用带gui的工具bum sudo sysv-rc-conf 三、update-rc.d命令详解 ...

2011-11-18 · 1 min · 119 words · -

missing LSB tags and overrides

missing LSB tags and overrides update-rc.d tomcat defaults pop out warning message missing LSB tags and overrides add the following lines into the script BEGIN INIT INFO Provides: tomcat Required-Start: $remote_fs $syslog Required-Stop: $remote_fs $syslog Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Start tomcat at boot time Description: Enable service provided by tomcat. END INIT INFO

2011-11-12 · 1 min · 59 words · -

tomcat 开机启动, jsvc

tomcat 开机启动, jsvc 参考http://tomcat.apache.org/tomcat-7.0-doc/setup.html的介绍,tomcat自带了jsvc工具, 需要先安装gcc, make 在tomcat的bin目录下: cd $CATALINA_HOME/bin tar xvfz commons-deamon-native.tar.gz cd commons-daemon-1.0.x-native-src/unix ./configure make cp jsvc ../.. cd ../.. 设置启动脚本 在$CATALINA_HOME/bin/commons-daemon-1.0.x-native-src/unix/samples目录下有一个Tomcat7.sh文件,将其复制到/etc/init.d/m目录下并命名为tomcat: sudo cp Tomcat7.sh /etc/init.d/tomcat add following lines to the file. ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start tomcat at boot time # Description: Enable service provided by tomcat. ### END INIT INFO CATALINA_HOME=/xxx/xxx/xxx/apache-tomcat-7.0.22 export CATALINA_HOME JAVA_HOME=/opt/jvm/jdk1.7.0 export JAVA_HOME 修改运行级别 ...

2011-11-12 · 1 min · 96 words · -

守护进程, 守护线程

守护进程, 守护线程 守护进程详解及创建,daemon() 使用 守护进程概述 Linux Daemon (守护进程) 是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux 系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程 syslogd、 web 服务器 httpd、邮件服务器 sendmail 和数据库服务器 MySQLd 等。 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户 (root) 权限运行,因为它们要使用特殊的端口 (1-1024) 或访问某些特殊的资源。 一个守护进程的父进程是 init 进程,因为它真正的父进程在 fork 出子进程后就先于子进程 exit 退出了,所以它是一个由 init 继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备 stdout 还是标准出错设备 stderr 的输出都需要特殊处理。 守护进程的名称通常以 d 结尾,比如 sshd、xinetd、crond 等 二,创建守护进程步骤 首先我们要了解一些基本概念: 进程组 : 每个进程也属于一个进程组 每个进程主都有一个进程组号,该号等于该进程组组长的 PID 号. 一个进程只能为它自己或子进程设置进程组 ID 号 会话期: 会话期(session)是一个或多个进程组的集合。 setsid()函数可以建立一个对话期: 如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。 (1)此进程变成该对话期的首进程 (2)此进程变成一个新进程组的组长进程。 (3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。 (4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行 现在我们来给出创建守护进程所需步骤: 编写守护进程的一般步骤步骤: 在父进程中执行fork并exit推出; 在子进程中调用setsid函数创建新的会话; 在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录; 在子进程中调用umask函数,设置进程的umask为0; 在子进程中关闭任何不需要的文件描述符 说明: 在后台运行。 为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。 if(pid=fork()) exit(0);//是父进程,结束父进程,子进程继续 脱离控制终端,登录会话和进程组 有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系: 进程属于一个进程组,进程组号 (GID) 就是进程组长的进程号 (PID) 。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: setsid(); 说明: 当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 禁止进程重新打开控制终端 现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: if(pid=fork()) exit(0);//结束第一子进程,第二子进程继续 (第二子进程不再是会话组长) 关闭打开的文件描述符 进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们: for(i=0;i 关闭打开的文件描述符close(i);> 改变当前工作目录 进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/") 重设文件创建掩模 进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除: umask(0); 处理SIGCHLD信号 处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程 (zombie) 从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。 signal(SIGCHLD,SIG_IGN); 这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。 创建守护进程 在创建之前我们先了解setsid()使用: ...

2011-11-12 · 6 min · 1278 words · -

dentry

dentry 上一节提到了,struct file并不是文件系统的核心数据结构,那么dentry和inode,这两个结构体谁是文件系统的核心数据结构呢,它们存在的目的又分别是什么呢? 首先dentry是目录项缓存,是一个存放在内存里的缩略版的磁盘文件系统目录树结构,他是directory entry的缩写。我们知道文件系统内的文件可能非常庞大,目录树结构可能很深,该树状结构中,可能存在几千万,几亿的文件。 首先假设不存在dentry这个数据结构,我们看下我们可能会面临什么困境: 比如我要打开/usr/bin/vim 文件, 1 首先需要去/所在的inode找到/的数据块,从/的数据块中读取到usr这个条目的inode, 2 跳转到user 对应的inode,根据/usr inode 指向的数据块,读取到/usr 目录的内容,从中读取到bin这个条目的inode 3 跳转到/usr/bin/对应的inode,根据/usr/bin/指向的数据块,从中读取到/usr/bin/目录的内容,从里面找到vim的inode 我们都知道,Linux提供了page cache页高速缓存,很多文件的内容已经缓存在内存里,如果没有dentry,文件名无法快速地关联到inode,即使文件的内容已经缓存在页高速缓存,但是每一次不得不重复地从磁盘上找出来文件名到VFS inode的关联。 因此理想情况下,我们需要将文件系统所有文件名到VFS inode的关联都纪录下来,但是这么做并不现实,首先并不是所有磁盘文件的inode都会纪录在内存中,其次磁盘文件数字可能非常庞大,我们无法简单地建立这种关联,耗尽所有的内存也做不到将文件树结构照搬进内存 https://bean-li.github.io/vfs-inode-dentry/

2011-11-09 · 1 min · 24 words · -

Repository write access denied

Repository write access denied Repository write access denied manually add public key to /home/git/.ssh/authorized_keys start with : command=“python /home/www/indefero/scripts/gitserve.py USER”,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa**

2011-11-03 · 1 min · 21 words · -

glibc

glibc glibc 是非常底层的系统库,千万不要自己手动更新,网上有很多教训。 glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。Linux下面的标准c库不仅有这一个,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6。 glib glib是GTK+的基础库,它由基础类型、对核心应用的支持、实用功能、数据类型和对象系统五个部分组成,可以在[http://www.gtk.org gtk网站]下载其源代码。是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API。GTK+是可移植的,当然glib也是可移植的,你可以在linux下,也可以在windows下使用它。使用gLib2.0 (glib的2.0版本) 编写的应用程序,在编译时应该在编译命令中加入pkg-config –cflags –libs glib-2.0,如: gcc pkg-config –cflags –libs glib-2.0 hello.c -o hello 使用glib最有名的就是GNOME了。 eglibc eglic是二进制兼容glibc的,就是说如果代码使用的是eglic的库,那么换成glic之后无需重新编译。glibc为了实现最优化处理,致使在空间占用上越来越为人诟病。eglibc的主要特性是更好的支持嵌入式架构,支持不同的shell(GLIBC只支持bash),支持-Os,可配置组件,稳定分支修正了一些重要Bug等。 查看 glibc 版本, glibc version ldd --version # ldd命令为 glibc 提供 dpkg -s libc6 | grep Ver https://nieyong.github.io/wiki_ny/glibc,%20eglibc%E5%92%8C%20glib%E7%9A%84%E5%8C%BA%E5%88%AB.html https://shixiangwang.github.io/home/cn/post/2020-09-28-note-about-glibc/

2011-10-26 · 1 min · 46 words · -

ip-guard, [0x7FFFBB83E044] ANOMALY: use of REX.w is meaningless (default operand size is 64)

“ip-guard, [0x7FFFBB83E044] ANOMALY: use of REX.w is meaningless (default operand size is 64)” HKEY_LOCAL_MACHINE\SOFTWARE\TEC\Ocular.3\agent\config 字符串类型, key: hookapi_filterproc_external value: cmd.exe;wsl.exe foo.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\TEC\Ocular.3\agent\config] "hookapi_filterproc_external"="cmd.exe;wsl.exe"

2011-10-19 · 1 min · 27 words · -

Zipkin

Zipkin Zipkin 是一个基于 Java 开发的、开源的、分布式实时数据跟踪系统 (Distributed Tracking System) https://zipkin.io/

2011-10-16 · 1 min · 9 words · -

df command

df command 文件系统类型, 磁盘分区类型 df -T df 是来自于coreutils 软件包,系统安装时,就自带的;我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置; 举例: df -lh Filesystem 容量 已用 可用 已用% 挂载点 /dev/hda8 11G 6.0G 4.4G 58% / /dev/shm 236M 0 236M 0% /dev/shm /dev/sda1 56G 22G 35G 39% /mnt/sda1 我们从中可以看到,系统安装在/dev/hda8 ;还有一个56G的磁盘分区/dev/sda1挂载在 /mnt/sda1中; 其它的参数请参考 man df disk free 的缩写;用于显示目前Linux系统上的文件系统的磁盘使用情况统计, df 是用 superblock 的信息统计磁盘占用的. df -h # 查看 inode 使用情况 df -hi df -t ext4 -h # 查看文件系统类型 df -T -h # inode 使用统计 df -i df命令可以获取硬盘被占用了多少空间, 目前还剩下多少空间等信息, 它也可以显示所有文件系统对i节点和磁盘块的使用情况。 ...

2011-10-16 · 2 min · 302 words · -

md5, sha256

md5, sha256 # linux md5sum [OPTION]... [FILE]... md5sum foo.tar sha256sum foo.tar sha1sum foo.tar # windows certutil -hashfile foo.tar MD5 certutil -hashfile foo.tar SHA1 certutil -hashfile foo.tar SHA256 # macos md5 foo.tar MD5: 一种单向Hash函数/单向散列函数 Message Digest Algorithm MD5 (中文名为消息摘要算法第五版) 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321 (R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992) 。 描述 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法 (Message-Digest Algorithm 5) ,此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位 (十六进制长度就是32位) 的"指纹" (或称"报文摘要") ,不同的文件产生相同的报文摘要的可能性是非常非常之小的。 在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。 选项: -b 或 -binary :把输入文件作为二进制文件看待。 -t 或 -text :把输入的文件作为文本文件看待 (默认) 。 -c 或 -check :用来从文件中读取md5信息检查文件的一致性。(不细说了参见info) -status :这个选项和check一起使用,在check的时候,不输出,而是根据返回值表示检查结果。 -w 或 -warn :在check的时候,检查输入的md5信息又没有非法的行,如果有则输出相应信息。 [举例] ...

2011-10-14 · 2 min · 217 words · -

cgroup, namespace

cgroup, namespace cgroup 的主要作用:管理资源的分配、限制; namespace 的主要作用:封装抽象,限制,隔离,使命名空间内的进程看起来拥有他们自己的全局资源; Chroot Chroot 可以将进程及其子进程与操作系统的其余部分隔离开来。但是,对于 root process ,却可以任意退出 chroot。 现代化容器技术带来的优势 轻量级,基于 Linux 内核所提供的 cgroup 和 namespace 能力,创建容器的成本很低; 一定的隔离性; 标准化,通过使用容器镜像的方式进行应用程序的打包和分发,可以屏蔽掉因为环境不一致带来的诸多问题; DevOps 支撑 (可以在不同环境,如开发、测试和生产等环境之间轻松迁移应用,同时还可保留应用的全部功能); cgroup Linux control groups cgroup 是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源 (如CPU、内存、磁盘输入输出等)。它是由 Google 的两位工程师进行开发的,自 2018 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。 cgroup 主要限制的资源是: CPU 内存 网络 磁盘 I/O cgroup 的组成 cgroup 代表“控制组”,并且不会使用大写。cgroup 是一种分层组织进程的机制, 沿层次结构以受控的方式分配系统资源。我们通常使用单数形式用于指定整个特征,也用作限定符如 “cgroup controller” 。 cgroup 主要有两个组成部分: core - 负责分层组织过程; controller - 通常负责沿层次结构分配特定类型的系统资源。每个 cgroup 都有一个 cgroup.controllers 文件,其中列出了所有可供 cgroup 启用的控制器。当在 cgroup.subtree_control 中指定多个控制器时,要么全部成功,要么全部失败。在同一个控制器上指定多项操作,那么只有最后一个生效。每个 cgroup 的控制器销毁是异步的,在引用时同样也有着延迟引用的问题; ...

2011-10-13 · 1 min · 87 words · -

linux user, group, 用户 用户组

linux user, group, 用户 用户组 用户 查看用户 cat /etc/passwd wyue:x:513:513::/home/wyue:/bin/bash 看第三个参数: 500 以上的,就是后来建的用户了。其它则为系统的用户。 创建用户 # create user, 创建目录 /home/user0, 默认 bash sudo useradd -m user0 # 创建用户 user_0, 默认不会创建 home 目录, 默认 bash sudo useradd user_0 # 给 user_0 设置密码 sudo passwd user_0 sudo useradd -m -s /bin/bash user0 # create group and user sudo useradd -m -s /bin/bash -g group0 user0 sudo passwd user0 sudo useradd -m -s /bin/zsh user0 sudo useradd -M -s /bin/false user1 sudo useradd user0 # ubuntu shadow 包提供的工具 # adduser 是一个高级脚本,通常存在于 Debian / Ubuntu 系统 上。 # --system 创建一个系统用户,通常用于运行系统服务(如 Kafka、nginx、mysql 等),不是用于日常登录的普通用户。系统用户的 UID 通常小于 1000。 # --group 同时创建一个与用户名相同的用户组(kafka),并将用户添加进这个组。 # kafka 是一个系统用户,通常用于运行 Kafka 服务。 sudo adduser --system --no-create-home --group kafka options # -m: create home folder, 不加 -m 参数,默认不创建 home # -M: Don't create a home directory # -s: specify shell for user, 默认是 /bin/bash # -s /bin/false - Don't assign a shell (or more accurately, make the shell /bin/false, so the user cannot be logged into) # -r: create system account # -d: home dir # -r - Make a system user # -g <群组>: 指定用户所属的群组; # -G <群组>: 指定用户所属的附加群组 # -c <备注>:加上备注文字。备注文字会保存在 passwd 的备注栏位中; 删除用户 -r, 删除用户 home 目录 userdel -r test 设置密码 sudo passwd user0 输入密码: 一般密码至少要有六个字符,这里输入的密码是看不见的,屏幕没显示 重新输一次密码: ...

2011-09-25 · 9 min · 1830 words · -

tar

tar tar tar [-cxtzjvfpPN] 文件与目录 …. 参数: -z : 是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -x : 解开一个压缩文件的参数指令! -v : 压缩的过程中显示文件!这个常用,但不建议用在背景执行过程! -f : 使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数! 例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成 『 tar -zcvPf tfile sfile』才对喔! -c : 建立一个压缩文件的参数指令(create 的意思); -t : 查看 tarfile 里面的文件! 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在! 因为不可能同时压缩与解压缩。 -j : 是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -p : 使用原文件的原来属性 (属性不会依据使用者而变) -P : 可以使用绝对路径来压缩! -N : 比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! -exclude FILE: 在压缩的过程中,不要将 FILE 打包! ...

2011-08-30 · 2 min · 273 words · -

buddyinfo, slabinfo, zoneinfo

buddyinfo, slabinfo, zoneinfo /proc/buddyinfo是linuxbuddy系统管理物理内存的debug信息。 在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内存,以2的幂次方的形式,分成11个块链表,分别对应为1、2、4、8、16、32、64、128、256、512、1024个页块。 而Linux支持NUMA技术,对于NUMA设备,NUMA系统的结点通常是由一组CPU和本地内存组成,每一个节点都有相应的本地内存,因此buddyinfo 中的Node0表示节点ID;而每一个节点下的内存设备,又可以划分为多个内存区域(zone),因此下面的显示中,对于Node0的内存,又划分类DMA、Normal、HighMem区域。而后面则是表示空闲的区域。 此处以Normal区域进行分析,第二列值为100,表示当前系统中normal区域,可用的连续两页的内存大小为1002PAGE_SIZE;第三列值为52,表示当前系统中normal区域,可用的连续四页的内存大小为522^2PAGE_SIZE cat /proc/buddyinfo Node 0, zone DMA 23 15 4 5 2 3 3 2 3 1 0 Node 0, zone Normal 149 100 52 33 23 5 32 8 12 2 59 Node 0, zone HighMem 11 21 23 49 29 15 8 16 12 2 142 文件/proc/slabinfo统计slab分配器相关信息 % cat /proc/slabinfo https://zhuanlan.zhihu.com/p/358891862 slab 分配器 在Linux中,伙伴分配器(buddy allocator)是以页为单位管理和分配内存。 但在内核中的需求却以字节为单位(在内核中面临频繁的结构体内存分配问题)。 假如我们需要动态申请一个内核结构体(占 20 字节), 若仍然分配一页内存,这将严重浪费内存。那么该如何分配呢? slab 分配器专为小内存分配而生, 由 Sun 公司的一个雇员 Jeff Bonwick 在 Solaris 2.4中 设计并实现。slab 分配器分配内存以字节为单位, 基于伙伴分配器的大内存进一步细分成小内存分配。换句话说,slab 分配器仍然从 Buddy 分配器中申请内存,之后自己对申请来的内存细分管理。 ...

2011-08-28 · 1 min · 113 words · -

迭代器模式, Iterator

迭代器模式, Iterator 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。 @startuml abstract class Aggregate Aggregate : public abstract Iterator createIterator() class ConcreteAggregate ConcreteAggregate : Object[] objArray ConcreteAggregate : public ConcreteAggregate(Object[] objArray) ConcreteAggregate : public Iterator createIterator() ConcreteAggregate : public Object getElement(int index) ConcreteAggregate : public int size() Aggregate<|--ConcreteAggregate interface Iterator Iterator : public void first() Iterator : public void next() Iterator : public boolean isDone() Iterator : public Object currentItem() class ConcreteIterator ConcreteIterator : private ConcreteAggregate agg ConcreteIterator : private int index ConcreteIterator : private int size ConcreteIterator : public ConcreteIterator(ConcreteAggregate agg) ConcreteIterator : public void first() ConcreteIterator : public void next() ConcreteIterator : public boolean isDone() ConcreteIterator : public Object currentItem() Iterator<|--ConcreteIterator ConcreteAggregate .right.> ConcreteIterator ConcreteIterator-left->ConcreteAggregate class Client Client .left.> Aggregate Client .right.> Iterator @enduml 迭代器模式涉及到以下几个角色: ...

2011-08-27 · 2 min · 425 words · -

mplayer

mplayer 基本播放控制 → 前进10秒 ← 后退10秒 ↑ 前进60秒 ↓ 后退60秒 PageUP 前进10分钟 PageDown 后退10分钟 Enter 全屏 Space 暂停 Esc 退出 q 退出 音量调节 9 降低音量 0 增大音量 / 降低音量 * 增大音量 a 切换声道 mplayer command monitoraspect mplayer -monitoraspect 1.25 6.rmvb 全屏 mplayer -aspect 16:9 -fs debian 6 smplayer 声音小 Options > preferences > audio > output driver select “alsa” http://www.wiloon.com/?p=2850 smplayer 中文字幕 option > preference > subtitles > encoding select utf8 ...

2011-08-27 · 1 min · 84 words · -

Yasm

Yasm Yasm是一个完全重写的NASM汇编。目前,它支持x86和AMD64指令集,接受NASM和气体汇编语法,产出二进制, ELF32 , ELF64 , COFF , Mach - O的 ( 32和64 ) , RDOFF2 ,的Win32和Win64对象的格式,并生成STABS 调试信息的来源,DWARF 2 ,CodeView 8格式。

2011-08-27 · 1 min · 21 words · -

modprobe, `lsmod`

modprobe, lsmod modprobe 可载入指定的个别模块,或是载入一组相依的模块。modprobe 会根据 depmod 所产生的相依关系,决定要载入哪些模块。 若在载入过程中发生错误,在 modprobe 会卸载整组的模块 https://blog.csdn.net/future_fighter/article/details/3862795 lsmod 功能: 列出内核已载入模块的状态 用法: lsmod 描述: lsmod 列出 /proc/modules 的内容。 输出为: Module(模块名) Size(模块大小) Used by(被…使用) # 查看某一个模块是否已经被加载 lsmod|grep wireguard 手动加载卸载 控制内核模块载入/移除的命令是 kmod 软件包提供的 # 手动加载内核模块 sudo modprobe wireguard # 手动卸载内核模块 modprobe -r wireguard # 或者 rmmod wireguard load kernel module at boot vim /etc/modules-load.d/wireguard.conf # load wireguard module at boot wireguard command systool -v -m module_name modprobe --show-depends modinfo 查看内核模块的信息,包括开发人员信息,依赖信息 modinfo module_name https://wiki.archlinux.org/index.php/Kernel_modules_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87

2011-08-20 · 1 min · 74 words · -