/***************************************************************************
mycmd
模仿Windows的cmd.exe
(1)提供两个内部命令(不必开启子进程,在当前进程中执行), cd和dir
cd c:\
cd ..
dir
(2)对于执行可执行程序,则开启子进程来执行该程序,例如
C:\Program Files\Internet Explorer\iexplore.exe
/*实验设计:邹昌伟:google_007@sohu.com*/
****************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#define BUFSIZE 4096
#define MAXLINE 4096
BOOL CreateChildProcess(char * szCmdline);
void processCmdline(char * szCmdline);
PROCESS_INFORMATION piProcInfo;
/******************************************************************
显示目录path下的所有文件和子目录
@param char * path 形如 e:\data\*
********************************************************************/
void dir(char * path){
HANDLE hFile;
WIN32_FIND_DATA fd;
BOOL bRet = TRUE;
bRet = TRUE;
hFile = FindFirstFile(path, &fd);
while (hFile != INVALID_HANDLE_VALUE && bRet)
{
printf("%s\n",fd.cFileName);
bRet = FindNextFile(hFile, &fd);
}
FindClose(hFile); //
}
void processCmdline(char * szCmdline){
char path[MAXLINE];
if(strncmp(szCmdline,"dir",3) == 0){
GetCurrentDirectory(MAXLINE,path);
strcat(path,"\\*");
dir(path);
}else if(strncmp(szCmdline,"cd",2) == 0){
char * ptr = szCmdline;
ptr += 2;
while(*ptr == ' ' || *ptr == '\t'){
ptr++;
}
SetCurrentDirectory(ptr);
}else{
if(CreateChildProcess(szCmdline)) {
WaitForSingleObject(piProcInfo.hProcess,INFINITE); //实验要求补全代码部分
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
}
else
printf("出错\n");
}
printf("\n");
}
int main(){
char cmdline[MAXLINE];
char path[MAXLINE];
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
printf("Microsoft Windows\n(C)版权所有 FJNU CSE 2013\n\n");
GetCurrentDirectory(MAXLINE,path);
printf("%s>",path);
while (fgets(cmdline, MAXLINE, stdin) != NULL) {
if (cmdline[strlen(cmdline) - 1] == '\n'){
cmdline[strlen(cmdline) - 1] = 0; /* replace newline with null */
}
//用户可能直接输入回车
if(cmdline[0] != 0){
processCmdline(cmdline);
}
GetCurrentDirectory(MAXLINE,path);
printf("%s>",path);
}
return 0;
}
BOOL CreateChildProcess(TCHAR * szCmdline){
STARTUPINFO siStartInfo;
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
siStartInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
siStartInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
siStartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
return CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
}
操作系统 实验一 多线程 (模拟)
原创
©著作权归作者所有:来自51CTO博客作者wx634fafb167087的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:牛客(求树的直径)
下一篇:牛客练习赛23(完全背包)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【操作系统】多线程之线程同步
多线程基本概念线程是CPU调度和分派的基本单位。进程是分配资源的基本单位。等同于正在
c++ 多线程 #include 互斥对象 内核对象 -
操作系统实验
连通性
linux系统 缺页中断 linux 多级反馈队列 python -
【操作系统】—线程概念和多线程模型
【操作系统】—线程概念和多线程模型本章节学习内容如下一、什么是线程,为什么要引入线程线程
运维 操作系统 一对一 多对多 线程模型