实验二-Linux进程、线程及编程_第1页
实验二-Linux进程、线程及编程_第2页
实验二-Linux进程、线程及编程_第3页
实验二-Linux进程、线程及编程_第4页
实验二-Linux进程、线程及编程_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二实验二 LinuxLinux 进程 线程及编程实验进程 线程及编程实验 一 实验目的一 实验目的 1 通过编写一个完整的守护进程 掌握守护进程编写和调试的方法 2 进一步熟悉如何编写多进程程序 二 实验环境二 实验环境 硬件 PC 机一台 JXARM9 2410 教学实验平台 软件 Windows98 XP 2000 系统 虚拟机环境下的 Linux 系统 三 预备知识三 预备知识 1 fork fork 函数用于从已存在的进程中创建一个新进程 新进程称为子进程 而原进程称为 父进程 使用 fork 函数得到的子进程是父进程的一个复制品 它从父进程处继承了整个 进程的地址空间 包括进程上下文 代码段 进程堆栈 内存信息 打开的文件描述符 信号控制设定 进程优先级 进程组号 当前工作目录 根目录 资源限制和控制终端等 而子进程所独有的只有它的进程号 资源使用和计时器等 2 exit 和 exit 的区别 exit 函数的作用最为简单 直接使进程停止运行 清除其使用的内存空间 并销毁 其在内核中的各种数据结构 exit 函数则在这些基础上作了一些包装 在执行退出之前加了若干道工序 exit 函数在调用 exit 系统调用之前要检查文件的打开情况 把文件缓冲区中的内容写回文 件 就是图中的 清理 I O 缓冲 一项 3 wait 和 waitpid wait 函数是用于使父进程 也就是调用 wait 的进程 阻塞 直到一个子进程结束或 者该进程接到了一个指定的信号为止 如果该父进程没有子进程或者他的子进程已经结束 则 wait 就会立即返回 四 实验内容四 实验内容 在该实验中 读者首先创建一个子进程 1 守护进程 然后在该子进程中新建一个子 进程 2 该子进程 2 暂停 10s 然后自动退出 并由子进程 1 收集子线程退出的消息 在这 里 子进程 1 和子进程 2 的消息都在系统日志文件 例如 var log messages 日志文件 的全路径名因版本的不同可能会有所不同 中输出 在向日志文件写入消息之后 守护进 程 子进程 1 循环暂停 其间隔时间为 10s 五 实验步骤五 实验步骤 1 分析下面的代码 注意它的运行会产生几个进程以及掌握 fork 调用的具体过程 multi proc wrong c include include include include include int main void pid t child1 child2 child 创建两个子进程 child1 fork child2 fork 子进程 1 的出错处理 if child1 1 printf Child1 fork error n exit 1 else if child1 0 在子进程 1 中调用 execlp 函数 printf In child1 execute ls l n if execlp ls ls l NULL 0 printf Child1 execlp error n if child2 1 子进程 2 的出错处理 printf Child2 fork error n exit 1 else if child2 0 在子进程 2 中使其暂停 5s printf In child2 sleep for 5 seconds and then exit n sleep 5 exit 0 else 在父进程中等待两个子进程的退出 printf In father process n child waitpid child1 NULL 0 阻塞式等待 if child child1 printf Get child1 exit code n else printf Error occured n do child waitpid child2 NULL WNOHANG 非阻塞式等待 if child 0 printf The child2 process has not exited n sleep 1 while child 0 if child child2 printf Get child2 exit code n else printf Error occured n return 0 此段代码会是我们所希望的结果 如果 child1 fork child2 fork 都成功则会有 4 个进程 child1 fork 后会才生一个新的进程 主进程 child1 child2 fork 后主进程 和 child1 有分别产生一个新的进程 2 分析下面代码 体会与上一个代码之间的区别 multi proc c include include include include include int main void pid t child1 child2 child 创建两个子进程 child1 fork 子进程 1 的出错处理 if child1 1 printf Child1 fork error n exit 1 else if child1 0 在子进程 1 中调用 execlp 函数 printf In child1 execute ls l n if execlp ls ls l NULL 0 printf Child1 execlp error n else 在父进程中再创建进程 2 然后等待两个子进程的退出 child2 fork if child2 1 子进程 2 的出错处理 printf Child2 fork error n exit 1 else if child2 0 在子进程 2 中使其暂停 5s printf In child2 sleep for 5 seconds and then exit n sleep 5 exit 0 printf In father process n child waitpid child1 NULL 0 阻塞式等待 if child child1 printf Get child1 exit code n else printf Error occured n do child waitpid child2 NULL WNOHANG 非阻塞式等待 if child 0 printf The child2 process has not exited n sleep 1 while child 0 if child child2 printf Get child2 exit code n else printf Error occured n return 0 3 在宿主机上编译调试该程序 gcc multi proc c o multi proc 4 在确保没有编译错误后 使用交叉编译该程序 arm linux gcc multi proc c o multi proc 5 将生成的可执行程序下载到目标板上运行 6 分析实验结果 主要是要理解 FORK 函数的意义 在语句 child1 fork 之前 只有一个进程在执 行这段代码 但在这条语句之后 就变成两个进程在执行了 这两个进程的代码部分完全 相同 两个进程中 原先就存在的那个被称作 父进程 新出现的那个被称作 子进程 父子进程的区别除了进程标志符 process ID 不同外 变量 child1 的值也不相同 child1 存放的是 fork 的返回值 fork 调用的一个奇妙之处就是它仅仅被调用一次 却能够返回两 次 它可能有三种不同的返回值 在父进程中 fork 返回新创建子进程的进程 ID 在子进程中 fork 返回 0 如果出现错误 fork 返回一个负值 所以掌握了 fork 的含义后就不难分析结果了 第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论