Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 39

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, прСдставлСнная Π² листингС 7.2, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° /proc/self опрСдСляСт свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса (это дСлаСтся лишь Π² дСмонстрационных цСлях, Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ getpid(), описанной Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 3.1.1, "Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ процСссов"). Для чтСния содСрТимого символичСской ссылки вызываСтся функция readlink() (описана Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.11, "Ѐункция readlink(): Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ символичСских ссылок").

Листинг 7.2. (get-pid.c) ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /proc/self

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>


/* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса

   Π½Π° основании символичСской ссылки /proc/self. */

pid_t get_pid_from_proc_self() {

 char target[32];

 int pid;

 /* Π§Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого символичСской ссылки. */

 readlink("/proc/self", target, sizeof(target));

 /* АдрСсатом ссылки являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ соотвСтствуСт

    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ процСсса. */

 sscanf(target, "%d", &pid);

 return (pid_t)pid;

}


int main() {

 printf("/proc/self reports process id %d\n",

  (int)get_pid_from_proc_self());

 printf("getpid() reports process id %d\n", (int)getpid());

 return 0;

}

7.2.2. Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² процСсса

Π€Π°ΠΉΠ» cmdline Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС /proc содСрТит список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² процСсса (см. Ρ€Π°Π·Π΄Π΅Π» 2.1.1. "Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²"). Π­Ρ‚ΠΎΡ‚ список прСдставлСн ΠΎΠ΄Π½ΠΎΠΉ строкой, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ символами. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом оканчиваСтся вся строка, поэтому ΠΎΠ½ΠΈ Π½Π΅ смогут ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» cmdline.

Π’ листингС 2.1 ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² cmdline Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΡƒΡŽ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса. Π•Π΅ тСкст ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 7.3. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² строкС Ρ„Π°ΠΉΠ»Π° cmdline ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ нСсколько Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… символов, Π΅Π΅ Π΄Π»ΠΈΠ½Ρƒ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strlen() (ΠΎΠ½Π° лишь подсчитываСт число символов, ΠΏΠΎΠΊΠ° Π½Π΅ встрСтится Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ). ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ read(), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ².

Листинг 7.3. (print-arg-list.c) ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ процСсса

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>


/* Π’Ρ‹Π²ΠΎΠ΄ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π² строкС) процСсса

   с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. */

void print_process_arg_list(pid_t pid) {

 int fd;

 char filename[24];

 char arg_list[1024];

 size_t length;

 char* next_arg;


 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° cmdline

    для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса. */

 snprintf(filename, sizeof(filename), "/proc/%d/cmdline",

  (int)pid);

 /* Π§Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого Ρ„Π°ΠΉΠ»Π°. */

 fd = open(filename, O_RDONLY);

 length = read(fd, arg_list, sizeof(arg_list));

 close(fd);

 /* Ѐункция read() Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ† тСкста Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ,

    поэтому Π΅Π³ΠΎ приходится Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. */

 arg_list[length] = '\0';

 /* ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². АргумСнты ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°

    Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ символами. */

 next_arg = arg_list;

 while (next_arg < arg_list + length) {

  /* Π’Ρ‹Π²ΠΎΠ΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… оканчиваСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ

     символом ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ интСрпрСтируСтся ΠΊΠ°ΠΊ обычная строка. */

  printf("%s\n", next_arg);

  /* ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

     заканчиваСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом, функция strlen() вычисляСт

     Π΄Π»ΠΈΠ½Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Π½Π΅ всСго списка. */

  next_arg += strlen(next_arg) + 1;

 }

}


int main(int argc, char* argv[]) {

 pid_t pid = (pid_t)atoi(argv[1]);

 print_process_arg_list(pid);

 return 0;

}

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€ процСсса систСмного Π΄Π΅ΠΌΠΎΠ½Π° syslogd Ρ€Π°Π²Π΅Π½ 372.

% ps 372

 PID TTY STAT TIME COMMAND

 372 ?   S    0:00 syslogd -m 0

% ./print-arg-list 372

syslogd

-m

0

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° print-arg-list, сообщаСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΌΠΎΠ½ syslogd Π²Ρ‹Π·Π²Π°Π½ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ -m 0.

