использование system () для вызова ln из программы cpp

Я пытаюсь вызвать систему из программы cpp с помощью следующей команды

system("ln -s -t \"targetDir[0]\" \"baseDir[0]\"");

И targetDir, и baseDir являются QStringList. Программа компилируется и запускается, но когда я выполняю команду, я получаю сообщение об ошибке ln: targetDir [0] — недопустимая команда. Когда я тестирую путем жесткого кодирования значений вместо использования переменных, это работает просто отлично. Я могу только заключить, что это не экранирование строки для помещения значения переменных в аргумент, передаваемый в ln. По жизни я не могу понять, почему нет.

Есть идеи?

1

Решение

Ты смущен. Система (3) функция библиотеки (это не команда, и, несмотря на ее имя не системный вызов, те перечислены в Системные вызовы (2)) является разветвление /bin/sh -c процесс, который, очевидно, не имеет никакого представления о переменных вашей программы на C ++ (во время выполнения переменные не существуют; существуют только местоположения).

Кстати, используя Система (3) без осторожности может быть опасным из-за внедрение кода проблемы. Вообразите в своем (неправильном) подходе, что targetDir[0] содержит что-то вроде foo; rm -rf $HOME ….


Чтобы сделать символическую ссылку, разветвление процесса — это излишне. Просто позвони символическая (2) системный вызов (который п (1) Команда будет вызываться, если вызывается как ln -s)

Библиотека Qt предлагает QFile класс с его QFile :: ссылка функция-член или статический QFile :: ссылка (оба позвонят символическая (2))

Будущие (или недавние) версии C ++, начиная с C ++ 17, обеспечит std::filesystem::create_symlink функция (который на Linux будет называть
символическая (2)). Это, вероятно, вдохновлено Повысить файловую систему библиотека.

PS. Если кодирование для Linux или POSIX, я рекомендую прочитать Расширенное программирование в Linux (который можно загрузить бесплатно). Но если вы хотите переносимую исходную программу Qt, ограничьте себя щедрым Qt API. Или принять C ++ 17 и использовать его std::filesystem вещь.

4

Другие решения

C ++ ни в коем случае не выполняет интерполяцию строк.

Если вы на самом деле пишете на C ++, вы можете (учитывая targetDir является char ** или что-то похожее)

std::string command = std::string("ln -s -t \"") + targetDir[0] + "\" \"" + baseDir[0] + "\"";
system(command.c_str());
1

По вопросам рекламы [email protected]