Program file directory linux

Куда Linux ставит программы. Коротко о файловой системе Linux.

Файловая система Linux очень сильно отличается от того, к чему привык пользователь Windows. Тут нет привычных дисков с их буквенным обозначением и нет папки Program Files.

Файловая система Линукс располагает папки по типу дерева, которое идет от некого корня.

И главное, любая папка может физически находится на другом диске, как логическом, так и физическом.

Скажем папку Home ставят на другой диск, папка хранит все документы пользователя и в случае переустановки системы, они так и останутся.

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

И так, мы отвлеклись. Каждая папка Linux хранит свой тип файлов:

/etc — здесь хранятся файлы разных конфигураций, настройки системы, скажем файл fstab хранит информация ваших файловых системах, в нем задаеться информация как их монтировать и что с ними делать. В былые времена я руками туда вписывал разделы виндусевских дисков, сейчас, благо, все монтируется автоматически.

/dev это папка файлов устройств, да в Линуксе каждое устройство это файл.

/media сюда монтируются съемные носители

Но это все тема отдельная, нас интересует именно куда программы то ставятся.

/usr вот в эту папку идут все программы пользователя. Там содержаться и исполняемые файлы, и библиотеки и прочее.

Когда вы скачиваете установочный пакет, то он представляет из себя архив с файлами программы и файл, который указывает установщику, куда положить эти файлы. Существует четкое распределение файлов по папкам, но последнее время, это не всегда так.

/usr/bin — сюда помещаются исполняемые файлы программ

usr/lib — а здесь библиотеки, которые нужны программе

usr/sbin — сюда помещаются исполняемые файлы от имени администратора

/usr/share — прочие файлы программ

Как я писал выше, что существует правило распределения файлов, но оно не всегда соблюдается.

/opt ряд программ устанавливается в эту папку, там создаеться папка программы, в которой все ее файлы, по типу, как это происходит в виндоувс. Изначально это папка для установки проприетарных программ.

Читайте также:  Route add and linux

Но некоторые программы «идут еще дальше и , как сказать, ставят себя в папку /home/имя_пользователя/opt

Узнать, куда разместились файлы программы можно командой:

А через пакетный менеджер можно получить более подробную информацию, включая все графические файлы и тд

Источник

Directory of running program on Linux?

Hey, I’ve been writing a program (a sort of e-Book viewing type thing) and it loads text files from a folder within the folder of which the executable is located. This gives me a bit of a problem since if I run the program from another directory with the command «./folder/folder/program» for example, my program will not find the text, because the working directory isn’t correct. I cannot have an absolute directory because I would like the program to be portable. Is there any way to get the precise directory that the executable is running from even if it has been run from a different directory. I’ve heard could combine argc[0] and getcwd() but argc is truncated when there is a space in the directory, (I think?) so I would like to avoid that if possible. I’m on Linux using g++, Thanx in advance

argc is the argument count; argv is the argument vector (array of pointers to strings). argv[0] is not truncated by spaces; argv[0] is chosen by the program that launches the program and does not necessarily bear any relationship to the path of the program. Don’t add getcwd() if argv[0] starts ‘/’.

4 Answers 4

EDIT — don’t use getcwd(), it’s just where the user is not where the executable is.

On linux /proc//exe or /proc/self/exe should be a symbolic link to your executable. Like others, I think the more important question is «why do you need this?» It’s not really UNIX form to use the executable path to find ancillary files. Instead you use an environment variable or a default location, or follow one of the other conventions for finding the location of ancillary files (ie, ~/.rc).

As plinth recommends: add a config file/directory for the user/system and search full paths. As an example, global config files should go in /etc, while user config files usually are in ~/.rc for a file or under a ~/. directory.

Читайте также:  Режим реального времени linux

Mykola — it’s more 1980’s Macintosh/Windows form. My app lives in one folder and its support files lives relative to it. To find support files, one first finds where the app is.

@plinth: One reason one might need this is, for example, a program which can be installed to either /usr or /usr/local or /opt or $HOME/app or $HOME/.local/ or anywhere else. If you then need to load support files, how do you decide where to look? Worse, what if it’s moved? Finding the executable’s path allows you to package the app without knowing where it will be put. This is my current use case.

When you add a book to your library you can remember its absolute path.
It is not a bad when your program rely on the fact that it will be launched from the working dir and not from some other dir. That’s why there are all kinds of «links» with «working dir» parameter.

You don’t have to handle such situations in the way you want. Just check if all necessary files and dirs structure are in place and log an error with the instructions if they are not.

Or every time when your program starts and doesn’t find necessary files the program can ask to point the path to the Books Library.

I still don’t see the reason to know your current dir name.

#include #include #include int main(int argc, char** argv)

You can get the path of the running program by reading the command line. In linux you can get the command line by reading /proc folder as /proc/PID/CommandLine

argv[0] is not truncated when there are spaces. However, it will only have the program name and not the path when a program is run from a directory listed in the PATH environment variable.

In any case, what you are trying to do here is not good design for a Unix/Linux program. Data files are not stored in the same directory as program files because doing so makes it difficult to apply proper security policies.

The best way to get what you want in my opinion is to use a shell script to launch the actual program. This is very similar to how Firefox launches on Linux systems. The shell places the name of the script into $0 and this variable will always have a path. Then you can use an environment variable or command line argument to give your program the location of the data files, like this:

dir=`dirname "$0"` cd "$dir/../data/" "$dir/real-program" 

And I would arrange your program so that it’s files are somewhat like this:

install-dir/bin/program install-dir/bin/real-program install-dir/etc/config install-dir/data/book-file.mobi 

Источник

Читайте также:  Linux arch linux and gentoo

Program data folders in Linux

This is a more general and noob question. I am developing a small application in Linux (Ubuntu, to be more precise) and at this point I have an executable, a shared library (.so), a configuration file (.conf) with some settings to be read by the application at the beginning, a data folder with images and other resources to be used during the application life-time (resources that can be also modified, deleted) and of course, I would need some file for logs and messages (right now I am using syslog ). So, my question is, where should each one of these be stored when the application is installed on a client’s computer? What is the standard way of organizing all the application’s files in Linux? On Windows everything would be found usually in the C:\Program Files\(App Folder) but it looks like on Linux things are more (or less) organized. Can you give me some advices on this matter?

2 Answers 2

Program data were historically stored in dot-prefixed folders in user’s home directory. Modern Linux distributions tends to use ~/.config/program_name folder.

For all files that will not be modified after distibution follow Linux standard:

So, that is where application specific data is stored (including big resource files, like those used by games ).

I think so. (not exactly sure about very big files). Only modifiable data should go there obviously (for example images distributed with the program go to /usr/share)

~/.config/program_name is for user specific data, common data goes to /usr/share, binaries to /usr/bin, shared libraries to /usr/lib etc. Logs normally go under /var/log, but probably it’s enough to log to syslog, which is system log.

Источник

Оцените статью
Adblock
detector