0%

谁?who

.. note::
物是人非事事休,欲语泪先流。
李清照《武陵春·春晚》

知道了我是谁,接下来就要知道谁是谁了。

who将显示谁在登录,显示的内容可能包括用户名、终端登录口,登录的时间等等信息。

官方定义为:

who - show who is logged on

用法为:

1
$ who [OPTION]... [ FILE | ARG1 ARG2 ]

常用的参数为:

  • -q , --count:只显示登入系统的帐号名称和总人数;
  • -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
  • -a, --all:效果为加上 -b -d --login -p -r -t -T -u
  • -b, --boot:上一次系统的重启时间
  • -d, --dead:打印dead进程
  • -H, --heading:打印每一列的表头
  • -q, --count:所有登录的用户名以及用户登录的数量
  • -s, --short:打印USER/LINE/WHEN(默认为这个参数)

默认使用

显示当前登录系统的用户

1
2
3
$ who       
user pts/0 2012-03-02 10:12
user2 pts/1 2012-03-10 09:12

系统的运行时间

这个信息显示系统自上一次重启后的运行时间。

1
2
$ who -b
system boot 2012-02-16 14:05

显示表头信息

使用-H或者--heading可以看到表头信息

1
2
3
4
$ who -H
USER LINE WHEN
user pts/0 2012-03-02 10:12
user2 pts/1 2012-03-10 09:12

显示登录的人员及总数

1
2
3
$ who -q
user1 user1 user2 user2 user3 user4
# users=6

红帽系的软件管理利器 - yum

.. note::
当年不肯嫁春风,无端却被秋风误。
贺铸《芳心苦·杨柳回塘》

我从ubuntu开始,后面短暂切换到Fedora,然后切换到CentOS,在CentOS断更之前,再无改变,所以最了解的还是yum命令了。

官方定义为:

yum - Yellowdog Updater Modified

说实话,yum跟yellowdog感觉半毛线关系都没有,那为什么有这个名字呢?

其实曾经有一个基于PowerPC架构的Linux发行版,名为Yellow Dog Linux。

yum的名字即来源于此,且为其改进版本。

yum是一个强大的包管理工具,常用于 Red Hat 系的 Linux 发行版,如 CentOS、Fedora 和 RHEL。

它简化了安装、更新、删除和管理软件包的过程。

基本其他基于RPM的Linux发行版也使用这个命令。

其他列出了一些常用和不太常用的命令,基本足矣。

安装软件包

使用 yum 安装软件包的基本语法是:

1
$ sudo yum install package_name

例如,要安装 wget 软件包,可以使用以下命令:

1
$ sudo yum install wget

yum 会自动解决依赖关系,确保所有必需的软件包都被安装。

更新软件包

保持系统更新对于安全性和性能非常重要。要更新特定的软件包,使用:

1
$ sudo yum update package_name

例如,更新 wget

1
$ sudo yum update wget

要更新所有已安装的软件包,只需运行:

1
$ sudo yum update

删除软件包

如果需要删除一个软件包,语法如下:

1
$ sudo yum remove package_name

例如,删除 wget

1
$ sudo yum remove wget

yum 将处理指定软件包的删除,并删除不再需要的依赖项。

检查可用更新

要检查是否有可用更新而不实际应用它们,使用:

1
$ yum check-update

此命令会列出所有有可用更新的软件包,帮助您决定哪些需要更新。

列出已安装的软件包

要列出系统上所有已安装的软件包,运行:

1
$ yum list installed

此命令提供了当前已安装的所有软件包的详细列表。

搜索软件包

如果不确定软件包的确切名称,可以使用:

1
$ yum search keyword

例如,搜索与 wget 相关的软件包:

1
$ yum search wget

此命令会返回与关键字匹配的软件包列表。

显示软件包信息

要查看特定软件包的详细信息,使用:

1
$ yum info package_name

例如,获取 wget 的信息:

1
$ yum info wget

