欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦——西电计科课程学习。
实验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;
}
五、程序运行结果