随笔分类 - Linux系统编程
摘要:问题 一段老代码,两个线程,一个线程调用sem_wait等待信号量,另外一个线程在某失败分支会调用sem_init清信号量,结果导致sem_wait线程无法被唤醒; 分析 Linux manpage 从描述中可见,初始化一个已经被初始化的信号量会导致未定义行为; 1 NAME 2 sem_init
阅读全文
摘要:问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性;铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用msync进行同步,最后使用munmap解映射; 然而,当我运行这段程序的时候,发现msync的MS_
阅读全文
摘要:疑问 两个线程分别有不同的调度策略,一个SCHED_FIFO,一个SCHED_OTHER,按照之前的理解,SCHED_FIFO实时线程一定会占用CPU一直运行,导致SCHED_OTHER的普通线程得不到CPU,事实是这样么? 验证 写了一小段代码,一个是验证SCHED_FIFO的高优先级线程会不会抢
阅读全文
摘要:先抱怨一波,大国庆节的放假前一天的下班前15分钟,通知让我加班,因为一个Redis的bug,而这个bug我在1个半小时之前刚听说了个大概,心里很不情愿; 好了,说正事; 问题现象: bug是这样的,两个线程同时请求Redis服务器,但是只有一个线程收到了回复,另一个线程卡死; 拿到这个问题,我先是想
阅读全文
摘要:前几天测试软件在多核上的性能,需要按照比例吃各个CPU,查了查资料,撸了下面一小段代码; 1 #include <unistd.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <time.h> 5 6 #define __USE_GN
阅读全文
摘要:即使pthead_cond_wait()和pthread_cond_timewait()没有错误返回,等待的条件也可能是假的;即使pthread_cond_timewait()返回了超时错误,关联的条件也可能是真的;因为超时和条件改变之间有时间窗口; 在有些实现中,特别是多处理器环境,信号唤醒可能会
阅读全文
摘要:在main中创建线程,我们称main线程为主线程,新建线程为子线程(其实没有什么主线程和子线程的父子概念,它们是平行的,为了好理解这样称呼),如果子线程内部执行相对比较耗时的操作,主线程执行的快,而且没有等待子线程执行完毕,此时主线程退出,进程被销毁,就会导致子线程无法执行完毕; 可以采用如下方式确
阅读全文
摘要:在信号产生和传递之间有一段时间间隔,称为信号是未决的; 进程可以设置阻塞信号传递;如果进程产生了一个阻塞的信号,并且对该信号的动作是系统默认或者捕捉该信号,则该进程保持此信号为未决状态,直到该进程对此信号接触阻塞,或者将对该信号的动作改为忽略;内核在传递一个原来被阻塞的信号给进程时(而不是产生该信号
阅读全文
摘要:SIGCHLD信号是当子进程终止时向父进程发送的信号;它的语义如下: 如果进程明确的将该信号设置为SIG_IGN,则调用进程不会产生僵尸进程;这种情况下,wait是等不到给子进程收尸的,所以wait阻塞到所有子进程终止后,返回-1,并且将errno设置为ECHILD; 如果进程没有明确的设置捕获该信
阅读全文
摘要:重入时间点 进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就会被信号处理程序临时中断,它首先执行该信号粗合理程序中的指令;如果从信号处理程序返回,则继续执行捕捉到信号时进程正在执行的正常指令序列; ps:如果了解驱动,上面这段信号打断流程与中断打断进程上下文很类似; 不可重入函数 对于有
阅读全文
摘要:如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行;该系统调用返回出错,其errno设置为EINTR; 系统将系统调用分成两类:低速系统调用和其他系统调用;低速系统调用是可能会使进程永远阻塞的一类系统调用,包括: 1. 如果某类型文件(如读管道,终端设备,网
阅读全文
摘要:下面这几个函数定义,每次看到都会纠结一阵子,奇怪的是为什么没有参数? 1 #define SIG_ERR (void (*)())-1 2 #define SIG_DFL (void (*)())0 3 #define SIG_IGN (void (*)())1 函数signal的回调明明是下面这样
阅读全文
摘要:进程: 是系统中一段程序执行的实体,也是资源分配和调度的基本单位; 进程组: 为了方便管理多个进程,可以将多个进程加入到一个进程组内; 每个进程都属于一个进程组,但是同一个进程组内可以有多个进程; 每个进程组有一个组长ID,进程组ID等于其进程ID; 进程组的存在周期与组长无关,即使进程组长已经停止
阅读全文
摘要:link–用于创建一个现有文件的链接;实际上是新建一个目录项,指向当前文件的i节点; unlink–用于删除一个现有文件的连接;实际上是对引用i节点的目录项进行删除,并且对链接计数-1;系统会检查文件被进程的引用计数(如被进程打开,引用计数会+1,关闭则-1),如果该引用计数为0,并且链接计数为0,
阅读全文
摘要:umask函数设置当前进程的权限为屏蔽字;系统会有一个默认的屏蔽字,为了确保创建文件具有的权限位成功被设置,需要使用umask将屏蔽字置0; 系统屏蔽字用shell查看,比如得到如下结果,其为八进制表示形式,以0开头;这个屏蔽字表示屏蔽掉了组的写和其他的写权限; 1 0022 下面的例子很好的说明了
阅读全文
摘要:文件,目录,权限 1. 用名称打开任一个类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限;这就是目录执行权限通常被称为搜索位的原因; 例如:为了打开文件/usr/include/stdio.h,需要对目录/、/usr、/usr/include具有执行权限;而具
阅读全文
摘要:fcntl(File Control)-文件控制 ioctl(In/Out Control)-I/O控制 1. fcntl作用于文件,提供对文件的基础控制;ioctl作用于文件和设备对象,一般用来向设备发送命令,或者控制设备属性; 2. fcntl是系统预先定义好的命令选项,不能自定义;ioctl可
阅读全文
摘要:下图为调用dup之后的文件指针状态,包含如下信息: 1. dup选择了一个最小的未使用的描述符3; 2. dup(1)之后,描述符1和描述符3指向同一个文件表项; 3. dup(1)的返回值即为复制得到的描述符3; 4. 补充dup2,dup2可以指定复制的目标描述符,如果该描述符与被复制的描述符相
阅读全文
摘要:返回值: 成功返回读到的字节数,如果达到文件尾,则返回0;注意:如果有数据第一次读取会返回全部读到的字节数,下一次读取才会返回0; 出错返回-1; 返回值少于要求读取字节数的情况: 1. 读取普通文件时,在读到要去字节数之前达到了文件尾,如:在达到文件尾之前有30个字节,而要求读取100个字节,则r
阅读全文
摘要:lseek使用的注意事项: 1. lseek的返回值,成功返回新的文件偏移量,失败返回-1,不能用<0判断;因为文件偏移量可能是正的,也可能是负的,所以不能使用<0判断成功与否;注意:对于普通文件,偏移量必须是非负的;但比如Intel x86处理器上运行的FreeBSD设备/dev/kmem就支持负
阅读全文