此命令提供软件包的详细信息,如版本、发布、大小和简短描述。

清理 yum 缓存

随着时间推移,yum 的缓存会增长并占用磁盘空间。要清理缓存,使用:

1
$ sudo yum clean all

此命令会删除缓存数据,释放空间,并确保 yum 获取最新的软件包信息。

管理仓库

yum 使用仓库作为软件包的来源。要列出所有配置的仓库,运行:

1
$ yum repolist

启用特定仓库:

1
$ sudo yum-config-manager --enable repository_name

禁用特定仓库:

1
$ sudo yum-config-manager --disable repository_name

高级用法

安装特定版本的软件包

如果需要安装特定版本的软件包,使用:

1
$ sudo yum install package_name-version

例如,安装 wget1.20 版本:

1
$ sudo yum install wget-1.20

降级软件包

要将软件包降级到以前的版本,使用:

1
$ sudo yum downgrade package_name

组安装

yum 允许您安装为特定目的而设计的一组软件包。例如,安装开发工具组,使用:

1
$ sudo yum groupinstall "Development Tools"

空指针

  • 所谓的空指针就是表示“未分配”或者“尚未指向任何地方”的“特殊”指针;
  • 在源码中用来表示空指针的空指针常量使用整数0,且在很多机器上都在内部采用所有位都是0的字来表示空指针,但C语言不保证第二点;
  • 空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数,而未初始化的指针则可能指向任何地方;
  • 根据语言定义,在指针上下文中的“值为0的整型常量表达式”会在编译时转换为空指针,但是,传入函数的参数不一定被当做指针上下文。所以,在函数调用时对所有的空指针进行类型转换可能是防止可变参数和无原型函数出问题的最安全的方法;
  • 为了让程序中的空指针使用更加明确,特意定义了一个标准预处理宏NULL,其值为空指针常量;
  • 在有些编译器头文件中定义NULL为0L,是因为在有些机器上指针比整型大,比如large模式的PC兼容机上;
  • 关于空指针,有两条规则必须遵循:
  • 当在源码中需要空指针常量时,用“0”或“NULL”;

如果在函数调用中“0”或“NULL”用作参数,把它转换成被调函数需要的指针类型即可;

标准函数库

算术

求商和余数的函数div

字符串转换

函数atoiatol执行基数为10的转换;

而函数strtolstrtoul允许你在转化时指定基数,同时还允许访问字符串的剩余部分。

浮点表示形式

函数modf把一个浮点值分成整数和小数两个部分。

非本地跳转

setjmplongjmp函数提供了一种类似goto语句的机制,但它并不局限于一个函数的作用域之内。这些函数常用于深层嵌套的函数调用链。

信号

信号表示一种事件,它可能异步地发生,也就是并不予程序执行过程的任何时间同步。

信号处理函数

由于信号可能在任何时候发生,所以由信号处理函数修改的变量的值可能会在任何时候发生改变。因此,我们不能指望这些变量在两条相邻的程序语句中肯定具有相同的值。volatile关键字告诉编译器这个事实,防止它以一种可能修改程序含义的方式“优化”程序。

通常情况下,上面的程序会认为第二个测试和第一个测试具有相同的结果

而如果把变量value声明为volatile类型的,就不会进行此类优化。
有时,如果不用volatile修饰符,可能无法编写多线程程序,要么编译器失去大量优化的机会。

终止执行

  • abort函数用于不正常地终止一个正在执行的程序;
  • atexit函数可以把一些函数注册为退出函数exit function;
  • exit函数用于正常终止程序;

断言

assert(test)用于检测test是否为真。用这种方法可以使调试变得更容易。并且我们可以在头文件assert.h被包含之前,添加#define NDEBUG皆可以禁用所有的断言。
总结

  • frexpldexp函数在创建与机器无关的浮点数表示形式方面是很有用的。frexp函数用于计算一个给定值的表示形式;ldexp函数用于解释一个表示形式,恢复它的原先值;
  • qsort函数把一个数组中的值按照升序进行排序;
  • bsearch函数用于在一个已经排好序的数组中用二分法查找一个特定的值;
  • locale就是一组函数,根据世界各国的约定差异对C程序的行为进行调整;
  • 使用setjmplongjmp可能导致晦涩难懂的代码;
  • 使用断言可以简化程序的调试;

