使用fork和exec实现CreateProcess

时间:2019-03-10 11:58:38

标签: c operating-system fork exec createprocess

我刚开始使用操作系统,并且已经完成了这项任务。

问题描述

不同的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;
    }
}

0 个答案:

没有答案