memfd_create(2) - wariua/manpages-ko GitHub Wiki
memfd_create - μ΅λͺ νμΌ λ§λ€κΈ°
#define _GNU_SOURCE /* feature_test_macros(7) μ°Έκ³ */
#include <sys/mman.h>
int memfd_create(const char *name, unsigned int flags);
memfd_create()
λ μ΅λͺ
νμΌμ μμ±ν΄μ κ·Έ νμΌμ κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°ννλ€. κ·Έ νμΌμ μΌλ° νμΌμ²λΌ λμνλ―λ‘ λ³κ²½νκ±°λ μλΌλ΄κ±°λ λ©λͺ¨λ¦¬μ λ§΅ νκ±°λ ν μ μλ€. νμ§λ§ μΌλ° νμΌκ³Ό λ¬λ¦¬ λ¨ μμλ§ μμΌλ―λ‘ κΈ°λ° μ μ₯μκ° νλ°μ±μ΄λ€. νμΌμ λν μ°Έμ‘°κ° λͺ¨λ μμ΄μ§λ©΄ μλμΌλ‘ ν΄μ λλ€. κ·Έ νμΌμ κΈ°λ° νμ΄μ§ λͺ¨λμ μ΅λͺ
λ©λͺ¨λ¦¬κ° μ°μΈλ€. λ°λΌμ memfd_create()
λ‘ λ§λ νμΌμ MAP_ANONYMOUS
νλκ·Έλ‘ mmap(2)μ μ¬μ©ν΄ ν λΉν κ² κ°μ λ€λ₯Έ μ΅λͺ
λ©λͺ¨λ¦¬ ν λΉκ³Ό λμ λ°©μμ΄ κ°λ€.
μ²μμ νμΌμ ν¬κΈ°λ 0μΌλ‘ μ€μ λΌ μλ€. νΈμΆ νμ ftruncate(2)λ₯Ό μ¬μ©ν΄ νμΌ ν¬κΈ°λ₯Ό μ€μ ν΄ μ£Όμ΄μΌ ν κ²μ΄λ€. (λλ write(2)
λ±μ νΈμΆν΄μ νμΌμ μ±μΈ μλ μλ€.)
name
μ μ€ μ΄λ¦μ νμΌλͺ
μΌλ‘ μ°λ©° /proc/self/fd/
λλ ν°λ¦¬μ λμνλ μ¬λ³Όλ¦ λ§ν¬μ λμμΌλ‘ νμλλ€. νμλλ μ΄λ¦ μμ νμ memfd:
κ° λΆμΌλ©° λλ²κΉ
μ©λλ‘ μ°μΌ λΏμ΄λ€. νμΌ λμ€ν¬λ¦½ν°μ λμμ μ΄λ¦μ΄ μν₯μ μ£Όμ§ μμΌλ©° κ·Έλμ μ무 λΆμμ© μμ΄ μ¬λ¬ νμΌμ΄ κ°μ μ΄λ¦μ κ°μ§ μ μλ€.
flags
μ λ€μ κ°λ€μ λΉνΈ OR ν΄μ memfd_create()
μ λμ λ°©μμ λ°κΏ μ μλ€.
MFD_CLOEXEC
- μ νμΌ λμ€ν¬λ¦½ν°μ 'execμμ λ«κΈ°'(
FD_CLOEXEC
) νλκ·Έλ₯Ό μ€μ νλ€. μ΄κ² μ μ©ν μ μλ μ΄μ μ λν΄μ open(2)μO_CLOEXEC
νλκ·Έ μ€λͺ μ 보λΌ. MFD_ALLOW_SEALING
- νμΌμ λν λ΄μΈ λμμ νμ©νλ€. fcntl(2)μ
F_ADD_SEALS
λ°F_GET_SEALS
λμ λ Όμμ μλ NOTESλ₯Ό μ°Έκ³ νλΌ. μ΅μ΄ λ΄μΈ μ§ν©μ λΉμ΄ μλ€. μ΄ νλκ·Έκ° μ€μ λΌ μμ§ μμΌλ©΄ μ΅μ΄ λ΄μΈ μ§ν©μ΄F_SEAL_SEAL
μ΄ λλ€. μ¦ νμΌμ λ€λ₯Έ λ΄μΈμ μ€μ ν μ μλ€. -
MFD_HUGETLB
(리λ μ€ 4.14λΆν°) - μ΅λͺ
νμΌμ΄ κ±°λ νμ΄μ§λ₯Ό μ΄μ©ν΄ hugetlbfs νμΌ μμ€ν
μμ λ§λ€μ΄μ§κ² λλ€. hugetlbfsμ λν μμΈν λ΄μ©μ 리λ
μ€ μ»€λ μμ€ νμΌ
Documentation/admin-guide/mm/hugetlbpage.rst
λ₯Ό 보λΌ.flags
μMFD_HUGETLB
μMFD_ALLOW_SEALING
μ ν¨κ» μ§μ νλ κ²μ 리λ μ€ 4.16λΆν° μ§μνλ€. -
MFD_HUGE_2MB
,MFD_HUGE_1GB
, ... -
hugetlb νμ΄μ§ ν¬κΈ°λ₯Ό μ¬λ¬ κ°μ§ μ§μνλ μμ€ν μμ
MFD_HUGETLB
μ μ‘°ν©ν΄ μ¬μ©ν΄μ λ€λ₯Έ hugetlb νμ΄μ§ ν¬κΈ°(κ°κ° 2MB, 1GB, ...)λ₯Ό μ ννλ€. μλ €μ§ κ±°λ νμ΄μ§ ν¬κΈ°λ€μ μ μκ° ν€λ νμΌ<linux/memfd.h>
μ ν¬ν¨λΌ μλ€.ν€λ νμΌμ ν¬ν¨λΌ μμ§ μμ κ±°λ νμ΄μ§ ν¬κΈ°λ₯Ό μΈμ½λ© νλ μμΈν λ°©λ²μ λν΄μ mmap(2)μ λΉμ·ν μ΄λ¦μ μμμ λν μ€λͺ μ 보λΌ.
flags
μ μ μ°λ λΉνΈλ€μ 0μ΄μ΄μΌ νλ€.
λ°ν κ°μΌλ‘ memfd_create()
κ° λ°ννλ μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό νμΌμ κ°λ¦¬ν¬ λ° μΈ μ μλ€. κ·Έ νμΌ λμ€ν¬λ¦½ν°λ μ½κΈ° λ° μ°κΈ°(O_RDWR
)λ‘ μ΄λ € μμΌλ©° νμΌ λμ€ν¬λ¦½ν°μ O_LARGEFILE
μ΄ μ€μ λΌ μλ€.
fork(2) λ° execve(2)μ κ΄λ ¨ν΄μ μΌλ°μ μΈ μλ―Έλ‘ μ΄ memfd_create()
λ‘ λ§λ νμΌ λμ€ν¬λ¦½ν°μ μ μ©λλ€. fork(2)λ‘ μκΈ΄ μμμ΄ νμΌ λμ€ν¬λ¦½ν° μ¬λ³Έμ λ¬Όλ €λ°μΌλ©° κ·Έ μ¬λ³Έμ νμΌμ κ°λ¦¬ν¨λ€. 'execμμ λ«κΈ°' νλκ·Έλ₯Ό μ€μ νμ§ μμμΌλ©΄ execve(2)λ₯Ό κ±°μΉλ©΄μ νμΌ λμ€ν¬λ¦½ν°κ° μ μ§λλ€.
μ±κ³΅ μ memfd_create()
λ μ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ©° μ€λ₯λ₯Ό λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
EFAULT
-
name
μ μ£Όμκ° μ ν¨νμ§ μμ λ©λͺ¨λ¦¬λ₯Ό κ°λ¦¬ν€κ³ μλ€. EINVAL
-
flags
μ μ μ μλ λΉνΈκ° ν¬ν¨λΌ μλ€. EINVAL
-
name
μ΄ λ무 κΈΈλ€. (μ’ λ£μ© λ λ°μ΄νΈλ₯Ό μ μΈνκ³ 249λ°μ΄νΈκ° μ ν κΈΈμ΄μ΄λ€.) EINVAL
-
flags
μMFD_HUGETLB
μMFD_ALLOW_SEALING
μ ν¨κ» μ§μ νλ€. EMFILE
- μ΄λ¦° νμΌ λμ€ν¬λ¦½ν° κ°μμ λν νλ‘μΈμ€λ³ μ νμ λλ¬νλ€.
ENFILE
- μ΄λ¦° νμΌ μ΄κ°μμ λν μμ€ν μ μ μ νμ λλ¬νλ€.
ENOMEM
- μ μ΅λͺ νμΌμ μμ±νκΈ°μ λ©λͺ¨λ¦¬κ° μΆ©λΆνμ§ μμλ€.
리λ
μ€ 3.17μμ memfd_create()
μμ€ν
νΈμΆμ΄ μ²μ λ±μ₯νλ€. glibc λ²μ 2.27μμ μ§μμ΄ μΆκ°λμλ€.
memfd_create()
μμ€ν
νΈμΆμ 리λ
μ€ μ μ©μ΄λ€.
memfd_create()
μμ€ν
νΈμΆμ μλμΌλ‘ tmpfs(5) νμΌ μμ€ν
μ λ§μ΄νΈ ν΄μ κ±°κΈ°μ νμΌμ μ¬λ λ°©μμ κ°λ¨ν λμμ΄ λΌ μ€λ€. memfd_create()
μ μ£Όλ λͺ©μ μ fcntl(2)μμ μ 곡νλ νμΌ λ΄μΈ APIμ ν¨κ» μ¬μ©ν νμΌ λ° μ°κ³ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ§λλ κ²μ΄λ€.
νμΌ λ΄μΈ μμ΄λ memfd_create()
μμ€ν
νΈμΆμ μ°μμκ° μλ€. (κ·Έλμ MFD_ALLOW_SEALING
νλκ·Έλ‘ λͺ
μμ μΌλ‘ μμ²νμ§ μμΌλ©΄ νμΌ λ΄μΈμ΄ κΊΌμ Έ μλ€.) νΉν κ²°κ³Ό νμΌμ νμΌ μμ€ν
μ μ€μ λ‘ μ°κ²°μν¬ μλκ° μλ κ²½μ°μ tmp
μ νμΌμ μμ±νλ κ²μ΄λ open(2) O_TMPFILE
λ₯Ό μ¬μ©νλ κ²μ λμμΌλ‘ μΈ μ μλ€.
νμΌ λ΄μΈμ΄ μλ κ²½μ°μλ 곡μ λ©λͺ¨λ¦¬λ₯Ό ν΅ν΄ ν΅μ νλ νλ‘μΈμ€λ€μ΄ μλ‘λ₯Ό μ λ’°νλ μ§, μλλ©΄ μ λ’°ν μ μλ μλκ° λ¬Έμ μλ λ°©μμΌλ‘ 곡μ λ©λͺ¨λ¦¬ μμμ μ‘°μν κ°λ₯μ±μ λμ²ν΄μΌ νλ€. μλ₯Ό λ€μ΄ μ λ’°ν μ μλ μλκ° μ무 λλ 곡μ λ©λͺ¨λ¦¬μ λ΄μ©λ¬Όμ λ³κ²½ν μλ μμ κ²μ΄κ³ , 곡μ λ©λͺ¨λ¦¬ μμμ μ€μ¬ λ²λ¦΄ μλ μμ κ²μ΄λ€. μμͺ½ κ°λ₯μ±μ νλ‘μΈμ€κ° κ²μ¬ μμ μ¬μ© μμ (TOCTTOU) κ²½μ 쑰건μ λ
ΈμΆλκ² λλλ€. (λ³΄ν΅ κ³΅μ λ©λͺ¨λ¦¬ μμμ λ°μ΄ν°λ₯Ό 볡μ¬ν λ€μμ κ²μ¬ λ° μ¬μ©νλ κ²μΌλ‘ λμ²νλ€.) λ€μͺ½ κ°λ₯μ±μ νλ‘μΈμ€κ° 곡μ λ©λͺ¨λ¦¬ μμμ λλ μ‘΄μ¬νμ§ μλ μμΉμ μ κ·Όνλ € ν λ SIGBUS
λ₯Ό λ°κ² νλ€. (μ΄ κ²½μ°μ λμ²νλ €λ©΄ SIGBUS
μκ·Έλμ λν νΈλ€λ¬ μ¬μ©μ΄ νμν΄μ§λ€.)
μ λ’°ν μ μλ μλλ₯Ό λ€λ£¨λ €λ©΄ 곡μ λ©λͺ¨λ¦¬ μ¬μ© μ½λμ 볡μ‘λκ° λν΄μ ΈμΌ νλ€. λ©λͺ¨λ¦¬ λ΄μΈμ μ°λ©΄ μλκ° λ°λμ§νμ§ μμ λ°©μμΌλ‘ 곡μ λ©λͺ¨λ¦¬λ₯Ό μ‘°μν μ μλ€κ³ μμ¬νκ³ λμν μ μμΌλ―λ‘ κ·Έ μΆκ° 볡μ‘λλ₯Ό μμ¨ μ μλ€.
λ€μμ λ΄μΈ λ©μ»€λμ¦ μ¬μ© μμμ΄λ€.
-
첫 λ²μ§Έ νλ‘μΈμ€κ°
memfd_create()
λ₯Ό μ¨μ tmpfs(5) νμΌμ μμ±νλ€. νΈμΆμ΄ λ΄λλ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ΄ν λ¨κ³λ€μμ μ¬μ©νλ€. -
첫 λ²μ§Έ νλ‘μΈμ€κ° μμ μμ±ν νμΌ ν¬κΈ°λ₯Ό ftruncate(2)λ‘ μ‘°μ νκ³ mmap(2)μΌλ‘ λ§΅ ν λ€μ κ·Έ 곡μ λ©λͺ¨λ¦¬λ₯Ό μνλ λ°μ΄ν°λ‘ μ±μ΄λ€.
-
첫 λ²μ§Έ νλ‘μΈμ€κ° νμΌμ λν μΆκ° λ³κ²½μ μ μ½νκΈ° μν΄ fcntl(2)
F_ADD_SEALS
λμμ μ΄μ©ν΄ νμΌμ ν κ° μ΄μμ λ΄μΈμ νλ€. (F_SEAL_WRITE
λ΄μΈμ νλ κ²½μ°μλ μ λ¨κ³μμ λ§λ μ°κΈ° κ°λ₯ν 곡μ λ§€νμ λ¨Όμ ν΄μ ν΄μΌ ν κ²μ΄λ€.) -
λ λ²μ§Έ νλ‘μΈμ€κ° κ·Έ tmpfs(5) νμΌμ λν νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ»μ΄μ λ§΅ νλ€. λ€μμ ν¬ν¨ν μ¬λ¬ λ°©μμΌλ‘ κ·Έλ κ² ν μ μλ€.
-
memfd_create()
λ₯Ό νΈμΆν νλ‘μΈμ€κ° κ²°κ³Όλ‘ λμ¨ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ λμ€ λλ©μΈ μμΌμ ν΅ν΄ λ λ²μ§Έ νλ‘μΈμ€μκ² μ μ‘ν μ μλ€. (unix(7) λ° cmsg(3) μ°Έκ³ .) κ·Έλ¬λ©΄ λ λ²μ§Έ νλ‘μΈμ€κ° mmap(2)μΌλ‘ κ·Έ νμΌμ λ§΅ νλ€. -
λ λ²μ§Έ νλ‘μΈμ€κ° fork(2)λ₯Ό ν΅ν΄ μμ±λμ΄ μλμΌλ‘ νμΌ λμ€ν¬λ¦½ν°μ λ§€νμ λ¬Όλ €λ°λλ€. (μ°Έκ³ λ‘ μ΄ κ²½μ°μ λ€μ κ²½μ°μμλ λ νλ‘μΈμ€κ° κ°μ μ¬μ©μ ID νμμ λκΈ° λλ¬Έμ λΉμ°ν μ λ’° κ΄κ³κ° μλ€. λ°λΌμ 보ν΅μ νμΌ λ΄μΈμ΄ νμνμ§ μλ€.)
-
λ λ²μ§Έ νλ‘μΈμ€κ°
/proc/<pid>/fd/<fd>
νμΌμ μ°λ€. μ¬κΈ°μ<pid>
λ (memfd_create()
μ νΈμΆν) 첫 λ²μ§Έ νλ‘μΈμ€μ PIDμ΄κ³<fd>
λ κ·Έ νλ‘μΈμ€μmemfd_create()
νΈμΆμ΄ λ°νν νμΌ λμ€ν¬λ¦½ν° λ²νΈμ΄λ€. κ·Έλ¬κ³ μ λ λ²μ§Έ νλ‘μΈμ€κ° mmap(2)μΌλ‘ κ·Έ νμΌμ λ§΅ νλ€.
-
-
λ λ²μ§Έ νλ‘μΈμ€κ° fcntl(2)
F_GET_SEALS
λμμ μ¨μ κ·Έ νμΌμ μ μ©λ λ΄μΈλ€μ λΉνΈ λ§μ€ν¬λ₯Ό κ°μ Έμ¨λ€. μ΄ λΉνΈ λ§μ€ν¬λ₯Ό μ΄ν΄λ³΄λ©΄ νμΌ λ³κ²½ λ°©μμ μ΄λ€ μ μ½μ΄ κ°ν΄μ‘λμ§ μμλΌ μ μλ€. μνλ€λ©΄ λ λ²μ§Έ νλ‘μΈμ€μμ λ΄μΈμ λ μ μ©ν΄μ μ μ½μ μΆκ°λ‘ κ°ν μ μλ€. (λ¨F_SEAL_SEAL
λ΄μΈμ΄ μ μ©λμ§ μμμ΄μΌ νλ€.)
memfd_create()
μ νμΌ λ΄μΈ API μ¬μ© λ°©μμ λ³΄μ¬ μ£Όλ λ κ°μ§ μμ νλ‘κ·Έλ¨μ΄ μλμ μλ€.
첫 λ²μ§Έ νλ‘κ·Έλ¨μΈ t_memfd_create.c
μμλ memfd_create()
λ‘ tmpfs(5) νμΌμ λ§λ€κ³ , νμΌ ν¬κΈ°λ₯Ό μ€μ νκ³ , λ©λͺ¨λ¦¬λ‘ λ§΅ νκ³ , μ νμ μΌλ‘ νμΌμ λͺ κ°μ§ λ΄μΈμ λλ€. νλ‘κ·Έλ¨μ΄ λͺ
λ Ήν μΈμλ₯Ό μΈ κ°κΉμ§ λ°λλ° μ²μ λ κ°λ νμμ΄λ€. 첫 λ²μ§Έ μΈμλ νμΌμ μ°κ³ν μ΄λ¦μ΄κ³ λ λ²μ§Έ μΈμλ νμΌμ μ€μ ν ν¬κΈ°μ΄λ©° μ νμ μΈ μΈ λ²μ§Έ μΈμλ νμΌμ μ€μ ν λ΄μΈμ λνλ΄λ λ¬Έμμ΄μ΄λ€.
λ λ²μ§Έ νλ‘κ·Έλ¨μΈ t_get_seals.c
λ₯Ό μ΄μ©ν΄ memfd_create()
λ‘ μμ±λ κΈ°μ‘΄ νμΌμ μ΄μ΄μ κ·Έ νμΌμ μ μ©λ λ΄μΈ μ§ν©μ μ΄ν΄λ³Ό μ μλ€.
λ€μ μ Έ μΈμ μ μ΄ νλ‘κ·Έλ¨λ€μ μ¬μ© λ°©μμ λ³΄μ¬ μ€λ€. λ¨Όμ tmpfs(5) νμΌμ λ§λ€κ³ λͺ κ°μ§ λ΄μΈμ μ€μ νλ€.
$ ./t_memfd_create my_memfd_file 4096 sw &
[1] 11775
PID: 11775; fd: 3; /proc/11775/fd/3
μ΄ μμ μμ t_memfd_create
νλ‘κ·Έλ¨μ λ°°κ²½μμ μ€νμ κ³μνλ€. memfd_create()
λ‘ μ΄μλ νμΌ λμ€ν¬λ¦½ν°μ λμνλ /proc/[pid]/fd
νμΌμ λ λ€λ₯Έ νλ‘κ·Έλ¨μμ μ΄μ΄μ memfd_create()
μμ± νμΌμ λν νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ»μ μ μλ€. κ·Έ κ²½λ‘λͺ
μ μ΄μ©ν΄ μ¬λ³Όλ¦ λ§ν¬ /proc/[pid]/fd
μ λ΄μ©μ νμΈνκ³ t_get_seals
νλ‘κ·Έλ¨μ μ΄μ©ν΄ κ·Έ νμΌμ μ μ©λ λ΄μΈλ€μ λ³Έλ€.
$ readlink /proc/11775/fd/3
/memfd:my_memfd_file (deleted)
$ ./t_get_seals /proc/11775/fd/3
Existing seals: WRITE SHRINK
#define _GNU_SOURCE
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int fd;
unsigned int seals;
char *addr;
char *name, *seals_arg;
ssize_t len;
if (argc < 3) {
fprintf(stderr, "%s name size [seals]\n", argv[0]);
fprintf(stderr, "\t'seals' can contain any of the "
"following characters:\n");
fprintf(stderr, "\t\tg - F_SEAL_GROW\n");
fprintf(stderr, "\t\ts - F_SEAL_SHRINK\n");
fprintf(stderr, "\t\tw - F_SEAL_WRITE\n");
fprintf(stderr, "\t\tS - F_SEAL_SEAL\n");
exit(EXIT_FAILURE);
}
name = argv[1];
len = atoi(argv[2]);
seals_arg = argv[3];
/* tmpfsμ μ΅λͺ
νμΌ μμ±. νμΌμ λ΄μΈ ν μ μκ² νκΈ° */
fd = memfd_create(name, MFD_ALLOW_SEALING);
if (fd == -1)
errExit("memfd_create");
/* λͺ
λ Ήνμμ μ§μ ν λλ‘ νμΌ ν¬κΈ° μ‘°μ */
if (ftruncate(fd, len) == -1)
errExit("truncate");
printf("PID: %ld; fd: %d; /proc/%ld/fd/%d\n",
(long) getpid(), fd, (long) getpid(), fd);
/* νμΌμ λ§΅ νκ³ κ·Έ λ§€νμ λ°μ΄ν°λ₯Ό μ±μ°λ μ½λλ μλ΅ */
/* λͺ
λ Ήν μΈμ 'seals'λ₯Ό λ°μμΌλ©΄ νμΌμ λ΄μΈ μ€μ */
if (seals_arg != NULL) {
seals = 0;
if (strchr(seals_arg, 'g') != NULL)
seals |= F_SEAL_GROW;
if (strchr(seals_arg, 's') != NULL)
seals |= F_SEAL_SHRINK;
if (strchr(seals_arg, 'w') != NULL)
seals |= F_SEAL_WRITE;
if (strchr(seals_arg, 'S') != NULL)
seals |= F_SEAL_SEAL;
if (fcntl(fd, F_ADD_SEALS, seals) == -1)
errExit("fcntl");
}
/* memfd_create()λ‘ μμ±ν νμΌμ΄ κ³μ μ‘΄μ¬νλλ‘
μ€νμ κ³μ */
pause();
exit(EXIT_SUCCESS);
}
#define _GNU_SOURCE
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int fd;
unsigned int seals;
if (argc != 2) {
fprintf(stderr, "%s /proc/PID/fd/FD\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_RDWR);
if (fd == -1)
errExit("open");
seals = fcntl(fd, F_GET_SEALS);
if (seals == -1)
errExit("fcntl");
printf("Existing seals:");
if (seals & F_SEAL_SEAL)
printf(" SEAL");
if (seals & F_SEAL_GROW)
printf(" GROW");
if (seals & F_SEAL_WRITE)
printf(" WRITE");
if (seals & F_SEAL_SHRINK)
printf(" SHRINK");
printf("\n");
/* νμΌμ λ§΅ νκ³ κ²°κ³Ό λ§€ν λ΄μ©μ μ κ·Όνλ μ½λλ μλ΅ */
exit(EXIT_SUCCESS);
}
fcntl(2), ftruncate(2), mmap(2), shmget(2), shm_open(3)
2019-03-06