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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 77

Автор Майкл ДТонсон

Ѐункция setutent() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π°Ρ‡Π°Π»ΠΎ.

Ѐункция endutent() Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор ΠΈ освобоТдаСт ассоциированныС Π΄Π°Π½Π½Ρ‹Π΅. Π’Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ endutent() ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм utmpname() для доступа ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ utmp, Ρ‚Π°ΠΊ ΠΈ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ utmp.

НаиболСС Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ способом ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… wtmp ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ BSD ΠΈ доступныС ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ glibc.

Ѐункция updwtmp() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ имя Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… wtmp (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ _PATH_WTMP) ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡƒΡŽ структуру struct utmp, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт ΠΊ Ρ„Π°ΠΉΠ»Ρƒ wtmp. Π­Ρ‚Π° функция Π½Π΅ сообщаСт ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

Ѐункция logwtmp() являСтся ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ struct utmp ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ updwtmp() для Π½Π΅Π΅. АргумСнт line копируСтся Π² ut_line, name β€” Π² ut_user, host β€” Π² ut_host, ut_tv заполняСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, a ut_pid β€” Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ процСсса. Как ΠΈ updwtmp(), эта функция Π½Π΅ сообщаСт ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ utmp Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ чтСния Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… utmp ΠΈ wtmp.

  1: /* utmp.с */

  2:

  3: #include <stdio.h>

  4: #include <unistd.h>

  5: #include <string.h>

  6: #include <time.h>

  7: #include <sys/time.h>

  8: #include <sys/types.h>

  9: #include <sys/socket.h>

 10: #include <netinet/in.h>

 11: #include <arpa/inet.h>

 12: #include <utmp.h>

 13: #include <popt.h>

 14:

 15: void print_utmp_entry(struct utmp * u) {

 16:  struct tm *tp;

 17:  char * type;

 18:  char addrtext[INET6_ADDRSTRLEN];

 19:

 20:  switch (u->ut_type) {

 21:  case EMPTY: type = "EMPTY"; break;

 22:  case RUN_LVL: type = "RUN_LVL"; break;

 23:  case BOOT_TIME: type = "BOOT_TIME"; break;

 24:  case NEW_TIME: type = "NEW_TIME"; break;

 25:  case OLD_TIME: type = "OLD_TIME"; break;

 26:  case INIT_PROCESS: type = "INIT_PROCESS"; break;

 27:  case LOGIN_PROCESS: type = "LOGIN_PROCESS"; break;

 28:  case USER_PROCESS: type = "USER_PROCESS"; break;

 29:  case DEAD_PROCESS: type = "DEAD_PROCESS"; break;

 30:  case ACCOUNTING: type = "ACCOUNTING "; break;

 31:  }

 32:  printf("%-13s:", type);

 33:  switch (u->ut_type) {

 34:  case LOGIN_PROCESS:

 35:  case USER_PROCESS:

 36:  case DEAD_PROCESS:

 37:   printf(" line: %s", u->ut_line);

 38:   /* fall through */

 39:  case INIT_PROCESS:

 40:   printf("\n pid: %6d id: %4.4s", u->ut_pid, u->ut_id);

 41:  }

 42:  printf ("\n");

 43:  tp = gmtime(&u->ut_tv.tv_sec);

 44:  printf("time: %24.24s.%lu\n", asctime(tp), u->ut_tv.tv_usec);

 45:  switch (u->ut_type) {

 46:  case USER_PROCESS:

 47:  case LOGIN_PROCESS:

 48:  case RUN_LVL:

 49:  case BOOT_TIME:

 50:   printf("ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ: %s\n", u->ut_user);

 51:  }

 52:  if (u->ut_type == USER_PROCESS) {

 53:   if (u->ut_session)

 54:    printf(" сСанс: %lu\n", u->ut_session);

 55:   if (u->ut_host)

 56:    printf (" хост: %s\n", u->ut_host);

 57:   if (u->ut_addr_v6[0]) {

 58:    if (!(u->ut_addr_v6[1] |

 59:     u->ut_addr_v6[2] |

 60:     u->ut_addr_v6[3])) {

 61:     /* Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ адрСс IPV4 */

 62:     inet_ntop(AF_INET, u->ut_addr_v6,

 63:     addrtext, sizeof(addrtext));

 64:     printf(" IPV4: %s\n", addrtext);

 65:    } else {

 66:     inet_ntop(AF_INET_6, u->ut_addr_v6,

 67:      addrtext, sizeof(addrtext));

 68:     printf (" IPV6: %s\n", addrtext);

 69:    }

 70:   }

 71:  }

 72:  if (u->ut_type == DEAD_PROCESS) {

 73:   printf(" Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ : %u: %u\n",

 74:    u->ut_exit.e_termination,

 75:    u->ut_exit.e_exit);

 76:  }

 77:  printf("\n");

 78: }

 79:

 80: struct utmp * get_next_line (char * id, char * line) {

 81:  struct utmp request;

 82:

 83:  if (!id && !line)

 84:   return getutent();

 85:

 86:  memset(&request, 0, sizeof(request));

 87:

 88:  if (line) {

 89:   strncpy(&request.ut_line[0], line, UT_LINESIZE);

 90:   return getutline(&request);

 91:  }

 92:

 93:  request.ut_type = INIT_PROCESS;

 94:  strncpy(&request.ut_id[0], id, 4);

 95:  return getutid(&request);

 96: }

 97:

 98: void print_file(char * name, char * id, char * line) {

 99:  struct utmp * u;

100:

101:  if (utmpname(name)) {

102:   fprintf (stderr, "сбой ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… utmp %s\n", name);

103:   return;

104:  }

105:  setutent();

106:  printf("%s:\n====================\n", name);

107:  while ((u = get_next_line(id, line))) {

108:   print_utmp_entry(u);

109:   /* POSIX Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ очистки статичСских Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄

110:    * ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ getutline ΠΈΠ»ΠΈ getutid

111:    */

112:   memset(u, 0, sizeof(struct utmp));

113:  }

114:  endutent();

115: }

