没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
25页
包含每种进程通信方法的实验代码和实验结果与分析 (1)用exec函数调用shell指令。 (2)用fork()函数创建子进程。 (3)复制一个进程,父进程通过管道发送给子进程,并呈现在屏幕上。应用函数msgget、msgrcv、msgsnd,读、写消息队列中的消息并打印输出。 (4)应用用消息队列实现简单的聊天程序。 (5)父进程创建两个子进程,父进程向子进程发送信号。 (6)通过共享内存交换数据。
资源推荐
资源详情
资源评论
实验项目二:
一、项目名称:进程与线程实验
二、实验学时:4 学时
三、实验目的:
掌握 exec 族函数。
子进程创建
掌握进程间通信管道。
掌握进程间通信消息机制。
掌握进程间通信信号机制。
掌握进程间通信共享内存。
掌握多线程编程。
四、主要仪器设备及套数:
软件:vmware 虚拟机
五、实验内容:
用 exec 函数调用 shell 指令。
用 fork()函数创建子进程。
复制一个进程,父进程通过管道发送给子进程,并呈现在屏幕上。
应用函数 msgget、msgrcv、msgsnd,读、写消息队列中的消息并打印输出。
应用用消息队列实现简单的聊天程序。
父进程创建两个子进程,父进程向子进程发送信号。
通过共享内存交换数据。
六、实验步骤:
任务 1:exec 系列函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void main()
{
printf("exec series functions test");
printf("execve");
char*const ps_argv[]={"ps","ax",0};
char*const ps_envp[]={"PATH=/bin:/usr/bin","TERM=console",0};
execv("/bin/ps",ps_argv);
printf("Done.");
}
实验结果与分析
函数首先定义两个输出函数,然后定义两个指针数组存储命令行参数和环境
变量,execv 其中第一个参数为要启动程序的路径。退出 vi 编辑器编译然后执行。
观察运行结果,首先输出了两行 printf 中的内容,然后输出进程信息,程序最后
一行 printf("Done.")并没有被打印,因为到了子进程当中。
任务 2:复制进程映像,fork()
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
char *message;
int n;
printf("fork \n");
pid=fork();
switch(pid)
{
case -1:
perror("fork error");
break;
case 0:
message="this is child";
n=8;
break;
default:
message="this is parent";
n=3;
break;
}
for(;n>0;n--)
{
puts(message);
sleep(1);
}
exit(0);
}
实验结果与分析
fork 调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能
有三种不同的返回值:
(1)在父进程中,fork 返回新创建子进程的进程 ID;
(2)在子进程中,fork 返回 0;
(3)如果出现错误,fork 返回一个负值;
定义一个 pid_t 类型的数据 pid 记录进程号和一个存储信息的 message。fork
函数会新生成一个子进程。pid 为 0 时是子进程,n 赋值为 8 并进入 for 循环,并
输出 8 次"this is child",在此之前父进程也已开始运行并且会循环 3 次。在程序
输出结果中我们可以看到父进程和子进程并行运行。
分裂后父子进程是彼此相互独立运行的,所以要想让父进程等待子进程,只
需使用 wait()系统调用:
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("wait test\n");
pid=fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
message="this is child";
n=8;
exit_code=37;
break;
default:
message="this is parent";
n=5;
exit_code=5;
break;
}
for(;n>0;n--)
{
puts(message);
sleep(1);
}
if(pid!=0)
{
int stat_val;
pid_t child_pid;
child_pid=wait(&stat_val);
printf("waiting for child to finish\n");
if(WIFEXITED(stat_val))
{
printf("child exit code is %d\n",WEXITSTATUS(stat_val));
}
else
{
printf("child exit failed\n");
}
}
exit(exit_code);
}
实验结果与分析
wait 会暂时停止目前进程的执行,直到子进程结束。如果在调用 wait 时子
进程已经结束,则 wait 会立即返回子进程结束状态值。WIFEXITED (stat_val)如
果为正常终止的子进程返回状态,则计算为非零值。如果 WIFEXITED(stat_val)
的值非零,WEXITSTATUS(stat_val)将计算子进程传递给 exit()的值即 37。
剩余24页未读,继续阅读
资源评论
会举重的薯片
- 粉丝: 1814
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- IMG_5905.PNG
- Cyclone Version 9.51
- 高性能量化回测工具 hikyuu 2.0.3 python 3.12 windows 安装包
- 省级城乡居民基本养老保险情况数据集(2010-2022年).xlsx
- 舞队填写版.cpp
- 基于BP神经网络的多输入单输出回归预测.zip
- 高性能量化回测工具 hikyuu 2.0.3 python 3.9 windows 安装包
- 省级城镇职工基本养老保险情况2000-2022年.xlsx
- 高性能量化回测工具 hikyuu 2.0.3 python 3.10 windows 安装包
- 算法部署-使用OpenVINO+C#部署PaddleOCR字符识别算法-项目源码-优质项目实战.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功