Linux proc self exe

In my C++ application, my application does an execv() in a fork() ed child process to use the same executable to process some work in a new child process with different arguments that communicates with pipes to the parent process. To get the pathname to self, I execute the following code on the Linux port (I have different code on Macintosh):

 const size_t bufSize = PATH_MAX + 1; char dirNameBuffer[bufSize]; // Read the symbolic link '/proc/self/exe'. const char *linkName = "/proc/self/exe"; const int ret = int(readlink(linkName, dirNameBuffer, bufSize - 1)); 

However, if while the executable is running, I replace the executable with an updated version of the binary on disk, the readlink() string result is: «/usr/local/bin/myExecutable (deleted)» I understand that my executable has been replaced by a newer updated version and the original for /proc/self/exe is now replaced, however, when I go to execv() it now fails with the errno 2 — No such file or directory. due to the extra trailing » (deleted)» in the result. I would like the execv() to either use the old executable for self, or the updated one. I could just detect the string ending with » (deleted)» and modify it to omit that and resolve to the updated executable, but that seems clumsy to me. How can I execv() the current executable (or its replacement if that is easier) with a new set of arguments when the original executable has been replaced by an updated one during execution?

Источник

7.2.1. Файл /proc/self

В файловой системе /proc есть дополнительный элемент, позволяющий программам находить информацию о своем собственном процессе. Файл /proc/self является символической ссылкой на каталог, соответствующий текущему процессу. Естественно, содержимое ссылки меняется в зависимости от того, кто к ней обращается.

Например, программа, представленная в листинге 7.2, с помощью файла /proc/self определяет свой идентификатор процесса (это делается лишь в демонстрационных целях, гораздо проще пользоваться функцией getpid(), описанной в разделе 3.1.1, «Идентификаторы процессов»). Для чтения содержимого символической ссылки вызывается функция readlink() (описана в разделе 8.11, «Функция readlink(): чтение символических ссылок»).

Листинг 7.2. (get-pid.c) Получение идентификатора процесса из файла /proc/self

/* Определение идентификатора вызывающего процесса

на основании символической ссылки /proc/self. */

/* Чтение содержимого символической ссылки. */

readlink(«/proc/self», target, sizeof(target));

