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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 59

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

#include <sys/types.h>

#include <sys/param.h>

#include <sys/resource.h>

main(int argc, char **argv) {

Β int fd;

Β struct rlimit flim;

Β /* Если Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс β€” init, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ

Β Β Β  Π·Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ сигналы. Если Π½Π΅Ρ‚ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Β Β Β  сигналы, связанныС с Π²Π²ΠΎΠ΄ΠΎΠΌ/Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»

Β Β Β  Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ процСсса: SIGTTOU, SIGTTIN, SIGTSTP */

Β if (getppid() != 1) {

Β Β signal(SIGTTOU, SIG_IGN);

Β  signal(SIGTTIN, SIG_IGN);

Β  signal(SIGTSTP, SIG_IGN);

Β  /* Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΈ сСанс,

Β Β Β Β  Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Однако Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ

Β Β Β Β  сСанса ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ процСсс, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ являСтся Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ.

Β Β Β Β  ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прСдыстория запуска Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ нСизвСстна,

Β Β Β Β  Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° гарантия, Ρ‡Ρ‚ΠΎ наш процСсс Π½Π΅ являСтся Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ.

Β Β Β Β  Для этого ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс. Π’.ΠΊ. Π΅Π³ΠΎ PID ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½,

Β Β Β Β  Ρ‚ΠΎ Π½ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, Π½ΠΈ сСанса с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ сущСствуСт,

Β Β Β Β  Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Π½Π΅Ρ‚ ΠΈ Π»ΠΈΠ΄Π΅Ρ€Π°. ΠŸΡ€ΠΈ этом Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс

Β Β Β Β  Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ΅Π½.

Β Β Β Β  БущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° нСобходимости пороТдСния

Β Β Β Β  Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСсса. Если Π΄Π΅ΠΌΠΎΠ½ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

Β Β Β Β  ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° shell Π½Π΅ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅,

Β Β Β Β  послСдний Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния Π΄Π΅ΠΌΠΎΠ½Π°,

Β Β Β Β  ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½.

Β Β Β Β  ΠŸΠΎΡ€ΠΎΠΆΠ΄Π°Ρ процСсс ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ родитСля,

Β Β Β Β  ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅

Β Β Β Β  Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π΅ΠΌΠΎΠ½Π°, послС Ρ‡Π΅Π³ΠΎ shell Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ своС ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ */

Β  if (fork () !=0)

Β Β  exit(0); /* Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ */

Β Β  /* Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π°

Β Β Β  Β  становится Π»ΠΈΠ΄Π΅Ρ€ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, сСанса ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚

Β Β Β Β Β  ассоциированного Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° */
[28]

Β }

Β /* Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ

Β Β Β  всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы. МаксимальноС число

Β Β Β  ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getrlimit */

Β getrlimit(RLIMIT_NOFILE, &flim);

Β for (fd = 0; fd < flim.rlim_max; fd++)

Β  close(fd);

Β /* Π‘ΠΌΠ΅Π½ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ */

Β  chdir("/");

Β /* Заявим ΠΎ сСбС Π² систСмном ΠΆΡƒΡ€Π½Π°Π»Π΅. Для этого сначала

Β Β Β  установим ΠΎΠΏΡ†ΠΈΠΈ вСдСния ΠΆΡƒΡ€Π½Π°Π»Π°: каТдая запись Π±ΡƒΠ΄Π΅Ρ‚

Β Β Β  ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ PID Π΄Π΅ΠΌΠΎΠ½Π°, ΠΏΡ€ΠΈ нСвозмоТности

Β Β Β  записи Π² ΠΆΡƒΡ€Π½Π°Π» сообщСния Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° консоль,

Β Β Β  источник сообщСний ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊ "систСмный Π΄Π΅ΠΌΠΎΠ½"

Β Β Β  (см. ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ функциям вСдСния ΠΆΡƒΡ€Π½Π°Π»Π° Π½ΠΈΠΆΠ΅). */

Β openlog("Π‘ΠΊΠ΅Π»Π΅Ρ‚ Π΄Π΅ΠΌΠΎΠ½Π°" , LOG_PID | LOG_CONS, LOG_DAEMON);

Β /* ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌΡΡ */

Β syslog(LOG_INFO, "Π”Π΅ΠΌΠΎΠ½ Π½Π°Ρ‡Π°Π» ΠΏΠ»ΠΎΠ΄ΠΎΡ‚Π²ΠΎΡ€Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ...");

Β closelog();

Β /* Π”Π°Π»Π΅Π΅ слСдуСт тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Β Β Β  Π΄Π΅ΠΌΠΎΠ½Π°. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ прСдоставляСтся Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ для собствСнной

Β Β Β  Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. */

Β ...

}

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ использовалось Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠ°ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ систСмного ΠΆΡƒΡ€Π½Π°Π»Π° сообщСний Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сообщСний являСтся syslog(3), ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ сообщСниС Π΄Π΅ΠΌΠΎΠ½Ρƒ систСмного ΠΆΡƒΡ€Π½Π°Π»Π° syslogd(1M), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π»ΠΈΠ±ΠΎ дописываСт сообщСния Π² систСмный ΠΆΡƒΡ€Π½Π°Π», Π»ΠΈΠ±ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΈΡ… консоль, Π»ΠΈΠ±ΠΎ пСрСнаправляСт Π² соотвСтствии со списком ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ систСмы. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ назначСния опрСдСляСтся ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ (/etc/syslog.conf). Ѐункция ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

#include <syslog.h>

void syslog(int priority, char *logstring, /* ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹*/...);

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ

logstring
назначаСтся ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ
priority
. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

LOG_EMERG
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС "ΠΏΠ°Π½ΠΈΠΊΠΈ" Π² систСмС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ рассылаСтся всСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ.
LOG_ALERT
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ исправлСно Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ цСлостности систСмной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….
LOG_CRIT
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ критичСскоС событиС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡˆΠΈΠ±ΠΊΡƒ дискового устройства.
LOG_ERR
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ошибки.
LOG_WARNING
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ прСдупрСТдСния.
LOG_NOTICE
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибками, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ внимания.
LOG_INFO
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ сообщСния, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, использованноС Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.
LOG_DEBUG
Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ сообщСниС, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.