116:

117: int main(int argc, const char **argv) {

118:  char * id = NULL, *line = NULL;

119:  int show_utmp = 1, show_wtmp = 0;

120:  int c;

121:  poptContext optCon;

122:  struct poptOption optionsTable[] = {

123:   {"utmp", 'u', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

124:    &show_utmp, 0,

125:    "ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ просмотр содСрТимого Ρ„Π°ΠΉΠ»Π° utmp", NULL},

126:   { "wtmp", 'w', POPT_ARG_NONE | POPT_ARGFLAG_XOR,

127:     &show_wtmp, 0,

128:     "ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ просмотр содСрТимого Ρ„Π°ΠΉΠ»Π° wtmp", NULL},

129:   {"id", 'i', POPT_ARG_STRING, &id, 0,

130:    "ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ записи процСсса для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° inittab",

131:    "<inittab id>" },

132:   {"line", 'l', POPT_ARG_STRING, &line, 0,

133:    "ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ записи процСсса для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ строки устройства",

134:    "<line>" },

135:   POPT_AUTOHELP

136:   POPT_TABLEEND

137:  };

138:

139:  optCon = poptGetContext("utmp", argc, argv, optionsTable, 0);

140:  if ((c = poptGetNextOpt(optCon)) < -1) {

141:   fprintf(stderr, "%s:%s\n",

142:    poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

143:    poptStrerror(c));

144:   return 1;

145:  }

146:  poptFreeContext(optCon);

147:

148:  if (id && line)

149:   fprintf(stderr, "НСвозмоТно Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ сразу ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΈ строкС,"

150:    "Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎ строкС\n");

151:

152:  if (show_utmp)

153:   print_file(_PATH_UTMP, id, line);

154:  if (show_utmp && show_wtmp)

155:   printf("\n\n\n");

156:  if (show_wtmp)

157:   print_file(_PATH_WTMP, id, line);

158:

159:  return 0;

160: }

16.2. ΠžΠ±Π·ΠΎΡ€ termios

ВсС манипуляции tty ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ структуры, struct termios, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <termios.h>. Из этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠ΅ΡΡ‚ΡŒ. Когда Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Π»ΠΈΠ½ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” tcgetattr() ΠΈ tcsetattr().

#include <termios.h>


struct termios {

 tcflag_t c_iflag; /* Ρ„Π»Π°Π³ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Π²Π²ΠΎΠ΄Π° */

 tcflag_t c_oflag; /* Ρ„Π»Π°Π³ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° */

 tcflag_t c_cflag; /* Ρ„Π»Π°Π³ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° */

 tcflag_t c_lflag; /* Ρ„Π»Π°Π³ΠΈ локального Ρ€Π΅ΠΆΠΈΠΌΠ° */

 cc_t c_line;      /* дисциплина Π»ΠΈΠ½ΠΈΠΈ связи */

 cc_t c_cc[NCCS];  /* ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ символы */

};

int tcgetattr(int fd, struct termios * tp);

int tcsetattr(int fd, int oact, struct termios * tp);

ΠŸΠΎΡ‡Ρ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ tcgetattr() для получСния Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… установок устройства, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти установки, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ tcsetattr() для Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… установок. МногиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ ΠΊΠΎΠΏΠΈΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… установок ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, слСдуСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ вас установки; ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… установок ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ систСмными конфигурациями (ΠΈΠ»ΠΈ сбоями Π² вашСм ΠΊΠΎΠ΄Π΅).

Π’Ρ‹Π·ΠΎΠ² tcsetattr() ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π²Π°ΠΌΠΈ установки; Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ установки. Если ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ просто Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ установку, tcsetattr() ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅, Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Если Π²Π°ΠΌ Π½Π΅Π±Π΅Π·Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ воздСйствиС, ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ установкой, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ tcgetattr() послС tcsetattr() ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΎΠΊΠ°Π·Π°Π»ΠΎ Π»ΠΈ воздСйствиС внСсСнноС Π²Π°ΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.

Для получСния установок устройства tty Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ устройство ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор tcgetattr(). Π­Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ устройствами tty; Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· с Ρ†Π΅Π»ΡŒΡŽ прСдотвращСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° устройств. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„Π»Π°Π³Π° O_NONBLOCK Π² open() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π»ΡŽΠ±Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Однако всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ read(); Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ fcntl() для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π΅ΠΆΠΈΠΌΠ° O_NONBLOCK ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ появится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ.