1.sleep(3)用man查看的命令:man 3 sleep
2.指数补偿算法,在每次迭代中等待更长的时间。
3.文件系统中记录了每个文件所有者的用户id和组id,open()时根据这些信息判断是否有权限。
4.信号的处理:忽略、按照系统默认方式、自定义方式处理。Ctrl+C命令就是向进程发送信号的方式停止软件运行的。
5.系统调用与库函数:系统调用是核心的,内核层提供的,一般不可替换。库函数则调用system call,是可被替换的。
6.时钟时间,用户CPU时间和系统CPU时间(内核执行的时间)
7.进程执行exit退出,先调用各个终止处理函数,再关闭(fclose)所有打开流。
8.alloca:在栈上分配空间,不需要手动free。
9.echo $? :返回上一个可执行程序的返回值。
10.内核交换进程的id为0,故fork的子进程的id不可能为0
1.僵死进程:子进程终止,但父进程未对其做善后处理(调用wait()),如获取终止子进程的有关信息、释放子进程占用的资源。
2.fork子进程后,也会复制父进程的文件描述符,CLOEXEC标志可令这些文件描述符,在执行EXEC后关闭,以避免处理文件描述符的繁琐。
3.多线程中fork子进程,只复制当前线程到子进程。
4.fork两次以避免僵死进程,父进程死亡后,子进程将由init接管,init在子进程死亡后,会自动调用wait,获取子进程有关信息。
1.解释器和解释器文件
1.管道和FIFO的原子读写最大数据量由系统的PIPE_BUF决定,超过的字节数就不能保证原子性。
2.FIFO是一种文件类型,先创建文件mkfifo,再open,再读写。
3.每个内核中的IPC结构(消息队列、信号量和共享存储段)都用一个非负整数的标识符(identifier)加以引用。
4.消息队列存储在内核中,不使用文件系统描述符,不能通过ls等命令查看。消息队列中的内容如果没有被引用或者清掉,消息队列及其内容会保存在系统中。因此不建议使用消息队列功能。
1.信号量、互斥量
2./dev/zero 匿名存储映射
3.POSIX信号量:命名信号量(sem_open、适用多进程)、未命名信号量(sem_init、适用同一进程的多线程)
1.sem_unlink : sem_open,创建一个信号量后,执行sem_unlink来断开连接,可以减少关闭进程时候的清理工作。
2.掌握管道、FIFO,尽可能避免信号量和消息队列,考虑全双工管道和记录锁。
3.字节序,与处理器架构特性有关
1.回收将释放所有线程终止时未释放的系统和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器状态的内存空间等。线程终止后,上述资源就不能再访问了。线程终止后,线程ID就不能再被使用了。
2.只有动态初始化的mutex才需要调用phtread_mutex_destroy来释放,以PTHREAD_MUTEX_INITIALIZER宏静态初始化的变量不需要释放;
3.智慧来源于经验,经验来源于缺少智慧;
4.任何条件变量同一时刻只能与一个互斥量相关联,而一个互斥量可以与多个条件变量关联。