我刚开始使用操作系统,并且已经完成了这项任务。
问题描述
不同的OS具有不同的系统调用/ API,在创建新进程和运行可执行文件方面有所不同。忽略可以创建线程来简化此问题的事实。在Windows中,基本的流程创建API是CreateProcess。它是一种API,而不是系统调用,因为可以将Windows视为一种微内核体系结构。CreateProcess有两个版本,出于我们的目的,我们不会区分它们,而只会使用CreateProcessA(Ansi版本)。
对于这个问题,我们将仅比较以下参数:
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPVOID lpEnvironment
假设我们只有一个简化的CreateProcess API:CreateProcessEasy(lpApplicationName,lpCommandLine,lpEnvironment)。
使用伪代码素描如何使用带有Unix API(fork和exec系列)的CreateProcessSimple实现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;
}
}