随笔分类 -  Linux系统编程笔记

摘要:41.1 概念 41.1.1 条件变量的介绍 互斥锁的缺点是它只有两种状态:锁定和非锁定 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足 条件变量内部是一个等待队列,放置等待的线程,线程在条件变量上等待和通知,互斥锁用来保护等待队列(对等待队列上锁),条件变量通常和互斥锁一 阅读全文
posted @ 2019-01-11 21:57 游戏进行中 阅读(455) 评论(0) 推荐(0)
摘要:40.1 互斥锁 40.1.1 介绍 互斥锁(mutex)是一种简单的加锁的方法来控制对共享资源的访问。 在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行访问。 若其他线程希望上锁一个已经被上了互斥锁的资源,则该线程挂起,直到上锁的线程释放互斥锁为止。 互斥锁的数据类型 阅读全文
posted @ 2019-01-06 20:40 游戏进行中 阅读(1000) 评论(1) 推荐(0)
摘要:39.1 概念 线程同步 是一个宏观概念,在微观上包含线程的相互排斥和线程先后执行的约束问题 解决同步方式 条件变量 线程信号量 线程互斥 线程执行的相互排斥 解决互斥的方式 互斥锁 读写锁 线程信号量 是一个宏观概念,在微观上包含线程的相互排斥和线程先后执行的约束问题 解决同步方式 条件变量 线程 阅读全文
posted @ 2019-01-04 20:20 游戏进行中 阅读(305) 评论(0) 推荐(0)
摘要:38.1 线程属性初始化和销毁 返回值:成功返回 0;否则,返回错误编号 线程属性结构如下: 38.2 设置和获得分离属性 detachstate 取值: PTHREAD_CREATE_JOINABLE(默认值) 正常启动线程 必须调用 pthread_join 才能释放线程占有的资源 PTHREA 阅读全文
posted @ 2019-01-01 20:43 游戏进行中 阅读(1214) 评论(0) 推荐(0)
摘要:37.1 线程清理和控制函数 函数参数 rtn:清理函数指针 arg:调用清理函数传递的参数 execute:值 1 时,执行线程清理函数;值 0 时,不执行线程清理函数 返回值 成功,返回 0;否则,返回错误编号 触发线程调用清理函数的工作 调用 pthread_exit 响应取消请求 用非零 e 阅读全文
posted @ 2019-01-01 18:34 游戏进行中 阅读(470) 评论(0) 推荐(0)
摘要:36.1 线程介绍 36.1.1 线程的基本概念 进程是资源管理的最小单位,线程是程序执行的最小单位 每个进程都有自己的数据段、代码段和堆栈段。 线程通常叫做轻型的进程,它包含独立的栈和 CPU 寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括打开的文件、内存页面、信号 阅读全文
posted @ 2019-01-01 14:40 游戏进行中 阅读(911) 评论(0) 推荐(0)
摘要:35.1 内容 在当前的 minishell 中,如果执行 date clear 命令等,minishell 会停止: 这是因为引入进程组的时候,mshell 放置在前台进程组,同时之后在子进程中又创建了一个进程组,在代码中,第二个进程组在没有将其设置为前台进程组之前,一直是后台进程组。那么后台进程 阅读全文
posted @ 2018-12-30 22:51 游戏进行中 阅读(412) 评论(0) 推荐(0)
摘要:33.1 中断系统调用 进程调用 “慢” 系统调用时,如果发生了信号,内核会重启系统调用。 慢系统调用 可能会永久阻塞的系统调用 从终端设备、管道或网络设备上的文件读取 向上述文件写入 某些设备上的文件打开 pause 和 wait 系统调用 一些设备的 ioctl 操作 一些进程间通信函数 可能会 阅读全文
posted @ 2018-12-30 21:53 游戏进行中 阅读(433) 评论(0) 推荐(0)
摘要:31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它。 避免僵尸进程 31.2 信号发送 除了内核和超级用户,并不是每个进程都可以向其他的进程发送信号 一般的进程只能向具有相同 uid 和 gid 的进程发送信号,或向相同 阅读全文
posted @ 2018-12-30 21:53 游戏进行中 阅读(1475) 评论(0) 推荐(0)
摘要:32.1 不可靠信号问题 发生信号时关联动作被重置为默认设置 信号可能丢失 程序片段 在进入 sig_int 与再次调用 signal 之间发生的 SIGINT 信号将不会捕获 导致进程终止 信号可能丢失 程序片段 在进入 sig_int 与再次调用 signal 之间发生的 SIGINT 信号将不 阅读全文
posted @ 2018-12-30 21:53 游戏进行中 阅读(583) 评论(0) 推荐(0)
摘要:34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略;忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方式(大多数是终止进程)。 进程在调用 exec 函数后,原有信号的捕捉函数失效 子进程的诞生总是继承 阅读全文
posted @ 2018-12-30 21:53 游戏进行中 阅读(598) 评论(0) 推荐(0)
摘要:30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 不可预见 信号有自己的名称和编号 信号和异常处理机制 信号发生的来源 硬件来源:如按下键盘或其他硬件 阅读全文
posted @ 2018-12-30 21:52 游戏进行中 阅读(495) 评论(0) 推荐(0)
摘要:编程内容: 1.完成 echo env export 命令 2.完成前后台进程 3.完成重定向 完整代码如下: 29.1 主函数、通用头文件和Makefile 29.1.1 主函数 mshell_main.c 29.1.2 通用文件 mshell_common.h mshell_common.c 2 阅读全文
posted @ 2018-12-30 21:52 游戏进行中 阅读(362) 评论(0) 推荐(0)
摘要:28.1 介绍 28.1.1 概念 自动接受终端信号的组称为前台进程组 在终端通过 ctrl + c 等动作产生的信号首先被前台进程组接受 在 shell 启动的若干个进程组默认是父进程所在的组为前台进程组 除非是默认,否则都要通过调度才能成为前台进程组 28.1.1 函数 tcgetpgrp 和 阅读全文
posted @ 2018-06-11 21:49 游戏进行中 阅读(1089) 评论(0) 推荐(0)
摘要:27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要等到组中所有的进程结束 进程组的消亡:kill 发送信号给进程组 kill -9 -进程组号 kil 阅读全文
posted @ 2018-06-10 22:06 游戏进行中 阅读(2063) 评论(0) 推荐(0)
摘要:26.1 system 函数 26.1.1 函数说明 system(执行shell 命令)相关函数 fork,execve,waitpid,popen 函数功能:简化 exec 函数 函数说明 system()会调用 fork() 产生子进程,由子进程来调用 /bin/sh -c string 来执 阅读全文
posted @ 2018-06-08 22:43 游戏进行中 阅读(289) 评论(0) 推荐(0)
摘要:25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 main 函数开始执行。因为调用 exec 并不创建新进程,所以前后的进程 ID 并未改变。exec 阅读全文
posted @ 2018-06-08 22:04 游戏进行中 阅读(530) 评论(0) 推荐(0)
摘要:24.1 wait 函数说明 24.1.1 waitpid 等待子进程中断或结束 waitpid(等待子进程中断或结束) 相关函数 wait,fork 函数说明 waitpid() 会暂时停止目前进程的执行,直到有信号来到或子进程结束。 如果在调用 wait() 时子进程已经结束,则 wait()会 阅读全文
posted @ 2018-06-07 22:29 游戏进行中 阅读(825) 评论(0) 推荐(0)
摘要:23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程。。。。 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都是由同一个父进程构建出来 23.1.2 进程链的构建 process_link.c 运行: 执行 p 阅读全文
posted @ 2018-06-06 21:57 游戏进行中 阅读(663) 评论(0) 推荐(0)
摘要:22.2 父子进程操作文件 文件操作由两种模式: IO 系统调用操作文件 标准C IO 操作文件 看代码: 编译运行后,两个文件都生成了。 父进程文件 s.txt 子进程文件 s_fd.txt 系统调用不经过缓存,执行 write 后就直接写进了文件当中,标准IO是写入缓存了。 创建的缓存是在堆当中 阅读全文
posted @ 2018-06-05 22:03 游戏进行中 阅读(195) 评论(0) 推荐(0)