в Linux 12.04
У меня есть исполняемый файл, расположенный в скажем:
/a/b/exe
и файл конфигурации на
/a/b/config
при выполнении:
cd /a/b/
./exe
все в порядке, и функция stat находит файл config в / a / b /
ОДНАКО, при запуске от рута
/a/b/exe
статистика не находит файл конфигурации
есть идеи почему?
это делает невозможным запуск двоичного файла с использованием сценария, который не запускается из папки exe.
Звонок выглядит так:
struct stat stFileInfo;
bool blnReturn;
int intStat;
// Attempt to get the file attributes
intStat = stat(strFilename.c_str(),&stFileInfo);
if(intStat == 0) {
// We were able to get the file attributes
// so the file obviously exists.
blnReturn = true;
} else {
// We were not able to get the file attributes.
// This may mean that we don't have permission to
// access the folder which contains this file. If you
// need to do that level of checking, lookup the
// return values of stat which will give you
// more details on why stat failed.
blnReturn = false;
}
В первом случае cd ..., run exe
вы изменяете текущий рабочий каталог перед выполнением программы, во втором случае вы запускаете exe без изменения текущего рабочего каталога, и я думаю, что в вашей программе вы используете относительный путь для открытия вашей конфигурации (например, ./config
или просто config
) и он не может найти его из текущего рабочего каталога. Самый простой обходной путь — изменить рабочий каталог при запуске вашего приложения:
int main(int argc, char** argv) {
std::string s( argv[0] ); // path to the program
std::string::size_type n = s.rfind( '/' );
if( n != std::string::npos ) {
std::system( ("cd " + s.substr(0, n)).c_str() );
}
// rest of your code
}
Других решений пока нет …