使用fork和exec实现CreateProcess
我刚开始学习操作系统,我有这个任务 问题描述 不同的操作系统具有不同的系统调用/API,在创建新进程和运行可执行文件方面各不相同。忽略一个事实,即可以创建线程来简化这个问题。在Windows中,基本的进程创建API是CreateProcess。它是一个API而不是一个系统调用,因为Windows可以被视为一种微内核架构。CreateProcess有两个版本,出于我们的目的,我们将不区分它们,只使用CreateProcessA(Ansi版本) 对于这个问题,我们将只比较以下参数:使用fork和exec实现CreateProcess,c,operating-system,fork,exec,createprocess,C,Operating System,Fork,Exec,Createprocess,我刚开始学习操作系统,我有这个任务 问题描述 不同的操作系统具有不同的系统调用/API,在创建新进程和运行可执行文件方面各不相同。忽略一个事实,即可以创建线程来简化这个问题。在Windows中,基本的进程创建API是CreateProcess。它是一个API而不是一个系统调用,因为Windows可以被视为一种微内核架构。CreateProcess有两个版本,出于我们的目的,我们将不区分它们,只使用CreateProcessA(Ansi版本) 对于这个问题,我们将只比较以下参数: LPCSTR
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPVOID lpEnvironment
假设我们有一个简化的CreateProcess API,它只有:CreateProcessEasy(lpApplicationName、lpCommandLine、lpEnvironment)
使用伪代码绘制如何使用CreateProcessSimple和Unix API(fork和exec系列)实现Windows代码
在做这件事的过程中,我遇到了一些问题,没有真正理解这些标志,特别是如果排除其中一些标志意味着我必须做出假设。有人能根据我的尝试对我的理解发表评论吗
尝试
BOOL CreateProcessEasy(lpApplicationName,lpCommandLine,lpEnvironment) {
pid_t pid;
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
return 0;
}
else if (pid == 0) { /* child process */
if (lpApplicationName==NULL) {
path = Filter out the path required to be passed into execve from lpCommandLine
if (path==NULL) {
fprintf(stderr, "No path found");
return 0;
} else {
execve(path,lpCommandLine,lpEnvironment);
return 1;
}
}
if (lpCommandLine==NULL) {
if (lpApplicationName not found in current directory) {
fprintf(stderr, "File not found");
return 0;
} else {
execve(lpApplicationName,NULL,lpEnvironment);
return 1;
}
}
return 1;
} else {/* parent process */
/* parent will wait for the child to complete */
wait(pid);
printf("Child Complete");
return 1;
}
}
BOOL CreateProcessEasy(lpApplicationName、lpCommandLine、lpEnvironment){
pid_t pid;
/*派生子进程*/
pid=fork();
如果(pid<0){/*发生错误*/
fprintf(标准“Fork Failed”);
返回0;
}
如果(pid==0){/*子进程*/
if(lpApplicationName==NULL){
path=从lpCommandLine筛选出需要传递到execve的路径
if(路径==NULL){
fprintf(stderr,“未找到路径”);
返回0;
}否则{
execve(路径、lpCommandLine、lpEnvironment);
返回1;
}
}
if(lpCommandLine==NULL){
if(在当前目录中找不到lpApplicationName){
fprintf(stderr,“未找到文件”);
返回0;
}否则{
execve(lpApplicationName,NULL,lpEnvironment);
返回1;
}
}
返回1;
}else{/*父进程*/
/*父项将等待子项完成*/
等待(pid);
printf(“儿童完整版”);
返回1;
}
}