7.2.3. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды процСсса

Π€Π°ΠΉΠ» environ содСрТит список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ процСсс (см. Ρ€Π°Π·Π΄Π΅Π» 2.1.6, "Π‘Ρ€Π΅Π΄Π° выполнСния"). Как ΠΈ Π² случаС Ρ„Π°ΠΉΠ»Π° cmdline, элСмСнты списка Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ символами. Π€ΠΎΡ€ΠΌΠ°Ρ‚ элСмСнта Ρ‚Π°ΠΊΠΎΠ²: ΠŸΠ•Π Π•ΠœΠ•ΠΠΠΠ―=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Π°Ρ Π² листингС 7.4 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая Π±Ρ‹Π»Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² листингС 2.3. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ список Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡ‹ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc.

Листинг 7.4. (print-environment.c) ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды процСсса

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>


/* Π’Ρ‹Π²ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π² строкС) процСсса

   с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. */

void print_process_environment(pid_t pid) {

 int fd;

 char filename[24];

 char environment[8192];

 size_t length;

 char* next_var;


 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° environ

    Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса. */

 snprintf(filename, sizeof(filename), "/proc/%d/environ",

  (int)pid);

 /* Π§Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого Ρ„Π°ΠΉΠ»Π°. */

 fd = open(filename, O_RDONLY);

 length = read(fd, environment, sizeof (environment));

 close(fd);

 /* Ѐункция read() Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ† тСкста Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ,

    поэтому Π΅Π³ΠΎ приходится Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. */

 environment[length] = ' \0';


 /* ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ списка ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°

    Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ символами. */

 next_var = environment;

 while (next_var < environment + length) {

  /* Π’Ρ‹Π²ΠΎΠ΄ элСмСнтов списка. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… оканчиваСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ

     символом ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ интСрпрСтируСтся ΠΊΠ°ΠΊ обычная строка. */

  printf("%s\n", next_var);

  /* ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт

     списка заканчиваСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом, функция strlen()

     вычисляСт Π΄Π»ΠΈΠ½Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта, Π° Π½Π΅ всСго списка. */

  next_var += strlen(next_var) + 1;

 }

}


int main(int argc, char* argv[]) {

 pid_t pid = (pid_t)atoi(argv[1]);

 print_process_environment(pid);

 return 0;

}

7.2.4. Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» процСсса

Π€Π°ΠΉΠ» exe ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° исполняСмый Ρ„Π°ΠΉΠ» процСсса. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.1.1, "Бписок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²", Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ имя исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ пСрСдаСтся Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Но это лишь распространСнноС соглашСниС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ списком Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π€Π°ΠΉΠ» exe Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc β€” это Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ способ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ исполняСмый Ρ„Π°ΠΉΠ» Π·Π°ΠΏΡƒΡ‰Π΅Π½ процСссом.

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΡƒΡ‚ΡŒ ΠΊΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ Π·Π°Π΄Π°Π½ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°, поэтому Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ находится. Ѐункция get_executable_path() Π² листингС 7.5 опрСдСляСт ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°, провСряя ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку /proc/self/exe.

Листинг 7.5. (get-exe-path.c) ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°

#include <limits.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>


/* НахоТдСниС ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°.

   ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя помСщаСтся Π² строку BUFFER, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ

   Ρ€Π°Π²Π½Π° LEN. ВозвращаСтся число символов Π² ΠΈΠΌΠ΅Π½ΠΈ Π»ΠΈΠ±ΠΎ

   -1 Π² случаС ошибки. */

size_t get_executable_path(char* buffer, size_t len) {

 char* path_end;

 /* Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ содСрТимого символичСской ссылки /proc/self/exe. */

 if (readlink("/proc/self/exe", buffer, len) <= 0)

  return -1;

 /* НахоТдСниС послСднСй косой Ρ‡Π΅Ρ€Ρ‚Ρ‹, ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ ΠΏΡƒΡ‚Π΅Π²ΠΎΠ΅ имя. */

 path_end = strrchr(buffer, '/');

 if (path_end == NULL)

  return -1;

 /* ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ символу, стоящСму Π·Π° послСднСй косой Ρ‡Π΅Ρ€Ρ‚ΠΎΠΉ. */