实验一 多线程

windows版:

/***************************************************************************

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);
	}
	
}

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("Error\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 
}


linux版:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#define MAXLINE 80
int main(void)
{
	char	buf[MAXLINE];	
	pid_t	pid;
	int		status;

	printf("%% ");	/* print prompt */
	while (fgets(buf, MAXLINE, stdin) != NULL) {
		if (buf[strlen(buf) - 1] == '\n'){
			buf[strlen(buf) - 1] = 0; /* replace newline with null */			
		}
		if ((pid = fork()) < 0) {
			printf("fork error");
		} else if (pid == 0) {		/* child */
			execlp(buf, buf, (char *)0);
			printf("couldn't execute: %s", buf);
			exit(127);
		}

		/* parent */
		if ((pid = waitpid(pid, &status, 0)) < 0){
			printf("waitpid error");
		}
		printf("%% ");
	}
	return 0; //exit(0);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值