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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

int new_fd = fcntl(old_fd, F_DUPFD, 7);

Β /* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 7 ΠΈ максимумом ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π° */

int new_fd = dup2(old_fd, 7);

Β /* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7 ΠΈΠ»ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π° */

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

dup()
, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наимСньший свободный дСскриптор Ρ„Π°ΠΉΠ»Π°, использовав '
fcntl(old_fd, F_DUPED, 0)
'.

Если Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто индСксами Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ€Π°Π±ΠΎΡ‚Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ясна. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ просто прСдоставляСт индСкс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ядро Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ поиск Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ дСскриптора Ρ„Π°ΠΉΠ»Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ Π² собствСнном ΠΊΠΎΠ΄Π΅

fcntl()
с
F_DUPED
ΠΈΠ»ΠΈ
dup()
ΠΈΠ»ΠΈ
dup2()
, Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни являСтся Π΄Π΅Π»ΠΎΠΌ вкуса. ВсС Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ API ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ POSIX ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π£ нас Π»Π΅Π³ΠΊΠΎΠ΅ пристрастиС ΠΊ
dup()
ΠΈ
dup2()
, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π±ΠΎΠ»Π΅Π΅ спСцифичны Π² своих дСйствиях, поэтому ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈΡΡ. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΎΠ½ΠΈ довольно просты, эта аргумСнтация ΠΌΠΎΠΆΠ΅Ρ‚ вас Π½Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒ.

9.4.3.3. Π Π°Π±ΠΎΡ‚Π° с Ρ„Π»Π°Π³Π°ΠΌΠΈ статуса Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ доступа

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.6.3 Β«Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ

open()
Β» ΠΌΡ‹ прСдоставили ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Ρ„Π»Π°Π³ΠΎΠ² O_xx, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚
open()
. POSIX Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ… ΠΏΠΎ функциям, классифицируя Π² соотвСтствии с Ρ‚Π°Π±Π». 9.4.

Π’Π°Π±Π»ΠΈΡ†Π° 9.4. Π€Π»Π°Π³ΠΈ O_xx для

open()
,
creat()
ΠΈ
fcntl()

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π€Π»Π°Π³ΠΈ
Доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ
open()
,
fcntl()
O_RDONLY
,
O_RDWR
,
O_WRONLY
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°
open()
O_CREAT
,
O_EXCL
,
O_NOCTTY
,
O_TRUNC
Бтатус Ρ„Π°ΠΉΠ»Π°
open()
,
fcntl()
O_APPEND
,
O_DSYNC
,
O_NONBLOCK
,
O_RSYNC
,
O_SYNC

Помимо ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ установки Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

open()
, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
fcntl()
для получСния Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… установок, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡ… измСнСния. Π­Ρ‚ΠΎ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
cmd
F_GETFL
ΠΈ
F_SETFL
соотвСтствСнно. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для измСнСния установки Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π»Π°Π³Π°,
O_NONBLOCK
, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

int fd_flags;

if ((fd_flags = fcntl(fd, F_GETFL)) < 0)

Β /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ */

if ((fd_flags & O_NONBLOCK) != 0) { /* УстановлСн Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π»Π°Π³ */

Β fd_flags &= ~O_NONBLOCK; /* Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ */

Β if (fcntl(fd, F_SETFL, fd_flags) != 0) /* Π”Π°Ρ‚ΡŒ ядру Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ */

Β  /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ */

}

Помимо самих Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² имСнованная константа

O_ACCMODE
являСтся маской, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для выдСлСния ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΏΡ€Π°Π² доступа.

fd_flags = fcntl(fd, F_GETFL);

switch (fd_flags & O_ACCESS) {

case O_RDONLY:

Β /* ...дСйствия Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния... */

Β break;

case O_WRONLY:

Β /* ...дСйствия Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для записи... */

Β break;

case O_RDWR:

Β /* ...дСйствия для чтСния ΠΈ записи... */

Β break;

}

POSIX Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹

O_RDONLY
,
O_RDWR
ΠΈ
O_WRONLY
Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, гарантируСтся, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ являСтся простым способом опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ

F_SETFL
Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти Ρ€Π΅ΠΆΠΈΠΌΡ‹, хотя ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ примСняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€Π°Π² доступа. Богласно справочной страницС GNU/Linux fcnlt(2) Ρ„Π»Π°Π³
O_APPEND
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½, Ссли ΠΎΠ½ использовался ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°.

9.4.3.4. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ для ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ FIFO

Π Π°Π½Π΅Π΅ для описания способа Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΌΡ‹ использовали сравнСниС с двумя людьми, ΠΌΠΎΡŽΡ‰ΠΈΠΌΠΈ ΠΈ Π²Ρ‹Ρ‚ΠΈΡ€Π°ΡŽΡ‰ΠΈΠΌΠΈ Ρ‚Π°Ρ€Π΅Π»ΠΊΠΈ с использованиСм ΡΡƒΡˆΠΈΠ»ΠΊΠΈ; ΠΊΠΎΠ³Π΄Π° ΡΡƒΡˆΠΈΠ»ΠΊΠ° заполняСтся, останавливаСтся ΠΌΠΎΡŽΡ‰ΠΈΠΉ, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° пустССт, останавливаСтся Π²Ρ‹Ρ‚ΠΈΡ€Π°ΡŽΡ‰ΠΈΠΉ. Π­Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅

write()
ΠΈΠ»ΠΈ
read()
, оТидая Π»ΠΈΠ±ΠΎ освобоТдСния ΠΊΠ°Π½Π°Π»Π°, Π»ΠΈΠ±ΠΎ появлСния Π² Π½Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ….

Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ опустСния ΠΈΠ»ΠΈ заполнСния ΡΡƒΡˆΠΈΠ»ΠΊΠΈ, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ просто Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎ ΡΡ‚ΠΎΡΡ‚ΡŒ. [101] ВмСсто этого нСзанятый супруг ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΠΎΠΉΡ‚ΠΈ ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΠΊΡƒΡ…Π½Π΅ (Ρ‚Π°ΠΊΡƒΡŽ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅Ρ‚Π°Π½ΠΈΠ΅ всСх ΠΊΡ€ΠΎΡˆΠ΅ΠΊ Π·Π° Π΄Π΅Ρ‚ΡŒΠΌΠΈ Π½Π° ΠΏΠΎΠ»Ρƒ), ΠΏΠΎΠΊΠ° ΡΡƒΡˆΠΈΠ»ΠΊΠ° снова Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Π°.

На языкС Unix/POSIX эта концСпция обозначаСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄, Ρ‚.Π΅. Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ошибки, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° отсутствиС Π΄Π°Π½Π½Ρ‹Ρ… (для Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ) ΠΈΠ»ΠΈ отсутствиС мСста (для Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ). ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ примСняСтся ΠΊ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΈ FIFO, Π° Π½Π΅ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ Π½Π° дискС. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ устройствам, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, ΠΈ ΠΊ сСтСвым соСдинСниям, ΠΎΠ±Π΅ эти Ρ‚Π΅ΠΌΡ‹ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ.

Π‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ

open()
ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π»Π°Π³
O_NONBLOCK
для указания Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн ΠΈ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
fcntl()
. Для
open()
ΠΈ
read()
Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ прост.