Проверьте, прошла ли среда execv - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь выполнить домашнее задание о создании процесса с execv в Linux.Мне нужно взять строку ввода у пользователя и проверить, есть ли на компьютере программа с таким же именем.Мне нужно попытаться выполнить данную строку программы с каталогами переменных PATH. Мне нужно использовать ТОЛЬКО функцию execv для выполнения программы.Ввод разделяется пробелом, когда первое слово является файлом программы, а остальные слова являются аргументами.И они также просят меня подтвердить, что среда перешла к execv.Как я могу это проверить?Я обнаружил, что мне нужно использовать переменную environ и заполнить ее

Я пробовал это сделать до сих пор:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MYCOMMAND_LEN   1000
#define MYNUM_OF_PARAMS 500

extern char **environ;

int main()
{
    int i = 0, j, pid, stat, amountOfLib;
    char command[MYCOMMAND_LEN];
    char *params[MYNUM_OF_PARAMS];
    char *path, *lastStr;
    char *libs[100];
    int numberOflib = 0, numOfParams;
    char *commandPath;

    //cut path
    path = getenv("PATH");
    lastStr = strtok(path, ":");
    libs[0] = (char*)malloc(sizeof(char)*strlen(lastStr) + 1);
    strcpy(libs[0], lastStr);
    i = 1;
    while (lastStr = strtok(NULL, ":")) {
        libs[i] = (char*)malloc(sizeof(char)*strlen(lastStr) + 1);
        strcpy(libs[i], lastStr);
        i++;
        numberOflib = i;
    }
    numberOflib = i;


    puts("Please Enter Command: ");
    gets(commandPath);

    //loop until leave {
    while (strcmp(command, "leave") != 0) {

        //cut command
        lastStr = strtok(command, " ");
        params[0] = (char*)malloc(sizeof(char)*(strlen(lastStr) + 1));
        strcpy(params[0], lastStr);
        i = 1;
        while ((lastStr = strtok(NULL, " ")) != NULL)
        {
            params[i] = (char*)malloc(sizeof(char)*(strlen(lastStr) + 1));
            strcpy(params[i], lastStr);
            i++;
        }
        params[i] = NULL;
        numOfParams = i;

        //check if first is relative
        if ((pid = fork()) == 0) {
            if (params[0][0] == '/' ||
                (strlen(params[0]) >= 2 &&
                    params[0][0] == '.' &&
                    params[0][1] == '/'
                    ) ||
                    (strlen(params[0]) >= 3 &&
                        params[0][0] == '.' &&
                        params[0][1] == '.' &&
                        params[0][2] == '/'
                        )
                ) execv(params[0], params);
            // if command like "man ls"
            else {
                for (i = 0; i < amountOfLib; i++) {
                    commandPath = libs[i];
                    strcat(commandPath, "/");
                    strcat(commandPath, params[0]);

                    for (j = 0; j < numOfParams; j++) {
                         environ[j] = params[j]; //last environ also get the null
                    }

                    execv(commandPath, NULL);
                }
                puts("command not found in PATH");
                exit(1);
            }
        } else {
            wait(&stat);
        }
        puts("Please Enter Command: ");
        gets(commandPath);
    }
    //}

}

некоторые входные данные, такие как 'ls', отвечают, что вектор argv равенпустой.

...