Реализуйте CreateProcess, используя fork и exec - PullRequest
1 голос
/ 10 марта 2019

Я только начинаю в операционных системах, и у меня есть это назначение.

Описание проблемы

Различные ОС имеют разные системные вызовы / API, которые различаются при создании новых процессов и запуске исполняемых файлов. Не обращайте внимания на тот факт, что темы могут быть созданы, чтобы упростить этот вопрос. В Windows основным API создания процесса является CreateProcess. Это скорее API, чем системный вызов, потому что Windows можно рассматривать как своего рода архитектуру микроядра. Существует две версии CreateProcess, для наших целей мы не будем их различать, а просто будем использовать CreateProcessA (версия Ansi).

По этому вопросу мы сравним только следующие параметры:

  LPCSTR                lpApplicationName,

  LPSTR                 lpCommandLine,

  LPVOID                lpEnvironment

Предположим, у нас есть упрощенный API CreateProcess только с: CreateProcessEasy (lpApplicationName, lpCommandLine, lpEnvironment).

Нарисуйте с помощью псевдокода, как реализовать код Windows, используя CreateProcessSimple с Unix API (семейство fork и exec).

В процессе работы я столкнулся с несколькими проблемами, связанными с непониманием флагов, особенно если исключение некоторых из них означает, что я должен делать предположения. Кто-нибудь может прокомментировать мое понимание, основанное на моей попытке?

Покушение

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