Vim 记录和使用宏

该技巧使用一个例子来解释在Vim中如何执行记录和使用宏。

前面几步用于在vim中记录和使用宏。

  1. 第一步:键入q开始记录宏,后面跟小写字符是宏的名称。
  2. 第二步:在Vim编辑器中执行任何类型的编辑操作,它们将会被记录。
  3. 第三步:按下q停止记录宏。
  4. 第四步:通过按下@后面跟宏名称来使用记录的宏。
  5. 第五步:为了多次重复宏,按下NN@宏名,NN为重复次数

工作模式

vi编辑器有3种基本工作模式,分别是命令模式、插入模式和可视模式。在使用时,一般将可视模式也算入命令行模式。各模式的功能区分如下。

命令行模式

控制屏幕光标的移动,字符、字或行的删除,移动、复制某区域及进入插入模式,或者到末行模式。

插入模式

只有在插入模式下才可以做文本输入,按“ESC”键可回到命令行模式。

可视模式

将文件保存或退出vi编辑器,也可以设置编辑环境,如寻找字符串、列出行号等

为什么使用Vim

其实只要试用一下Final_Vim就知道为什么了。

跨平台性

无论在Windows,Linux, Solaris, FreeBSD等等操作系统上,以及一些名都 没有听过的系统上,你都可以找到它。这样就保证了你的学习投资的保值性,特别在一些古老的大型机上的系统上,即使没有Vim,一般来说,还有Vi的,这样一般简单的操作命令还是可复用的。如果你确定你一直只呆在Windows上可忽略这一点。

开源免费

Vim是开源软件,意味着你可以自由使用,修改,查看它的代码。对于自由查看,修改程序代的保证,有总比没有好。

支持多种编程语言

Vim是程序员的编辑器,当然对程序员是非常友好的。它对 C,C++, Python, Perl, Tcl, Ruby, PHP等等,以及一大堆我没有听过见过的语言,以语法着色,代码缩进等基本支持,还有一些其他特性。

高效地编辑

Vim的操作方式相对于Windows上呆久了的人来说,是蛮奇特的,这一点我深有体会。但是正如很多人讲的那样,你掌握了其操作后,发现它会大大增进你的编辑速度。你的双手根本不用离开键盘,就完成了许多事情,可以让鼠标歇会儿了。

灵活的设置

vim可自定义的地方太多了,你可以自定义键盘映射,语法着色,缩进,格式等等。所以你在网上可以看到许多人贴着自己的vimrc配置文件,配置自己喜欢的作业环境。如果你需要开盒即用的工具,那么这点对你的吸引力就不大了。

动态内存分配

为什么使用动态内存分配

比如,我们计算年级学生的平均成绩,但是不知道有多少学生,可以定义一个很大的数组,确保学生个数不会超出数组定义范围,但是如果学生人数很少,就会造成巨大的浪费。所以会有如下缺点:

  • 数组声明中引入了人为的限制,如果程序需要使用的元素数量超过了声明的长度,它就无法处理这种情况;
  • 要避免上述情况,需要把数组声明的更大些,但这也导致如果元素数据比较少时,巨型数组的绝大部分内存空间都浪费了;
  • 如果输入的数据超过了数组的容纳范围,程序必须以一种合理的方式作出响应,而不应该由于一个异常而失败,也不应该打印出看上去正确但实际上错误的结果。

malloc和free

c函数库提供了两个函数,malloc和free,分别用于执行内存分配和释放。这些函数维护一个可用内存池。当一个程序另外需要一些内存时,它就调用malloc函数,malloc从内存池中提取一块合适的内存,并向该程序放回一个指向这块内存的指针。注意,现在这块内存并没有以任何方式进行初始化。

