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_DUPEDdup()dup2()dup()dup2()9.4.3.3. Π Π°Π±ΠΎΡΠ° Ρ ΡΠ»Π°Π³Π°ΠΌΠΈ ΡΡΠ°ΡΡΡΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΡΠ΅ΠΆΠΈΠΌΠ°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ°
Π ΡΠ°Π·Π΄Π΅Π»Π΅ 4.6.3 Β«ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡ ΠΊ
open()open()Π’Π°Π±Π»ΠΈΡΠ° 9.4. Π€Π»Π°Π³ΠΈ O_xx Π΄Π»Ρ
open()creat()fcntl()| ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ | Π€ΡΠ½ΠΊΡΠΈΠΈ | Π€Π»Π°Π³ΠΈ |
|---|---|---|
| ΠΠΎΡΡΡΠΏ ΠΊ ΡΠ°ΠΉΠ»Ρ | open()fcntl() | O_RDONLYO_RDWRO_WRONLY |
| Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° | open() | O_CREATO_EXCLO_NOCTTYO_TRUNC |
| Π‘ΡΠ°ΡΡΡ ΡΠ°ΠΉΠ»Π° | open()fcntl() | O_APPENDO_DSYNCO_NONBLOCKO_RSYNCO_SYNC |
ΠΠΎΠΌΠΈΠΌΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ»Π°Π³ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ
open()fcntl()cmdF_GETFLF_SETFLO_NONBLOCKint 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_ACCMODEfd_flags = fcntl(fd, F_GETFL);switch (fd_flags & O_ACCESS) {case O_RDONLY:Β /* ...Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ... */Β break;case O_WRONLY:Β /* ...Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ... */Β break;case O_RDWR:Β /* ...Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ... */Β break;}POSIX ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ
O_RDONLYO_RDWRO_WRONLYΠΡΠΏΠΎΠ»ΡΠ·ΡΡ
F_SETFLO_APPEND9.4.3.4. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ Π΄Π»Ρ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ FIFO
Π Π°Π½Π΅Π΅ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ°Π±ΠΎΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΠΌΡ Π»ΡΠ΄ΡΠΌΠΈ, ΠΌΠΎΡΡΠΈΠΌΠΈ ΠΈ Π²ΡΡΠΈΡΠ°ΡΡΠΈΠΌΠΈ ΡΠ°ΡΠ΅Π»ΠΊΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΡΠΈΠ»ΠΊΠΈ; ΠΊΠΎΠ³Π΄Π° ΡΡΡΠΈΠ»ΠΊΠ° Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΌΠΎΡΡΠΈΠΉ, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΏΡΡΡΠ΅Π΅Ρ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π²ΡΡΠΈΡΠ°ΡΡΠΈΠΉ. ΠΡΠΎ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅
write()read()Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ ΠΎΠΏΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΡΠΈΠ»ΠΊΠΈ, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎ ΡΡΠΎΡΡΡ. [101] ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π½Π΅Π·Π°Π½ΡΡΡΠΉ ΡΡΠΏΡΡΠ³ ΠΌΠΎΠ³ Π±Ρ ΠΏΠΎΠΉΡΠΈ ΠΈ Π½Π°ΠΉΡΠΈ Π΄ΡΡΠ³ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΊΡΡ Π½Π΅ (ΡΠ°ΠΊΡΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΊΡΠΎΡΠ΅ΠΊ Π·Π° Π΄Π΅ΡΡΠΌΠΈ Π½Π° ΠΏΠΎΠ»Ρ), ΠΏΠΎΠΊΠ° ΡΡΡΠΈΠ»ΠΊΠ° ΡΠ½ΠΎΠ²Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ²Π°.
ΠΠ° ΡΠ·ΡΠΊΠ΅ Unix/POSIX ΡΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠΌ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄, Ρ.Π΅. Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ΅Π΅ Π½Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ (Π΄Π»Ρ ΡΠΈΡΠ°ΡΡΠ΅Π³ΠΎ) ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΡΡΠ° (Π΄Π»Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠ΅Π³ΠΎ). ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΈ FIFO, Π° Π½Π΅ ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌ, ΡΠ°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Ρ, ΠΈ ΠΊ ΡΠ΅ΡΠ΅Π²ΡΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΠΌ, ΠΎΠ±Π΅ ΡΡΠΈ ΡΠ΅ΠΌΡ Π²ΡΡ ΠΎΠ΄ΡΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ.
Π‘ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
open()O_NONBLOCKfcntl()open()read()