Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用fork和exec实现CreateProcess_C_Operating System_Fork_Exec_Createprocess - Fatal编程技术网

使用fork和exec实现CreateProcess

使用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

我刚开始学习操作系统,我有这个任务

问题描述

不同的操作系统具有不同的系统调用/API,在创建新进程和运行可执行文件方面各不相同。忽略一个事实,即可以创建线程来简化这个问题。在Windows中,基本的进程创建API是CreateProcess。它是一个API而不是一个系统调用,因为Windows可以被视为一种微内核架构。CreateProcess有两个版本,出于我们的目的,我们将不区分它们,只使用CreateProcessA(Ansi版本)

对于这个问题,我们将只比较以下参数:

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