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

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

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

44:   if (flags & EXT3_APPEND_FL) printf("Append");

45:   if (flags & EXT3_IMMUTABLE_FL) printf("Immutable");

46:   if (flags & EXT3_SYNC_FL) printf("Sync");

47:   if (flags & EXT3_NODUMP_FL) printf("Nodump");

48:

49:   printf("\n");

50:   close(fd);

51:  }

52:

53:  return 0;

54: }

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° похоТая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая устанавливаСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ext3 для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ списка Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ списком Ρ„Π»Π°Π³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π»Π°Π³ прСдставляСтся Π² спискС Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹: А β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для добавлСния (append only), I β€” нСизмСняСмый (immutable), S β€” синхронизированный (sync), N β€” Π½Π΅Π΄Π°ΠΌΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ (nodump). Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ Ρ„Π°ΠΉΠ»Π°; ΠΎΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ устанавливаСт Ρ„Π»Π°Π³ΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

 1: /* setflags.c */

 2:

 3: /* ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” строка, состоящая ΠΈΠ·

 4:    0 (допускаСтся пустая) ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±ΡƒΠΊΠ² ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° I, A, S,

 5:    N. Π­Ρ‚Π° строка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ext3 Π΄ΠΎΠ»ΠΆΠ½Ρ‹

 6:    Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ для Ρ„Π°ΠΉΠ»ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…

 7:    ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки β€” ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ

 8:    Π±ΡƒΠΊΠ²Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ соотвСтствСнно: immutable, append-only, sync ΠΈ nodump.

 9:

10:    НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° "setflags IN file1, file2" Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚

11:    Ρ„Π»Π°Π³ΠΈ immutable ΠΈ nodump для Ρ„Π°ΠΉΠ»ΠΎΠ² file1 ΠΈ file2, Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚

12:    Ρ„Π»Π°Π³ΠΈ sync ΠΈ append-only для этих Ρ„Π°ΠΉΠ»ΠΎΠ². */

13:

14: #include <errno.h>

15: #include <fcntl.h>

16: #include <linux/ext3_fs.h>

17: #include <stdio.h>

18: #include <string.h>

19: #include <sys/ioctl.h>

20: #include <unistd.h>

21:

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

23:  const char **filename = argv + 1;

24:  int fd;

25:  int flags = 0;

26:

27:  /* Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ устанавливаСмыС Ρ„Π»Π°Π³ΠΈ, вмСстС

28:     с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ "0", ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ

29:     Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ всС Ρ„Π»Π°Π³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Ρ‹. */

30:  if (argc<3){

31:   fprintf(stderr, "ИспользованиС setflags: [0][I][A][S][N]"

32:    "<filenames>\n");

33:   return 1;

34:  }

35:

36:  /* каТдая Π±ΡƒΠΊΠ²Π° прСдставляСт Ρ„Π»Π°Π³; ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ

37:     Ρ„Π»Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ */

38:  if (strchr(argv[1], 'I') ) flags |= EXT3_IMMUTABLE_FL;

39:  if (strchr(argv[1], 'A') ) flags |= EXT3_APPEND_FL;

40:  if (strchr(argv[1], 'S') ) flags |= EXT3_SYNC_FL;

41:  if (strchr(argv[1], 'N') ) flags |= EXT3_NODUMP_FL;

42:

43:  /* ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ всСм ΠΈΠΌΠ΅Π½Π°ΠΌ Π² argv[] */

44:  while (*(++filename)) {

45:   /* Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ext3 ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ,

46:      Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор (имя Ρ„Π°ΠΉΠ»Π° Π½Π΅ годится).

47:      Для выполнСния запроса Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ext3 Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ доступ Π½Π° запись,

48:      поэтому O_RDONLY ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚. */

49:   fd = open(*filename, O_RDONLY);

50:   if (fd < 0) {

51:    fprintf(stderr, "Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ %s:%s\n", *filename,

52:     strerror(errno));

53:    return 1;

54:   }

55:

56:   /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² соотвСтствии с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

57:      Ρ„Π»Π°Π³Π°ΠΌΠΈ. */

58:   if (ioctl(fd, EXT3_IOC_SETFLAGS, &flags)) {

59:    fprintf(stderr, "Π‘Π±ΠΎΠΉ ioctl Π² %s:%s\n", *filename,

60:     strerror(errno));

61:    return 1;

62:   }

63:   close(fd);

64:  }

65:

66:  return 0;

67: }

11.4. ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ содСрТимым ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

ВспомнитС, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²) β€” это Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° дисковыС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ (on-disk inodes); ΠΏΠΎΡ‡Ρ‚ΠΈ вся ваТная информация, ΠΊΠ°ΡΠ°ΡŽΡ‰Π°ΡΡΡ Ρ„Π°ΠΉΠ»Π°, хранится Π² Π΅Π³ΠΎ inode. Π’Ρ‹Π·ΠΎΠ² open() позволяСт процСссу ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Π½ΠΎ для создания Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ для манипулирования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², описаны Π² Π³Π»Π°Π²Π΅ 14; Ρ„Π°ΠΉΠ»Ρ‹ сокСтов β€” Π² Π³Π»Π°Π²Π΅ 17. Π’ настоящСм Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ символичСскиС ссылки, Ρ„Π°ΠΉΠ»Ρ‹ устройств ΠΈ FIFO.

