西电操作系统上机实验1

本文详细介绍了如何在Windows环境中利用CreateProcess函数创建子进程,以实现父进程计算1-100的和的同时,子进程负责读写文件。通过fopen和fread函数操作文件,展示了进程间的协同工作过程。
摘要由CSDN通过智能技术生成

欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦——西电计科课程学习

实验1:创建进程

一、实验目的

  学会通过基本的Windows进程控制函数,由父进程创建子进程。

二、实验内容

   假设现在有这样的一个工作,需要计算1-100的和,还需要做一个工作是读写文件。

  我们可以让父进程计算,创建一个子进程实现读写文件。

主要工作:

  1、首先由父进程创建子进程

  2、让子进程创建一个文件并写入数据,子进程写文件过程中,父进程继续执行计算工作

  3、等子进程执行完以后,父进程读取文件内容输出,实现进程协同工作。

三、程序框架

  父进程框架:

void main()
{
    //为创建进程做准备工作
    //创建子进程
    if(创建失败)
        返回
	else(创建成功)
		//执行计算1——100的和
		//等子进程执行完,读取子进程的文件内容,并输出。
}

  子进程框架:

void main()
{
	//创建文件
	if(失败)
		返回
	else(成功)
		//向文件写入数据
		//读取文件内容输出
}

  父进程创建子进程:用CreateProcess函数来创建一个新进程。

BOOL CreateProcess( 
LPCTSTR lpApplicationName; //指定可执行程序名
LPTSTR lpCommandLine; //命令行字符串,可以为NULL
LPSECURITY_ATTRIBUTES lpProcessAttributes; //新进程对象的安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes; //新进程对应线程的安全属性
BOOL bInheritHandles;//指定父进程的对象句柄是否能被子进程继承
DWORD dwCreationFlags; //指定创建进程的附加标记,即指定新创建进程的特性
LPVOID lpEnvironment;//指定新进程使用的环境,NULL表示同父进程环境
LPCTSTR lpCurrentDirectory; //指定子进程当前路径,NULL表示与父进程路径相同
LPSTARTUPINFO lpStartupInfo; //指定新进程主窗口如何显示
LPPROCESS_INFORMATION lpProcessInformation; //作为返回值使用,是一个指针
); 

  子进程的工作主要涉及的是文件操作

  创建文件可以用fopen函数:

FILE *fopen( 	//返回一个指向文件结构体的指针
const char *filename, //打开或创建的文件名
const char *mode  //打开或创建方式,即设定读写权限
); 
//Fopen函数既可以创建文件也可以打开已存在的文件
FILE *pFile=fopen("1.txt","w");

  读文件用fread函数:

size_t fread( 
const void *buffer, //指向要读取内容的文件指针
size_t size, //每次读取大小,字节为单位
size_t count, //读取次数
FILE *stream //一个指向文件结构体的指针,表示将要写读取操作的文件
);

  在每次写入文件盒读取文件操作后,关闭文件,使用fclose函数:

int fclose( FILE *stream );//关闭文件,参数是指向操作文件的文件结构体的指针

四、源代码

  父进程:

#include<stdio.h>
#include<windows.h>
int main()
{
	STARTUPINFO sui;               //启动信息结构体 
	PROCESS_INFORMATION pi;      //在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。
	ZeroMemory(&sui,sizeof(sui));
	sui.cb = sizeof(STARTUPINFO);  //将cb成员设置为信息结构体的大小
	int sum = 0;
	char content[100] = "";          //初始化content字符数组用来存放文件内容 
	if(CreateProcess("D:\\child.exe",NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&sui,&pi))//创建进程 
	{
		printf("已创建一个子进程\n");
		for(int i = 1; i <= 100; i++)
		{
			sum = sum + i;       //求1-100之和 
			Sleep(5);            //延迟时间5ms
			printf("Now, sum = %d\n",sum);
		}
		WaitForSingleObject(pi.hProcess,INFINITE);  //一直等下去直到进程结束 
		FILE *fp = fopen("D:\\test.txt","r");
		fread(content,sizeof(char),100,fp);           //设置读取文件内容的相关参数 
		printf("子进程创建的文件内容如下:\n\n%s\n\n",content);
		fclose(fp);
	}
	else
		printf("创建子进程失败\n");
	printf("实验结束!");
	return 0;
}

  子进程:

#include<stdio.h>
#include<windows.h> 
int main()
{
	printf("子进程开始运行...\n\n");
	const char *something = "这是一句话。";
	FILE *fp;
	if(fp = fopen("D:\\test.txt","w+"))              //以可读写方式打开文件
	{
		printf("文件打开成功!\n\n");
		fwrite(something,strlen(something),1,fp);    //将something写入文件中 
		fwrite("\n这是另一句话。",strlen("\n这是另一句话。"),1,fp);    //将另一句话写入文件中 
		printf("写入数据成功!\n\n");
		fclose(fp);//关闭文件 
 		fp = fopen("D:\\test.txt","r");               //以只读方式打开文件 
 		printf("当前文件中的内容如下:\n");
		char ch=fgetc(fp);                       //取第一个字符 
		while(ch!=EOF)                        //当该字符不为文件结束标志时 
		{
			putchar(ch);                       //输出该字符 
			ch=fgetc(fp);                      //继续从文件中获取字符 
		}
		fclose(fp);                            //关闭文件 
	}
	else
		printf("创建文件失败!\n");
	printf("\n\n");
	system("pause");
	return 0;
}

五、程序运行结果
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polaris_T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值