- 浏览: 146463 次
-
最新评论
文章列表
在主机名与 IP 地址的转换一节中提到的 gethostbyname 和 gethostbyaddr 函数仅仅支持 IPv4,本节将介绍一个同时支持 IPv4 和 IPv6 的 getaddrinfo 函数,它能够处理名字到地址以及服务到端口这两种转换。
#include <netdb.h>
int getaddrinfo(const char *hostname, const char *service,
const struct addrinfo *hints, struct addrinfo **result);
...
在 Redis 中,当一个普通集合类型只包含整数值元素,并且元素数量不多时,就会使用整数集合(intset)作为集合键的底层实现,它可以保存类型为 int16_t、int32_t 或者 int64_t 的整数值,并且不会重复。这可通过类似下面的命 ...
在网络编程中,尽管大部分情况下操作的都是 IP 地址,但现实中需要记忆的却通常是主机名,因此有必要提供将主机名转换为 IP 地址的函数。
不过在介绍这些函数之前,有必要先对主机名作一些说明。
主机名既可以是一个简单名字,如 solaris,也可以是一个全限定域名(Fully Qualified Domain Name, FODN,也称绝对名字),如 solaris.unpbook.com(严格说来,FQDN 必须要以一个点号结尾,以告知 DNS 解析器该名字是全限定的,从而不必搜索解析器自己维护的可能域名列表,不过很多用户往往都省略了结尾的点号)。 ...
Linux 中的作业控制涉及到很多命令,现总结如下。
* jobs:列出所有正在后台运行的作业(不如 ps 命令常用)。这里要注意区分作业和进程的概念。一般作业是被当前 shell 所维护的,而进程则是被系统维护的。一些命令(如 kill、disown 和 wait 等)既可以接受作业号为参数,也可以接受进程号为参数,而另一些命令(如 fg、bg 和 jobs 等)则只能接受作业号为参数。如下面的示例显示了如何使用 kill 命令来终止一个后台作业。
$ sleep 100 &
[1] 1384 # 这里,方括号中的 1 就是作业 ID,13 ...
本文讲解了进程、线程和协程之间的区别,并详细讲解了 Golang 中的协程 goroutine 的实现方式,是一篇不错的博文,值得收藏:https://blog.csdn.net/justaipanda/article/details/44064811。
前提申明,因篇幅有限,本文只介绍跳跃表在 Redis 中的应用,而关于跳跃表的原理性介绍,还请参考其他相关书籍,或参考博文跳跃表 SkipList【数据结构】原理及实现。
跳跃表是一种有序数据结构,它实现了同二分查 ...
字典在 Redis 中的应用相当广泛,如 Redis 的数据库、Hash 类型等的底层实现都用到了字典。
Redis 的字典使用了哈希表,其中可以包含多个哈希表节点,每个节点就保存了字典中的一个键值对。这两者的结构定义分别如下:
typedef struct dictht{
dictEntry **table; // 哈希表节点数组
unsigned long size; // 哈希表节点数组大小
unsigned long sizemask; // 哈希表大小掩码,用于计算索引值,总是等于 size-1
...
Redis 虽说由 C 语言实现,但用户直接操作的字符串绝大多数情况下均非 C 语言中以空字符结尾的字符串,而是一种封装了 C 字符串的称作简单动态字符串(simple dynamic string, SDS)的抽象结构,并将其作为 Redis 的默认字符串表 ...
Bash 所支持的字符串操作的方式多种多样,现记录如下。
1、获取字符串长度:
1)${#string} (“${#*}”和“${#@}”表示的是位置参数的个数。另外,对于数组 arr 而言,“${#arr}”表示的是数组中第一个元素的长度,“${#arr[@]}”和“${#arr[* ]}”表示的是数组中元素的个数)
2) expr length $string
3) expr "$string" : ".*" (注意:“:”两边有空格,下同)
2、字符串开头匹配所给正则表达式的子串的长度:
1) ...
shell 中有很多内建变量,它们会影响到 shell 脚本的行为,所以也有必要知道。
* BASH:表示 Bash 的二进制程序文件的路径。
* BASH_ENV:它会指向一个 Bash 的启动文件,该文件会在一个脚本被调用时读取。
* BASH_SUBSHELL:用来提示子 shell 的层次。
* BASH_VERSINFO[n]:它包含了安装的 Bash 的版本信息,是一个含有 6 个元素的数组,分别代表:主版本号、次版本号、补丁次数、编译版本、发行状态和结构体系。
* BASH_VERSION:Bash 的版本号,它与 $BASH_VER ...
在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 PTY 表现得就像物理终端设备一样,不过在打开 PTY 设备文件时,应用程序并不需要设置 O_TTY_INIT 标识(见不带缓冲的文件I/O之open)。各种平台打开 PTY 设备的方法有所不同,posix_openpt 函数提供了一种可移植的方法来打开下一个可用的伪终端主设备。
#include <stdlib.h>
#include <fcntl.h>
int posix_openpt(int oflag);
/* 返回值:若成功,返回下一个可用的 PTY 主设备的文件描述符;否则, ...
shell 中有很多特殊字符,比如表示转义的“\”、表示命令替换的“`”等,其中有些用得少了就很容易忘记,包括某个字符或是某个功能等的用法。以下是本人自己的备忘录,仅供参考。
1、“:”(冒号):等价于"no op",是一个什么也不干的命令, 同shell 内建命令 true 的作用相同。可用来作命令占位符。具体用法如下。
# 1)用在循环中
while : # 同:while true
do
operation
done
# 2)在 if/then 中的占位符
if condition
then ...
伪终端就是指,一个应用程序看上去像一个终端,但事实上它并不是个真正的终端。下图显示了使用伪终端时相关进程的典型安排。
图中的关键点如下。
1、通常,一个进程打开伪终端主设备,然后调用 fork。子进程建立一个新的会话,打开一个相应的伪终端从设备,并将其文件描述符复制到标准输入、标准输出和标准错误,然后调用 exec。伪终端从设备成为子进程的控制终端。
2、对于伪终端从设备上的用户进程来说,其标准输入、标准输出和标准错误都是终端设备。用户进程可以通过这些描述符来处理类似 tcgetattr 等的终端 I/O 函数。但因为伪终端从设备不是真正的终端设备,所以无意义的 ...
多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的方法。在窗口大小发生变化时,内核就会通知前台进程组。内核为每个终端和伪终端都维护了一个如下的 winsize 结构。
struct winsize{
unsigned short ws_row; // rows, in characters
unsigned short ws_col; // columns, in characters
unsigned short ws_xpixel; // horizontal size, pixels (unused)
...
终端规范模式很简单:发一个读请求,当一行已经输入后,终端驱动程序立即返回。以下几个条件都会造成读返回。
1、所请求的字节数已读到时。此时无需读一个完整的行,如果读了部分行,也不会丢失任何信息,下一次读会从前一次读的停止处开始。
2、当读到一个行定界符时。在终端特殊输入字符一节中已了解到,下列字符在规范模式中会被解释为“行结束”:NL、EOL、EOL2 和 EOF,还有如若已设置 ICRNL,但未设置 IGNCR,则 CR 字符的作用与 NL 字符一样,也会终止一行。
3、如果捕捉到信号,并且该函数不再自动重启,则读也会返回。
下面来看看 getpass 函 ...