11.4.1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ устройств ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ устройств ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° mknod().

#include <fcntl.h>

#include <unistd.h>


int mknod(const char *pathname, mode_t mode, dev_t dev);

pathname β€” это имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, mode β€” это ΠΈ Ρ€Π΅ΠΆΠΈΠΌ доступа (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ модифицируСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ umask), ΠΈ Ρ‚ΠΈΠΏ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (S_IFIFO, S_IFBLK, S_IFCHR). ПослСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, dev, содСрТит ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ (major) ΠΈ младший (minor) Π½ΠΎΠΌΠ΅Ρ€Π° создаваСмого устройства. Π’ΠΈΠΏ устройства (символьноС ΠΈΠ»ΠΈ Π±Π»ΠΎΡ‡Π½ΠΎΠ΅) ΠΈ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ устройства ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ядру, ΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ устройств ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с этим Ρ„Π°ΠΉΠ»ΠΎΠΌ устройства. Младший Π½ΠΎΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ устройства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ устройства срСди ΠΌΠ½ΠΎΠ³ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ управляСт. Волько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ root Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ устройств; ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΆΠ΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ.

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <sys/sysmacros.h> прСдставляСт Ρ‚Ρ€ΠΈ макроса для манипулирования значСниями Ρ‚ΠΈΠΏΠ° dev_t. ΠœΠ°ΠΊΡ€ΠΎΡ makedev() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅, младшиС β€” Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ dev_t, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ mknod(). ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ major() ΠΈ minor() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° dev_t Π² качСствС СдинствСнного Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚, соотвСтствСнно, ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ ΠΈ младший Π½ΠΎΠΌΠ΅Ρ€ устройства.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mknod, доступная Π² Linux, прСдоставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс ΠΊ систСмному Π²Ρ‹Π·ΠΎΠ²Ρƒ mknod() (подробности см. Π² man 1 mknod). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° упрощСнная рСализация mknod для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ систСмного Π²Ρ‹Π·ΠΎΠ²Π° mknod(). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт Ρ„Π°ΠΉΠ» с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ доступа 0666 (прСдоставляя ΠΏΡ€Π°Π²ΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись всСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ) ΠΈ зависит ΠΎΡ‚ систСмной установки umask процСсса для получСния ΠΏΡ€Π°Π² доступа.

 1: /* mknod.с */

 2:

 3: /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ устройство ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС.

 4:    Π‘ΠΌ. подробности ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

 5:    Π½Π° man-страницС mknod(1). */

 6:

 7: #include <errno.h>

 8: #include <stdio.h>

 9: #include <stdlib.h>

10: #include <string.h>

11: #include <sys/stat.h>

12: #include <sys/sysmacros.h>

13: #include <unistd.h>

14:

15: void usage(void) {

16:  fprintf (stderr, "использованиС: mknod <ΠΏΡƒΡ‚ΡŒ> [b | с | u | p]"

17:   "<ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ> <младший>\n");

18:  exit(1);

19: }

20:

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

22:  int major = 0, minor = 0;

23:  const char *path;

24:  int mode = 0666;

25:  char *end;

26:  int args;

27:

28:  /* ВсСгда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ‚ΠΈΠΏ создаваСмого inode

29:     ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ. */

30:  if (argc < 3) usage();

31:

32:  path = argv[1];

33:

34:  /* Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ создаваСмого ΡƒΠ·Π»Π° */

35:  if (!strcmp(argv[2], "b")) {

36:   mode | = S_IFBLK;

37:   args = 5;

38:  } else if (!strcmp(argv[2] , "с") || !strcmp(argv[2], "u")) {

39:   mode |= S_IFCHR;

40:   args = 5;

41:  } else if(!strcmp(argv[2], "p")) {

42:   mode |= S_IFIFO;

43:   args = 3;

44:  } else {

45:   fprintf(stderr, "нСизвСстный Ρ‚ΠΈΠΏ ΡƒΠ·Π»Π° %s\n", argv[2]);

46:   return 1;

47:  }

48:

49:  /* args сообщаСт, сколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² оТидаСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ

50:    большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ создания устройств, Ρ‡Π΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²*/

51:  if (argc != args) usage();

52:

53:  if (args == 5) {

54:   /* ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ ΠΈ младший Π½ΠΎΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° устройств,

55:      ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ */

56:   major = strtol(argv[3], &end, 0);

57:   if (*end) {

58:    fprintf(stderr,"Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ %s\n", argv[3]);

59:    return 1;

60:   }

61:

62:   minor = strtol(argv[4], &end, 0);

63:   if (*end) {

64:    fprintf(stderr, "Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ младший Π½ΠΎΠΌΠ΅Ρ€ %s\n", argv[4]);

65:    return 1;

66:   }

67:  }

68:

69:  /* Ссли создаСтся ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», Ρ‚ΠΎ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

70:     игнорируСтся */

71:  if (mknod(path, mode, makedev(major, minor))) {

72:   fprintf(stderr, "Π²Ρ‹Π·ΠΎΠ² mknod Π½Π΅ удался : %s\n", strerror(errno));