Ubuntu C код, как выполнить команду в другой папке - PullRequest
0 голосов
/ 14 апреля 2020
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    char *buffer = malloc(1024);
    FILE* f = popen("ls", "r");
    int byteReads = fread(buffer, 1, 1024, f);
    fclose(f);
    printf("%s\n", buffer);

    return 0;
}

Есть 2 папки ./parent/folder1 и ./parent/folder2. ./main находится в папке 1, и я хочу, чтобы он выполнил ls в папке 2 и получил результат.

Не то, что указано c для "ls", но это работает для любых команд в целом .

Как я могу сделать это, используя popen()? Или я должен использовать другую команду?

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете использовать popen, как и в своем вопросе. Вы можете передать cmd, который вы хотите выполнить, в качестве аргумента вызова программы, например, если ваша программа называется myexecute, вызов командной строки будет выглядеть следующим образом:

myexecute folder2 'ls -l' 

или

myexecute 'another folder' 'ls' 

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

С помощью chdir вы можете изменить текущий рабочий каталог. Вывод команды можно прочитать в al oop и вывести на стандартный вывод. Наконец, с помощью pclose вы ожидаете, пока связанный процесс завершится sh, и он даже вернет состояние завершения выполненной команды, на случай, если вам это интересно.

Ваш слегка измененный код может выглядеть так это:

#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    if(argc != 3) {
        fprintf(stderr, "usage: %s '<dir>' '<cmd>'\n", basename(argv[0]));
        return EXIT_FAILURE;
    }
    if(chdir(argv[1]) != 0) {
        perror(argv[1]);
        return EXIT_FAILURE;
    }
    FILE *f = popen(argv[2], "r");
    if (!f) {
        perror("popen failed");
        return EXIT_FAILURE;
    }
    char buf[1024];
    while (fgets(buf, sizeof(buf), f)) {
        printf("%s", buf);
    }
    if (pclose(f) != 0) {
        perror("pclose failed");
    }
    return EXIT_SUCCESS;
}
...