linux
Coulson的博客
这个作者很懒,什么都没留下…
展开
-
管道与查找
ps -ef | grep redis-clips ,即process status,显示进程状态信息,参数-e代表显示全部进程,-f代表显示进程之间的关系|, 管道命令grep ,即global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,...转载 2019-04-26 08:04:17 · 504 阅读 · 0 评论 -
用数组名作函数参数
关于用数组名作函数参数有两点要说明:(1) 如果函数实参是数组名,形参也应为数组名(或指针变量),形参不能声明为普通变量(如int array;)。实参数组与形参数组类型应一致(现都为int型),如不一致,结果将出错。(2) 需要特别说明的是: 数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数实参时,不是把实参数组的值传递给形参,而只是将实参数组首元素的地址传递给形参。...原创 2019-05-31 18:46:10 · 13060 阅读 · 0 评论 -
Linux 共享库命名规则
linux 里面共享库总是存在很多链接文件lrwxrwxrwx. 1 root root 24 Aug 19 2017 libavahi-client.so.3 -> libavahi-client.so.3.2.9-rwxr-xr-x. 1 root root 69968 Nov 5 2016 libavahi-client.so.3.2.9lrwxrwx...原创 2019-05-31 18:45:19 · 952 阅读 · 0 评论 -
静态库和共享库(动态链接库)的区别
1 静态库在共享库出现之前,公用功能是以静态库的形式存在的,它把通用功能模块的多个目标文件打包在一起,用到它的程序只需要在链接时指定这个库文件,链接器就会从这个库中抽取出用到的功能代码拷贝到目标程序中,而不需要每次都对这些通用功能代码重新编译。静态库体现出了很好的模块化思想,但是随着计算机产业规模的发展,静态库逐渐暴露出了自身两个比较严重的问题。一是磁盘和内存空间占用大。静态库虽然加快了编...原创 2019-05-31 18:44:41 · 4371 阅读 · 0 评论 -
进程内存布局
进程访问的地址是自己进程空间内的线性地址,内核负责把线性地址映射为实际的物理地址。操作系统以内存页为单位管理物理内存。在 Linux 中,默认的内存分页大小是 4KB,也就是说,操作系统把物理内存分割成一个个大小为 4KB 的格子,进而管理它们,内存的换入换出也以这样的格子为基本单位。在每个进程的内核数据结构中,都会维护一个内存页表,记录线性地址到物理内存页的映射关系。...原创 2019-05-31 18:43:54 · 151 阅读 · 0 评论 -
pthread线程库函数
所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。1 创建线程创建线程的函数如下:int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void...原创 2019-05-31 18:43:14 · 2611 阅读 · 0 评论 -
线程的连接和分离
新创建的线程和进程一样,也需要被连接以监听其退出状态,否则也会变成僵尸线程。背后原因与进程一样,其退出之后,内核会为它保留退出状态数据,直到有人取走为止。连接线程的库函数如下所示:int pthread_join(pthread_t thread, void **retval);进程连接与线程连接在以下几个方面存在一些区别:任何线程都可以监听一个指定线程的退出,而不需要是创建该线程的线程...原创 2019-05-31 18:41:44 · 1692 阅读 · 0 评论 -
线程同步与互斥锁
相比多进程模型,多线程模型最大的优势在于数据共享非常方便,同一进程内的多个线程可以使用相同的地址值访问同一块内存数据。但是,当多个线程对同一块内存数据执行“读−处理−更新”操作时,会由于线程的交叉执行而造成数据的错误。例如以下代码段,当 thread_func() 同时在多个线程中执行时,更新到 glob_value 中的值就会互相干扰,产生错误结果。#define LOOP_COUNT ...原创 2019-05-31 18:41:00 · 574 阅读 · 0 评论 -
进程的终止
正常终止一个进程可以用 _exit 系统调用来实现,原型为:void _exit(int status);其中的 status 会返回 wait() 类的系统调用。进程退出时会清理掉该进程占用的所有系统资源,包括关闭打开的文件描述符、释放持有的文件锁和内存锁、取消内存映射等,还会给一些子进程发送信号(后面课程再详细展开)。该系统调用一定会成功,永远不会返回。在退出之前,还希望做一些个性化的...原创 2019-05-31 18:39:11 · 515 阅读 · 0 评论 -
监控子进程状态
在 Linux 应用中,父进程需要监控其创建的所有子进程的退出状态,可以通过如下几个系统调用来实现。pid_t wait(int * statua)一直阻塞地等待任意一个子进程退出,返回值为退出的子进程的 ID,status 中包含子进程设置的退出标志。pid_t waitpid(pid_t pid, int * status, int options)可以用 pid 参数指定要等待的...转载 2019-04-26 08:11:13 · 1209 阅读 · 0 评论 -
fexecve() 系统调用
glibc 从 2.3.2 版本开始提供 fexecv() 函数,它与 execve() 的区别在于,第一个参数使用的是打开的文件描述符,而非文件路径名。增加这个函数是为了满足这样的应用需求:有些应用在执行某个程序文件之前,需要先打开文件验证文件内容的校验和,确保文件内容没有被恶意修改过。在这种情景下,使用 fexecve 是更加安全的方案。组合使用 open() 和 execve() 虽然可...转载 2019-04-26 08:10:41 · 1177 阅读 · 0 评论 -
execve() 系统调用
execve() 系统调用的作用是运行另外一个指定的程序。它会把新程序加载到当前进程的内存空间内,当前的进程会被丢弃,它的堆、栈和所有的段数据都会被新进程相应的部分代替,然后会从新程序的初始化代码和 main 函数开始运行。同时,进程的 ID 将保持不变。execve() 系统调用通常与 fork() 系统调用配合使用。从一个进程中启动另一个程序时,通常是先 fork() 一个子进程,然后在子进...转载 2019-04-26 08:10:19 · 6245 阅读 · 0 评论 -
fork() 系统调用
fork() 系统调用将创建一个与父进程几乎一样的新进程,之后继续执行下面的指令。程序可以根据 fork() 的返回值,确定当前处于父进程中,还是子进程中——在父进程中,返回值为新创建子进程的进程 ID,在子进程中,返回值是 0。一些使用多进程模型的服务器程序(比如 sshd),就是通过 fork() 系统调用来实现的,每当新用户接入时,系统就会专门创建一个新进程,来服务该用户。fork() 系...转载 2019-04-26 08:09:52 · 4353 阅读 · 0 评论 -
强行修改const只读变量
修改const只读变量,只能修改局部常量,不能修改全局静态常量。例如:// 某函数内部const int const_value = 100;int * ptr = (int *)&const_value;*ptr = 200;因为在函数内部声明的 const_value,其本质上还是一个函数内的局部变量,存储区在该函数的栈帧内,而程序对该内存区拥有修改的权限。相应地,用同...转载 2019-04-26 08:09:12 · 1839 阅读 · 0 评论 -
errno 的多线程问题
思考一个问题,每个系统调用失败后都会设置 errno,如果在多线程程序中,不同线程中的系统调用设置的 errno 会不会互相干扰呢?如果 errno 是一个全局变量,答案是肯定的。如果真是这样的话,那系统调用的局限性也就太大了,总不能在每个系统调用之前都加锁保护吧。优秀的 Linux 肯定不会这么弱,那么,这个 errno 的问题又是怎么解决的呢?根据 man 手册,要使用 errno,首先需...转载 2019-04-26 08:08:32 · 3620 阅读 · 0 评论 -
系统调用 错误处理函数
1 perrorperror函数是用来打印错误提示信息的,原型是:#include <stdio.h>void perror(const char *s);它先打印s指向的字符串,然后输出当前errno值所对应的错误提示信息,例如当前errno若为12,调用perror(“ABC”),会输出"ABC: Cannot allocate memory"。测试程序:#inclu...转载 2019-04-26 08:07:28 · 386 阅读 · 0 评论 -
系统调用的标准使用方法
系统调用,一般是指 glibc 中的包装函数。这些函数会在执行系统调用前设置寄存器的状态,并仔细检查输入参数的有效性。系统调用执行完成后,会从 EAX 寄存器中获取内核代码执行结果。内核执行系统调用时,一旦发生错误,便将 EAX 设置为一个负整数,包装函数随之将这个负数去掉符号后,放置到一个全局的 errno 中,并返回 −1。若没有发生错误,EAX 将被设置为 0,包装函数获取该值后,并返回 ...转载 2019-04-26 08:06:24 · 358 阅读 · 0 评论 -
linux系统调用错误码 errno
为防止和正常的返回值混淆,系统调用并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中。如果一个系统调用失败,你可以读出errno的值来确定问题所在。errno不同数值所代表的错误消息定义在errno.h中,你也可以通过命令"man 3 errno"来查看它们。需要注意的是,errno的值只在函数发生错误时设置,如果函数不发生错误,errno的值就无定义,并不会被置为0。另外,在...转载 2019-04-26 08:05:27 · 4230 阅读 · 0 评论 -
浮点数比较大小
float 类型不能比较相等或不等,但可以比较>,<,>=,<=用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用 if (fabs(price - p) < 0.000001)来代替 if...原创 2019-05-31 18:46:57 · 9520 阅读 · 1 评论