Проблемы с execvp () и неполными командами с несколькими аргументами - PullRequest
0 голосов
/ 23 марта 2019

Я использую execvp () для запуска некоторых системных вызовов. Программа отлично работает для допустимых команд и не работает для любой команды, которая не существует, что идеально. Программа, когда я использую execvp () для команды, которая нуждается в дополнительных аргументах (например, cat), и я не предоставляю аргументы, программа просто бесконечно читает из ввода.

Я не уверен, как обойти эту проблему, так как я не знаю, как «сказать», является ли команда неполной. Есть идеи?

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

int main(int argc, char* argv[]) {
        char command[1000];


        printf("Enter command: ");
        scanf("%[^\n]s", command);

        char *temp = strtok(command, " ");
        char *commandList[100];
        int index = 0;

        while (temp != NULL) {
                commandList[index] = temp;
                index++;

                temp = strtok(NULL, " ");
        }

        commandList[index] = NULL;

        execvp(commandList[0], commandList);

        printf("Failed");
}

Идеальным результатом будет печать "Команда не выполнена" и процесс завершится.

1 Ответ

0 голосов
/ 23 марта 2019

Одна из идей из комментария полностью ответила на мой вопрос (к точным потребностям, которые у меня были).Однако я не уверен, как ему его заслужить.

Решение - просто закрыть stdin прямо перед тем, как я использую execvp ().Если команда не была выполнена при первом сканировании, программа выдает ошибку, которая является идеальной.Поскольку я запускаю основную программу, которую я использую в цикле, я могу использовать dup и dup2 для сохранения и перезагрузки стандартного ввода позже.

Код, который я использовал для проверки работоспособности:

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

int main(int argc, char* argv[]) {
        char command[1000];

        int stdinput = dup(STDIN_FILENO);

        close(STDIN_FILENO);

        dup2(stdinput, STDIN_FILENO);


        printf("Enter command: ");
        scanf("%[^\n]s", command);


        printf("%s\n", command);
}
...