1 实验目的
内容1:
编制实验软中断通信的程序:
父进程fork两个子进程,等待一段时间后,kill子进程形成软中断,并wait函数等待子进程退出信号。
内容2:
编制实现进程的管道通信的程序:
父进程开通pipe,并fork两个子进程,接收来自于子进程的信息并输出在shell里。
2 实验过程
记录实验过程中遇到的问题、分析问题原因并描述解决方法。
注意:不要重复课件上已有内容;可以通过手机拍照方式记录问题现象。
一、 首先进行软件的安装
- 先通过
sudo apt-get update
进行apt的更新 - 输入
sudo apt-get install gcc
进行c语言的软件安装(如果没有第一步的更新,这一步将找不到gcc)
二、 内容1:
- 根据流程图编制代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
int wait_flag;
void stop(int i){
wait_flag=0;
}
void main()
{
int pid1,pid2,pid3; //定义进程
signal(3,stop);
printf("\nRegister a signal handler for signal 3.");
pid3 = getpid();
printf("\n Process %d get a signal.\n", pid3);
while(wait_flag == 1) //判断是否为1
{
sleep(1); //睡眠1秒
}
while((pid1 = fork()) == -1); //创建子进程1
if(pid1 > 0) { //判断是否为父进程
while((pid2 = fork()) == -1); //创建子进程2
if(pid2 > 0) {
wait_flag = 1;
sleep(5);
kill(pid1,16);
kill(pid2,17);
sleep(0);
sleep(0);
printf("\n Parent process exit normally!\n");
}
else {
while(wait_flag == 1)
{
sleep(1);
}
signal(17,stop);
pid2 = getpid();
printf("\n Process %d get a signal.\n", pid2);
printf("\n Child process 2 is killed by parent!!\n");
exit(0);
}
}
else {
while(wait_flag == 1)
{
sleep(1);
}
signal(16,stop);
pid1 = getpid();
printf("\n Process %d get a signal.\n", pid1);
printf("\n Child process 1 is killed by parent!!\n");
exit(0);
}
}
-
使用
vi first.c
创建并编辑first.c文件(本实验在/tmp/test目录下进行)
-
进入插入模式编辑代码
-
将所创建的c文件进行编译(
gcc first.c -o first
(格式为:gcc 文件名.c -o 文件名)) -
运行(
./first
(即为编译时所设置的文件名))
三、 内容2:
- 根据题目要求及流程图编制代码
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
int pid1,pid2; //定义两个进程变量
void main(){
int fd[2];
char OutPipe[100],InPipe[100]; //定义两个字符数组
pipe(fd); //创建管道
while((pid1=fork()) == -1); //创建子进程1,如若不成功,则陷入空循环
if(pid1 == 0){ //如果子进程1创建成功,则pid1为进程号
lockf(fd[1],1,0); //锁定管道
sprintf(OutPipe,"\n Child process 1 is sending message!\n"); //给OutPipe赋值
write(fd[1],OutPipe,50); //向管道写入数据
sleep(5); //等待读进程读出数据
lockf(fd[1],0,0); //接触管道的锁定
exit(0); //结束进程
}
else{
while((pid2=fork()) == -1);
if(pid2==0){
lockf(fd[1],1,0);
sprintf(OutPipe,"\n Child process 2 is sending message!\n");
write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else{
sleep(0); //等待子进程1结束
read(fd[0],InPipe,50); //从管道中读出数据
printf(" %s",InPipe); //显示读出数据
sleep(0); //等待子进程2结束
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
exit(0); //父进程结束
}
}
}
-
使用
vi second.c
创建并编辑c文件
-
进入插入模式编辑代码
-
进行文件编译(
gcc second.c -o second
) -
运行