/* Адресатом ссылки является каталог, имя которого соответствует

printf(«/proc/self reports process id %d «,

printf(«getpid() reports process id %d «, (int)getpid());

Читайте также

Файл

Файл Файл – это логически обособленная, именованная совокупность данных (текстовых, графических, звуковых, видеоданных), которая может храниться на различных носителях информации (жестком диске, компакт-диске, «флэшке», дискете) и рассматривается при хранении и

Файл

Файл Пункты меню Файл сгруппированы в несколько блоков:Первый из них посвящен созданию новых файлов. Пункт Создать предполагает открытие в окне редактирования пустого документа. Пункт Создать из шаблона предоставляет на выбор с десяток вариантов, позволяющих создать

Читайте также:  Kali linux установить gui

REG-файл

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

7.2.3. Настройка /proc

7.2.3. Настройка /proc Здесь мы запускаем пересылку пакетов (IP forwarding), записав единицу в файл /proc/sys/net/ipv4/ip_forward таким способом:echo «1» > /proc/sys/net/ipv4/ip_forwardПРЕДУПРЕЖДЕНИЕ: Наверное стоит задуматься над тем где и когда включать пересылку (IP forwarding). В этом и в других сценариях в данном

7.8. Псевдофайловая система /proc

7.8. Псевдофайловая система /proc 7.8.1. Кратко о /proc Псевдофайловая система /proc является специальным механизмом, который позволяет получать информацию о системе от самого ядра, а также передавать информацию ядру, модулям ядра и его процессам.Файловая система /proc находится в

7.8.1. Кратко о /proc

7.8.1. Кратко о /proc Псевдофайловая система /proc является специальным механизмом, который позволяет получать информацию о системе от самого ядра, а также передавать информацию ядру, модулям ядра и его процессам.Файловая система /proc находится в оперативной памяти компьютера,

Файл desktop.ini

Файл desktop.ini Еще один интересный специальный файл, с помощью которого можно выполнить настройку оболочки Windows XP. Например, с его помощью можно изменить значок для папки, в которой он будет находиться, создать для нее описание и сделать многое другое. Для примера попробуем

Файл

Файл Чтобы установить на записываемый компакт-диск пароль, перейдите на вкладку Файл (см. рис. 12.1) и введите пароль в поле, расположенное слева от кнопки Р. Защита паролем доступна только для Главного меню (обратите внимание на положение переключателя Тип меню). Чтобы

Файл pkg-plist

Файл pkg-plist Файл составляется как раз на основе протокола инсталляции install.log, который был сохранен во время установки программы. Следует также учесть, что программы для KDE часто используют локальные скрипты libtool, которые устанавливают динамические библиотеки, используя

Глава 7 Файловая система /proc

Глава 7 Файловая система /proc Попробуйте запустить команду mount без аргументов — она выдаст список файловых систем, смонтированных в настоящий момент. Среди прочих строк будет и такая:none on /proc type proc (rw)Она указывает на специальную файловую систему /proc. Поле none говорит о том,

Глава 27. /dev и /proc

Глава 27. /dev и /proc Как правило, Linux или UNIX система имеет два каталога специального назначения: /dev и

Источник

/proc/self/exe

Доброго времени суток! Процесс «/usr/sbin/apache2» вызывает дочерний процесс «maxima» — это математический пакет, web прилажуха делает подсчеты на нем. Процесс «maxima» периодически порождает дочерний процесс «/proc/self/exe». (https://cloud.mail.ru/public/9t17/1wrhKHvcq) Все бы нечего, если бы не зависания этого процесса (/proc/self/exe), то есть родительские процессы завершились, а «/proc/self/exe» весит пока его не грохнуть, при этом он может сжирать 1-4ГБ RAM или занимать чем-то одно ядро под 100%. (https://cloud.mail.ru/public/8PEp/33dhEd6Pf)

Вопрос, можно ли как то отслеживать таких «потеряшек» у которых родитель давно сдох, а сам «/proc/self/exe» уже как зомби и убивать? Или следить за всеми «/proc/self/exe» которые живут больше 5 минут? OS: Ubuntu 16.04

Читайте также:  Linux grep first line

правильное решение: «чинить» этот «дочерний процесс дочернего процесса», чтобы он всё-таки завершался сам.

А так да, отлавливаешь «зомби» и грохаешь.

Пример (должно «отлавливать», но проверить не могу — «зомби» сейчас нет в системе. )

это первый шаг, дальше по этим PID делаешь kill.

IIRC зомби память не жрут. Это тушки proc структуры, спросить о состоянии которых никто не озаботился (wait4 и товарищи).

То, что у тебя — это R (running) процесс, про который, похоже что забыли. Т.е. ему есть ещё, что сказать, но его уже никто не слушает и не прибивает.

Вероятная причина: оборванне веб-сессии. Т.е. оно что-то расчитало, но сообщить об этом уже никому не может.

Решается не брут-форсом (килл по крону и подобному), а переосмыслением процесса взаимодействия.

зомби можно убить? по-моему там только перезагрузка жи ни?

Зомби убить нельзя (потерян контролирующий терминал), но и память они не занимают.

Оговорился, у них статус «D» и они живут пока не кильнешь, один процесс жил больше суток, специально записал себе его PID и оставлял в живых.

нет, я их никогда не пытался kill, мне обычно вполне «живые» процессы убирать приходилось (пытались «захватить» всю память). если другого средства нет кроме kill — что-то «не то» с системой, программой.

Похожие темы

  • Форум /proc//exe (2008)
  • Форум Аналог /proc/self/maps (2015)
  • Форум почему /proc/$$ и /proc/self могут отличатся? (2013)
  • Форум /proc/self/loginuid для чего нужен?! (2021)
  • Форум Не дают прочитать /proc/self/io ! (2021)
  • Форум Обновить /proc/self/mounts в lxc (2023)
  • Форум /proc/self/cmdline или проще? [python] (2007)
  • Форум [:] exe -> swf (2009)
  • Форум sub2.exe (2004)
  • Форум uptime@self (2015)

Источник

Which process is `/proc/self/` for?

There are always multiple processes running concurrently, so which process is «the currently running process»? Does «the currently running process» have anything to do with which process is currently running on the CPU, considering context switching? Does «the currently running process» have nothing to do with foreground and background processes?

6 Answers 6

This has nothing to do with foreground and background processes; it only has to do with the currently running process. When the kernel has to answer the question “What does /proc/self point to?”, it simply picks the currently-scheduled pid, i.e. the currently running process (on the current logical CPU). The effect is that /proc/self always points to the asking program’s pid; if you run

you’ll see ls ‘s pid, if you write code which uses /proc/self that code will see its own pid, etc.

This is «accurate» in a sense, but not meaningful to someone who doesn’t understand the kernel’s concept of «current». A better answer would be that it’s the process making the system call with /proc/self as part of the pathname in one of its arguments.

If self means the current process that is scheduled on the logical CPU, why aren’t there multiple self entries on a multi-core system?

@Darkov in the same way that there’s only one word for “self” in English even though you and I have distinct selves which exist simultaneously. The kernel always knows which process is asking about /proc/self .

Читайте также:  Cat linux команда more

@Ivan_Bereziuk it’s not bash’s philosophy, it’s the philosophy of pretty much all operating systems with multiple processes (including single-tasking OSs like DOS): a process which wants to run another program, and regain control once the second program has finished, needs to run it in a separate process. Process creation is cheap on Linux.

The one that accesses the symlink (calls readlink() on it, or open() on a path through it). It would be running on the CPU at the time, but that’s not relevant. A multiprocessor system could have several processes on the CPU simultaneously.

Foreground and background processes are mostly a shell construct, and there’s no unique foreground process either, since all shell sessions on the system will have one.

The wording could have been better but then again any wording you try to compose to express the idea of self reference is going to be confusing. The name of the directory is more descriptive in my opinion.

Basically, /proc/self/ represents the process that’s reading /proc/self/ . So if you try to open /proc/self/ from a C program then it represents that program. If you try to do it from the shell then it is the shell etc.

But what if you have a quad core CPU capable of running 4 processes simultaneously, for real, not multitasking?

Then each process will see a different /proc/self/ for real without being able to see each other’s /proc/self/ .

How does this work?

Well, /proc/self/ is not really a folder. It is a device driver that happens to expose itself as a folder if you try to access it. This is because it implements the API necessary for folders. The /proc/self/ directory is not the only thing that does this. Consider shared folders mounted from remote servers or mounting USB thumbdrives or dropbox. They all work by implementing the same set of APIs that make them behave like folders.

When a process tries to access /proc/self/ the device driver will generate its contents dynamically by reading data from that process. So the files in /proc/self/ does not really exist. It’s kind of like a mirror that reflects back on the process that tries to look at it.

Is it really a device driver? You sound like you’re oversimplifying things!

Yes, it really is. If you want to be pedantic it’s a kernel module. But if you check out usenet postings on the various Linux developers channels most kernel developers use «device driver» and «kernel module» interchangeably. I used to write device drivers, err. kernel modules, for Linux. If you want to write your own interface in /proc/ , say for example you want a /proc/unix.stackexchange/ filesystem that returns posts from this website you can read about how to do it in the venerable «Linux Device Drivers» book published by O’Reilly. It’s even available as softcopy online.

Источник

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