Linux实验二:进程管理实验

本文档详述了一次实验的过程,涵盖了软中断通信和管道通信的C语言程序实现。实验中,首先通过更新apt并安装gcc来准备环境。对于软中断通信,父进程创建两个子进程,然后发送信号使子进程终止。对于管道通信,父进程创建管道并生成两个子进程,子进程通过管道向父进程发送消息。实验过程中记录了问题、分析原因并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 实验目的

内容1:
编制实验软中断通信的程序:
父进程fork两个子进程,等待一段时间后,kill子进程形成软中断,并wait函数等待子进程退出信号。

内容2:
编制实现进程的管道通信的程序:
父进程开通pipe,并fork两个子进程,接收来自于子进程的信息并输出在shell里。

2 实验过程

记录实验过程中遇到的问题、分析问题原因并描述解决方法。
注意:不要重复课件上已有内容;可以通过手机拍照方式记录问题现象。
一、 首先进行软件的安装

  1. 先通过sudo apt-get update进行apt的更新
  2. 输入sudo apt-get install gcc进行c语言的软件安装(如果没有第一步的更新,这一步将找不到gcc)

二、 内容1:

  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);
	}
}
  1. 使用vi first.c创建并编辑first.c文件(本实验在/tmp/test目录下进行)
    在这里插入图片描述

  2. 进入插入模式编辑代码
    在这里插入图片描述

  3. 将所创建的c文件进行编译(gcc first.c -o first(格式为:gcc 文件名.c -o 文件名))

  4. 运行(./first(即为编译时所设置的文件名))
    在这里插入图片描述

三、 内容2:

  1. 根据题目要求及流程图编制代码
#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);		//父进程结束
		}
	}
}
  1. 使用vi second.c创建并编辑c文件
    在这里插入图片描述

  2. 进入插入模式编辑代码
    在这里插入图片描述

  3. 进行文件编译(gcc second.c -o second

  4. 运行
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值