




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、自我介绍:彭 =课程概要= 1进程以及进程间的通信 2. 线程和线程间的通信 =进程= 1进程的相关概念 打开程序-linux中把正在运行的程序称作进程 程序:静态的概念,它是一个编译好的二进制文件 进程:动态的概念,当程序运行的时候,系统会自动运行一个对应进程 进程包含了进程控制块(PCB),代码段,数据段三个部分 进程控制块:在linux中是用一个结构体来表示的 僵尸进程:父进程优先于子进程退岀 如果你创建了子进程,但是在父进程中没有回收该子进程的资源,那么 该子进程就会变成僵尸进程,僵尸进程最终会由系统中一个叫做INIT的进程回收 init进程(1号进程)是系统启动的时候运行的第一个进程
2、,它是所有进程的祖进 程 /usr/src/linux-headers-3.5.0-23-generic/include/linux/sched.h 1229 行 task_struct 它是用来保存进程运行时的状态信息 top查看动态的进程信息 ps -ef査看进程的详细信息 pstree以树状的形式显示进程的信息 2. 进程的接口函数分析 (1) 进程的创建 fork ( )、vfork () 新建的进程称作子进程,它复制了父进程的所有资源,父子进程谁先谁后 是不确定。 #include pid_t fork(void); 返回值: 0表示处于父进程中这个时候的返回值就是子进程 进程id号
3、 =0表示处于子进程中 0创建进程出错 父述程 fork () 1复制了父送程的所有代码: 加上自号:printf ( nI am in child4) printfCI am fathern) =? 在使月fork(.之至 printfCIam return father j玄句送已经运行左了 printf(*I am exit*)、 它处于限制条件中孰走 my p id大于呵会遍出 cpu在湄庚算法的控制下,在父 子总程之同来回切换.谁抢到了 cpu的时闾就执行i隹的代码时 间片到了以后自动将cpu资源让 个其它的进程 vfork ()子进程共享了父进程的所有资源,它一定是子进程先运行,然
4、后才是父进程 运行(即使你加上sleep ()人为去干扰也是没有用的) 注意:(1)子进程中使用了 exit ()跟没有使用结果完全不一样 父子进程中是否使用sleep ()人为的让出cpu时间片也是不一样的 父进程中是否使用wait (), waitpid ()结果也是不一样的 (2) 进程的退出 exit ()、_exit() #include void exit(int status); exit (10 ) status -进程退出时的状态 status在实际编写程序中是可以自己约定的: 比如:exit (2) -出现打开文件错误 exit (3)-)出现段错误(逻辑错误) exit
5、(0)正常退岀 exit ()在退岀的时候会刷新10缓冲区,然后才退岀(负责任的退出) _exit()直接退出(不负责任的退出) (3) 等待子进程退出wait ()x waitpid () #include pid_t wait(int *stat_loc); 返回值:你回收的那个子进程的id号 参数:stat_loc -子进程退出时的状态信息(不仅仅只是返回值) statjoc里而不仅仅只是保存了 exit退出时的数值,它还保 存了子进程退岀时是哪个信号让它退出的,岀错了是什么原因导致的 宏 含义 WIFEXHED(status) 如果子进程正常退出,则该宏为克。 VYEXITSTATUS
6、(status) 如來了进程正常退出,则该宏将茨取了迸程的退出值。 WIFSIGNALED(status) 如果子进程被信号杀死,则该宏为真。 WTERMSIG(status) 如果子进程被信号杀死,则该宏将获取导致他死亡的佶号值。 WCOREDUMP(status) 如果子进程枝信号杀死且生成核心转储文件(core dump), 则该宏为真. WIFSTOPPED(status) 如果子进程的被佶号暂停且option中WUNTRACED已经 被设置时.则该宏为克. WSTOPSIG(status) 如果WIFSTOPPED(status)为直.则该左将获取导致子进 程暂停的信号值。 WIFC
7、ONnNUED(status) 如果子进程被信号SIGCONT重新苣为就绪态,该宏为真。 表5-5理子进程退出状态值的宏 pid_t waitpid(pid_t pid, int *statjoc, int options);回收子进程/进程组 参数:pid 你指定要回收的那个子进程的id pid-l等待进程组号为pid中的某个子进程退 出-1等待任意一个子进程 pid二0等待本进程组中的某个子进程退岀 options -4 一般设置为0 WCONTINUED 见资源中 ppt WN0HANG WUNTRACED (4) 获取进程的id 获取自己的id getpid () #inelude p
8、id_t getpid(void);返回值:就是该进程的id号 获取父进程id getppid () #include vunistd.h pid_t getppid(void);返回值:就是父进程的id号 练习:在父进程中创建两个子进程,一个子进程每个一秒打印自己的id和父进程的id,打 印五次 另外一个子进程也是一样的功能,打印五次 进程完成任务之后,父进程分别回收两个进程,然后输 出all die (回收的时候,尝试着使用wait/waitpid) 3. 在进程中去凋用执行另外一个程序 运行一个程序(微信)的时候,希望在这个程序的代码中再去调用另外一个可执行 程序(滴滴) (1) 写个程
9、序weixin.c ,父进程就是微信的基本功能,子进程实现滴滴的代 码 (2) 写个程序weixin.c (weixin), didi.c(didi)父进程就是微信的基本功能,子进 程使用系统提供的专门调用shell命令或者可执行程序的一个接口函数,通过它来调用你编 译好的那个didi 方法一:system () #in elude int system (c onst char * command); 方法二:exec函数族,一系列的函数 int execl(const char *pathz const char *arg,.); int execlp(const char *file,
10、const char *arg,.); int execle(const char *path, const char *arg, char * const envp); int execv(const char 水path, char *const argv); int execvp(const char *file, char *const argv); int execvpe(const char *filez char *const argv, charconstenvp); exec函数族 所鸡头文件. mt cxccvcicoiit cliai patlt dui 1 const
11、aig?ik chai *coiist anyllb ut cxcclp(coii$t chai 1 tile, const dial 怙 参数:fildes里而放的是两个文件描述符fildesO, fildesl fildesO读端 fildesl写端 返回值:成功返回0失败返回 练习作业:(1)普通版本:使用无名管道实现聊天,双向的。如果父子进程任意一方输 入end,退出聊天,通过键盘输入实现信息的录入 (2)高级版本:用功能选择,比如:选择A聊天 B子进程发个文件, 父进程收到文件然后保存到另外一个地方 5. 进程间通信有名管道(FIFO) (1)特点:随便两个进程之间都行 不能在lin
12、ux和windows之间的共享中创建 保证写入的原子性(原子性:一件事情要么不做,要做就一口气做完不 受外界的干扰) 有名管道不能够覆盖着创建(一般代码中使用access ()函数来判断是 否存在,如果已经存在同名的管道,就不能再次创建) 使用完毕记得关闭 当管道以只读的方式打开,会阻塞,直到有另外一个进程以只写的方式 打开这个管道,那么就不阻塞了:如果是以可读写的方式打开,就不会阻塞了。 (2)有名管道的使用: A:创建 mkfifo () #include #include int mkfifo(const char *pathname, mode_t mode); 参数:pathname
13、有名管道的路径需 mode:权限 0666 练习:用有名管道实现两个进程间模拟服务器和客户端通信 客户:发送123456 服务器接收:123456,再给客户端发送一个应答receive: 123456 客户端收到服务器发送的应答,判断一下是不是自己之前发的那个信息 (123456),如果是:自由聊天了 如果不是:退出 全双工 半双道 6 进程间的通信信号 红灯信号-不要往前走了(行为,动作) 写代码的过程也会有这样情况发生: 程序(进程)在运行过程中,外界不泄时会发信号给该程序,这个时候该程序 而临着两种选择:不理它(阻塞/忽略) 阻塞:是指将信号挂起,等到程序运行完了再去响应 忽略:舍弃这个
14、信号 响应它 (1) linux当中有哪些信号:kilM査看 1) SIGHUP 6) SIGABRT 11) SIGSEGV 2) SIGINT 7) SIGBUS 12) SIGUSR2 3) SIGQUIT 8) SIGFPE 13) SIGPIPE 4)SIGILL 5) SIGTRAP 9) SIGKILL 10) SIGUSR1 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 21) SIGTTIN 22) SIGTTOU 18) SIGCONT 19) SIGSTOP 23) SIGURG 24) SIGXCPU 20) SIG
15、TSTP 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
16、48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53)SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 1到31号信号称作非实时信号:不支持队列(如果同时来了多个信号,响应是没有规 律)
17、 10) SIGUSR1 用户自立义的信号 12) SIGUSR2 34到64号信号叫做实时信号:支持队列,是linux系统中后面添加进来的信号 信号类似于中断:硬件 软件 以上信号有两个很特殊:SIGKILL, SIGSTOP不能够被忽略,也不能被阻塞 (2)信号相关的函数: A:发送信号kill () #include int kill(pid_t pid, int sig); pid :进程的id sig :信号名字 B:信号的捕捉signal () #include void (*signal(int sig, void (*func)(int)(int); / SIGKILL 参数:
18、sig 你需要捕捉的那个信号 void (*func)(int)函数指针,回调函数,捕捉到对应的信号的时候就调用 该函数 第二个参数除了可以传递一个函数指针意外,还可以使用以下两个宏 定义: SIGJGN -你捕捉到的那个信号会被忽略 SIG_DFL你捕捉的信号会采用系统默认的方式响应 C:等待信号pause () #include int pause(void); D:信号的阻塞: 每个进程都有属于它自己的一个信号掩码(也就是该进程在运行的过程中会阻塞 掉的那些信号就被称作信号掩码) sigset_t -J存储被进程阻塞的信号 关于信号掩码操作的一系列函数: #include int sig
19、emptyset(sigset_t *set); 淸空信号掩码 int sigfillset(sigset_t *set); 将所有的看号添加到信号掩码中 int sigaddset(sigset_t *set, int signum); 将特泄的信号添加到信号掩码中 int sigdelset(sigset_t *set, int signum); 将特定的信号从掩码中删除 int sigismember(const sigset_t *set, int signum); 判断某个信号是不是在该掩码中 E:配置信号掩码sigprocmask () #include int sigprocma
20、sk(int how, const sigset_t *restrict setz sigset_t * restrict oset); how: SIG_BLOCK将set所包含的信号添加到原来的信号掩码中 SIG_SETMASK用set去替换原来的信号掩码 SIG_UNBLOCK将set中包含的信号从原来的掩码中删除 set新的信号掩码 oset原本的信号掩码 原本进程中信号掩码包含了: SIGINT,SIGCONT F: kill 和 signal 捕捉信号 sigaction () #include int sigaction(int sig, const struct sigaction * restrict act, struct sigaction *restrict oact); sig :你要捕捉的那
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国无叶风扇行业发展趋势预测及投资战略咨询报告
- 2021-2026年中国托辊瓦盒市场发展前景预测及投资战略咨询报告
- 2025年中国进口葡萄酒流通市场深度评估及行业投资前景咨询报告
- 2025-2030铝单板行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030金刚石粉末行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030酒店清洁用品行业发展分析及投资价值研究咨询报告
- 2025-2030蒸汽眼罩行业市场发展分析及发展趋势与投资前景预测报告
- 中国冻干机行业市场深度分析及投资策略咨询报告
- 中国彩色金属压形板行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 货品小区销售合同范本
- 冀教版八年级下册英语全册教学设计
- 2024北京初三一模语文汇编:非连续性文本阅读
- 育婴师培训材料
- 第十七届山东省职业院校技能大赛高职组“动物疫病检疫检验”赛项规程
- 2024秋初中化学九年级下册人教版上课课件 第十一单元 课题2 化学与可持续发展
- 光电产品包装及运输方案创新
- 危重症患者留置管路管理
- DB37T 1389-2024钢箱梁顶推施工技术规范
- 捷信达酒店前台管理系统V8
- 构造地质学期末复习
- 《创伤失血性休克中国急诊专家共识(2023)》解读
评论
0/150
提交评论