free的参数要么是NULL,要么是一个先前从malloc、calloc或realloc返回的值。向free传递一个NULL参数不会产生任何效果。

And我们知道malloc的返回值为void *,所以malloc可以指向任何类型的整数、浮点值、结构或者数组,这个需要我们自己定义。

calloc和realloc

malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。这个初始化常常能带来方便,但是如果你的程序只是想把一些值存储到数组中,那么这个初始化过程就纯属浪费时间;两者的另外一个较小的区别是它们请求内存数量的方式不同,calloc的参数包括所需元素的数量和每个元素的字节数。

realloc函数用于修改一个原先已经分配的内存块的大小。如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。

如果realloc函数的第一个参数是NULL,那么它的行为就和malloc一摸一样。

常见的动态内存错误

使用动态内存常犯的错误就是忘记检查所请求的内存是否成功分配?第二大错误是操作内存时超出了分配内存的边界。

分配内存但在使用完毕后如果不释放将引起内存泄露memory leak。

内存分配实例

动态内存分配一个常见的用途就是为那些长度在运行时才知的数组分配内存空间。

总结

  • 当数组被声明时,必须在编译时知道它的长度。动态内存分配允许程序为一个长度在运行时才知道的数组分配内存空间;
  • 动态内存分配时必须判断返回值是否为NULL;
  • 动态内存分配有助于消除程序内部存在的限制;
  • 使用sizeof计算数据类型的长度,可以提高程序的可移植性。

字符串、字符和字节

查找任何几个字符

strpbrk:

用法:#include <string.h>

功能:依次检验字符串s1中的字符,当被检验字符在字符串s2中也包含时,则停止检验,并返回该字符位置,空字符NULL不包括在内。

说明:返回s1中第一个满足条件的字符的指针,如果没有匹配字符则返回空指针NULL。

用途:在源字符串(s1)中找出最先含有搜索字符串(s2)中任一字符的位置并返回,若找不到则返回空指针。

   原型:extern char \*strpbrk(char \*s1, char \*s2);

查找一个字符串前缀

strspn(返回字符串中第一个不在指定字符串中出现的字符下标)
表头文件 #include<string.h>
定义函数 size_t strspn (const char *s,const char * accept);
函数说明 strspn()从参数s 字符串的开头计算连续的字符,而这些字符都完全是accept 所指字符串中的字符。简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。
返回值 返回字符串s开头连续包含字符串accept内的字符数目。

查找标记

原型
char *strtok(char s[], const char *delim);
功能
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
注意:
由于strtok函数保存它所处理的函数的局部状态信息,所以你不能用该函数同时解析两个字符串。

内存操作

mem***函数提供了类似字符串函数的能力,但是它们可以处理包括NUL字节在内的任意字节。

编译运行第一个C++程序

编写好程序后,接下来需要做的就是进行编译,让操作系统懂得程序要做什么,然后再运行,假定在Linux系统上,那么大部分的编译可以从2个方向来进行:

  1. 通过命令行直接编译
  2. 通过IDE集成开发环境来编译

现在暂时不涉及IDE,所以我们从命令行来编译。

从上次的helloworld.cpp来进行描述。

此时打开终端,直接输入如下命令:

1
$ gcc helloworld.cpp

gcc可以是g++,或者cc,这个命令的含义为:

gcc - GNU project C and C++ compiler

编译以后会默认生成一个a.out的文件,如下:

1
2
3
$ ls -lh
-rwxrwxrwx 1 leo leo 17K Wed 22 2215:42 a.out
-rwxrwxrwx 1 leo leo 31 Wed 22 22:20 helloworld.cpp

此时开始来执行这个程序,对于Linux而言,如果终端的路径在当前目录,那么此时使用如下命令:

1
$ ./a.out

其中.后跟一个斜线表示可执行文件为当前目录