Langsung ke konten

Arsip

File Descriptor

32 artikel
Linux 23 Sep 2026 4 min read

TFD_TIMER_CANCEL_ON_SET Mengubah Lompatan Clock Realtime Menjadi ECANCELED

Timer absolut yang terikat ke CLOCK_REALTIME memiliki ketergantungan yang tidak dimiliki deadline monotonic: administrator, layanan sinkronisasi, atau proses berprivilege dapat memindahkan wall clock secara diskontinu ketika timer masih aktif. Linux timerfd dapat mengekspos kejadian itu secara eksplisit. Dengan TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, perubahan clock yang memenuhi syarat membuat read() saat ini atau berikutnya pada descriptor timer gagal dengan ECANCELED. Perilaku ini memisahkan dua kejadian yang mudah tercampur: tercapainya waktu wall clock yang dijadwalkan dan tidak berlakunya basis clock yang dipakai saat jadwal dibuat.

Linux 23 Sep 2026 4 min read

pidfd_getfd Menduplikasi Descriptor Target ke Proses Pemanggil

pidfd_getfd Menduplikasi Descriptor Target ke Proses Pemanggil pidfd_getfd() dapat menempatkan duplikat file descriptor milik proses lain ke tabel descriptor proses pemanggil. Descriptor hasil menjadi milik pemanggil, tetapi tetap merujuk ke open file description yang sama dengan descriptor terpilih pada proses target. Batas ini penting karena operasi tersebut tidak membuka ulang pathname, membangun ulang socket, atau membuat posisi file independen. Kernel menduplikasi referensi yang sudah ada melintasi batas proses. pidfd dan targetfd menunjuk dua hal berbeda Pemanggilan menerima PID file descriptor serta nomor descriptor milik proses target:

Linux 23 Sep 2026 5 min read

Mode Semaphore eventfd Mengubah Nilai Counter Menjadi Read Satu Unit

Linux eventfd mengekspos counter 64-bit yang dikelola kernel melalui file descriptor. Interface yang ringkas ini memiliki pilihan semantik penting: read normal menguras nilai counter saat itu, sedangkan read dengan EFD_SEMAPHORE hanya mengambil satu unit. Jalur write tetap menambahkan nilai ke counter yang sama. Perbedaan tersebut mengubah objek dari counter notifikasi agregat menjadi sumber unit yang dapat dikonsumsi satu per satu melalui descriptor. Model readiness tetap dapat dipakai bersama poll, epoll, dan mekanisme multiplexing descriptor lain, sehingga satu objek dapat menghubungkan accounting producer dengan event loop tanpa payload pipe terpisah.

Linux 23 Sep 2026 5 min read

close_range dengan UNSHARE Memisahkan Cleanup File Descriptor dari Thread Lain

Proses Linux multithread dapat memakai satu tabel file descriptor secara bersama. Pola itu praktis selama eksekusi normal: descriptor yang dibuka satu thread tersedia bagi thread lain. Masalah muncul ketika satu thread sedang menyiapkan konteks eksekusi terbatas dan ingin membuang range descriptor yang luas, sementara thread lain masih dapat mengalokasikan descriptor pada tabel yang sama. close_range() menyediakan operasi berbasis range untuk batas tersebut. Dengan CLOSE_RANGE_UNSHARE, kernel lebih dulu memisahkan caller dari tabel descriptor bersama, lalu menerapkan penutupan yang diminta pada tabel hasil pemisahan milik caller. Secara konsep, operasi ini mendekati gabungan unshare(CLONE_FILES) dan penutupan range, tetapi kernel dapat menghindari pekerjaan yang tidak diperlukan pada kasus umum.

Linux 20 Sep 2026 5 min read

pidfd_getfd Menduplikasi File Descriptor Aktif Antarproses

Sebuah proses dapat memperoleh duplikat file descriptor yang sudah terbuka di proses lain tanpa meminta proses tersebut mengirimkannya melalui UNIX domain socket. Linux pidfd_getfd() melakukan transfer itu melalui PID file descriptor, dengan izin yang dibatasi oleh pemeriksaan akses ptrace. Descriptor yang diterima merupakan entry baru di caller, tetapi objek kernel di baliknya bukan objek independen. Descriptor tersebut merujuk ke open file description yang sama dengan descriptor target. Perbedaan ini menentukan sharing offset, file status flags, dan operasi terhadap objek dasarnya.

Linux 19 Sep 2026 4 min read

timerfd Membaca Jumlah Expiration Periodik

Timer periodik dapat mencapai expiration beberapa kali sebelum event loop yang sibuk kembali mendapat waktu CPU. Linux timerfd tidak mereduksi keterlambatan itu menjadi notifikasi “timer aktif” semata. read() yang berhasil mengembalikan counter unsigned 64-bit berisi jumlah expiration yang terakumulasi sejak timer diaktifkan atau sejak read sebelumnya yang berhasil. Counter tersebut mengubah semantik penanganan timer yang terlambat. Readiness menyatakan setidaknya satu expiration sedang tertunda; nilai yang dibaca dari descriptor menyatakan berapa banyak periode yang telah berlalu.

Linux 19 Sep 2026 4 min read

Seal memfd Membatasi Mutasi Shared Memory Setelah Handoff

Descriptor dari memfd_create() merujuk ke file anonim dengan penyimpanan pada infrastruktur filesystem berbasis memori. Handoff descriptor saja tidak membekukan objek tersebut: proses yang masih memiliki akses yang sesuai dapat menulis byte, melakukan truncate, atau memperbesar file. File seal Linux menambahkan pembatasan yang ditegakkan kernel sehingga mutasi tertentu gagal setelah producer menyatakan objek selesai dibuat. Mekanisme ini mengubah handoff shared memory dari sekadar konvensi menjadi transisi state yang ditegakkan pada objek file.

Linux 19 Sep 2026 5 min read

pidfd_getfd Menduplikasi Descriptor Aktif Lintas Batas Proses

Sebuah proses dapat memperoleh descriptor baru yang merujuk ke open file description yang sama dengan descriptor milik proses lain tanpa meminta proses target mengirimkannya. Linux menyediakan operasi ini melalui pidfd_getfd(). Descriptor hasilnya berada di descriptor table caller, tetapi objek kernel di belakangnya tetap sama dengan descriptor target. Perbedaan tersebut penting karena nomor descriptor hanya merupakan entri pada descriptor table sebuah proses. Open file description membawa state seperti posisi file saat ini dan file status flags. Duplikasi lintas proses karena itu memberikan referensi ke instance file kernel yang sudah ada, bukan membuka ulang pathname atau membuat instance independen.

Linux 19 Sep 2026 5 min read

eventfd Mengubah Notifikasi Kernel Menjadi Counter yang Dapat Dipantau

Proses Linux dapat memberi sinyal bahwa ada pekerjaan melalui file descriptor tanpa memindahkan byte stream antara producer dan consumer. eventfd() membuat counter 64-bit yang dikelola kernel dan readiness-nya dapat diamati oleh poll(), select(), atau epoll. Operasi write menambah counter; operasi read mengonsumsi state yang telah terakumulasi sesuai mode descriptor. Bentuk ini membedakan eventfd dari pipe. Pipe mempertahankan urutan byte. Eventfd mempertahankan state counter. Saat aplikasi memerlukan sinyal wakeup beserta sedikit state terakumulasi, perbedaan ini menghilangkan buffering dan framing yang diperlukan oleh byte stream.

Linux 19 Sep 2026 5 min read

close_range Menjadikan Pembersihan File Descriptor Satu Operasi Linux

Proses yang bersiap menjalankan program lain sering memiliki batas sederhana: descriptor 0, 1, dan 2 tetap tersedia, sedangkan semua descriptor yang lebih tinggi harus hilang. Memanggil close() berulang sampai batas angka yang diperkirakan atau mengiterasi /proc/self/fd mengubah batas tersebut menjadi pemindaian di userspace. Linux close_range() menyatakan interval itu secara langsung. Kernel menerapkan satu operasi pada setiap file descriptor terbuka dari first sampai last, termasuk kedua ujungnya. Melalui flag, interface yang sama dapat mengisolasi descriptor table bersama atau menandai interval sebagai close-on-exec alih-alih langsung menutupnya.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Seal pada Linux memfd Mengubah File Memori Mutable menjadi Transisi State yang Dipaksakan Kernel

File yang dibuat dengan memfd_create() dapat bermula sebagai penyimpanan mutable lalu memperoleh pembatasan yang dipaksakan kernel dan berlaku pada file dasarnya, bukan hanya pada satu descriptor. Dengan MFD_ALLOW_SEALING, proses dapat menambahkan seal melalui fcntl(F_ADD_SEALS) sehingga mutasi tertentu tidak lagi tersedia bagi semua pemegang file tersebut. Mekanisme ini membentuk transisi state yang tidak dapat dinyatakan oleh permission descriptor biasa. Produsen dapat mengisi byte, menetapkan ukuran file, lalu memublikasikan descriptor dengan pembatasan yang tetap melekat meskipun descriptor melintasi batas proses.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Seal pada Linux memfd Mengubah File Anonim Mutable Menjadi Capability Terbatas

File descriptor yang dikembalikan memfd_create() dapat bermula sebagai file anonim yang writable dan dapat diubah ukurannya, lalu beralih menjadi objek dengan operasi mutasi yang telah dikurangi secara permanen. Linux menerapkan transisi tersebut melalui file seal. Mekanisme ini melekat pada file yang mendasarinya, bukan pada satu descriptor, sehingga pengiriman descriptor duplikat melintasi batas proses tidak membentuk state sealing yang terpisah. Properti ini membuat sealing lebih dari sekadar fasilitas untuk penyimpanan sementara. Sealing mengubah otoritas yang dibawa setiap descriptor yang merujuk ke objek memfd yang sama. Transisinya monoton: seal dapat ditambahkan, tetapi tidak dapat dihapus.

Keamanan Siber 18 Sep 2026 4 min read

Seal Memfd Mengubah File Anonim yang Mutable Menjadi Objek Serah Terima Eksplisit

Sebuah proses menyiapkan payload biner di memori, menyerahkan file descriptor ke proses lain, lalu mengharapkan byte tetap stabil setelah validasi. Descriptor biasa tidak menghasilkan jaminan tersebut. Jika masih ada pemegang dengan otoritas tulis, objek dapat berubah setelah diperiksa konsumen, sedangkan izin pathname tidak memberi batas yang berguna ketika objek tidak memiliki nama filesystem biasa. Linux memfd_create() menyediakan file anonim yang ditopang penyimpanan filesystem menyerupai memori, dan file seal dapat membatasi perubahan berikutnya pada file tersebut. Properti keamanan yang berguna bukan anonimitas semata. Mekanismenya memungkinkan pembuatan objek mutable, penerapan pembatasan yang tidak dapat dibatalkan, lalu penyerahan descriptor dengan backing file yang tidak lagi dapat diubah melalui operasi yang dilarang.

Keamanan Siber 18 Sep 2026 6 min read

Seal File memfd Mengubah Memori Bersama Menjadi Batas Mutasi yang Dipaksakan Kernel

Sebuah broker dapat mengalokasikan objek berbasis memori, mengisi isinya, lalu mengirim file descriptor objek itu ke proses lain melalui UNIX domain socket. Penerima dapat memperlakukan byte tersebut sebagai konfigurasi immutable, kode terkompilasi, atau artefak terserialisasi. Asumsi itu tidak aman jika pengirim atau pemegang lain masih dapat mengubah inode yang sama setelah validasi. Linux memfd_create() dan file seal menyediakan cara yang dipaksakan kernel untuk mempersempit permukaan mutasi tersebut tanpa memberi objek sebuah pathname filesystem persisten.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

SCM_RIGHTS Mentransfer Open File Description Melintasi Batas Proses

SCM_RIGHTS memungkinkan satu proses mengirim referensi ke file yang sudah terbuka melalui Unix domain socket. Penerima memperoleh file descriptor di tabel descriptornya sendiri, tetapi transfer tersebut tidak membuka ulang pathname atau menyalin objek kernel. Pada Linux, referensi yang dihasilkan memiliki semantik setara dengan menduplikasi descriptor milik pengirim ke proses penerima. Perbedaan ini penting ketika batas proses juga menjadi batas otoritas. Supervisor dapat membuka socket, file, pipe, device, atau objek lain berbasis descriptor lalu memberikan referensi yang sudah terbentuk kepada worker. Worker menerima akses ke objek yang telah terbuka, termasuk state open-file yang dapat tetap dipakai bersama dengan pengirim.

Linux 18 Sep 2026 5 min read

pidfd_getfd Menduplikasi File Descriptor Proses Lain ke Proses Pemanggil

Nomor file descriptor hanya memiliki arti di dalam tabel descriptor suatu proses, tetapi objek kernel di balik nomor tersebut dapat dipakai bersama oleh beberapa proses. Linux pidfd_getfd() menjembatani dua ruang itu: syscall ini menerima PID file descriptor beserta nomor descriptor dari proses yang dirujuk, lalu memasang descriptor duplikat pada proses pemanggil. Descriptor baru tersebut merujuk ke open file description yang sama dengan descriptor target. Properti terakhir itu merupakan batas utama. pidfd_getfd() tidak membuka ulang pathname, menyalin byte, atau membuat posisi file yang independen. Operasi ini menduplikasi referensi kernel yang sudah ada sehingga semantik state bersama dapat memengaruhi kedua proses.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Linux pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

Process ID numerik adalah nama di dalam PID namespace, bukan handle permanen untuk satu masa hidup proses. Setelah proses berhenti dan PID-nya tersedia untuk dipakai kembali, proses lain dapat memperoleh nomor yang sama. PID file descriptor di Linux menyediakan batas antarmuka berbeda: sebuah pidfd adalah file descriptor yang merujuk ke task tertentu, sehingga operasi berikutnya dapat menargetkan referensi kernel tersebut tanpa meresolusi PID numerik lagi. Perbedaan ini relevan pada supervisor, service manager, launcher, dan kode lain yang bertindak terhadap proses setelah suatu jeda. Persoalannya bukan bahwa penggunaan PID selalu tidak aman. PID numerik dan referensi objek yang dipertahankan memiliki semantik masa hidup yang berbeda.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux O_PATH Memisahkan Referensi Objek dari Otoritas I/O

open() biasanya menggabungkan dua efek: resolusi pathname memilih objek sistem file, lalu file descriptor yang dihasilkan membawa mode akses untuk I/O data. Linux O_PATH memisahkan kedua efek tersebut. open(path, O_PATH) yang berhasil menghasilkan descriptor yang merujuk objek terpilih, sementara read() dan write() biasa melalui descriptor itu tidak diizinkan. Pemisahan ini berguna ketika proses memerlukan referensi kernel yang tahan terhadap perubahan nama untuk operasi metadata atau operasi relatif terhadap pathname, tanpa membuka objek untuk transfer data. Analisis race juga berubah: operasi berikutnya dapat dimulai dari descriptor, bukan melakukan resolusi ulang terhadap pathname awal.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux inotify Melaporkan Event Entri Direktori, Bukan Identitas Path yang Persisten

Sebuah watch inotify tidak menjadikan pathname sebagai identifier yang persisten. Linux menempelkan watch pada objek filesystem yang dipilih saat inotify_add_watch() berhasil, lalu menghasilkan record yang mendeskripsikan aktivitas terkait objek yang dipantau dan entri direktori. Nama dapat berpindah, objek dapat hilang, dan detail event dapat terlewat ketika queue mengalami overflow. Batas ini relevan bagi file synchronizer, pemuat ulang konfigurasi, indexer, dan service supervisor. Event stream dapat memberi sinyal bahwa state filesystem lokal berubah, tetapi rekonstruksi state yang otoritatif tetap bergantung pada operasi filesystem yang dilakukan setelah event diterima.

Rekayasa Perangkat Lunak 18 Sep 2026 7 min read

Linux close_range Menjadikan Pembersihan Tabel Descriptor sebagai Operasi Rentang

Proses yang bersiap mengeksekusi program lain sering memerlukan invariant descriptor yang sederhana: standard input, output, dan error tetap tersedia, sedangkan descriptor yang tidak terkait tidak melewati batas eksekusi. Menutup descriptor satu per satu dapat mengubah invariant tersebut menjadi persoalan enumerasi. Linux close_range() menerapkan operasi pada interval numerik inklusif di tabel file descriptor milik task pemanggil. Antarmukanya kecil, tetapi semantiknya menjangkau sharing tabel descriptor, pewarisan melalui execve(), alokasi descriptor secara concurrent, dan transisi privilege. Flag yang dipilih menentukan lebih dari strategi implementasi: flag tersebut menetapkan apakah descriptor langsung hilang, menjadi close-on-exec, atau terlebih dahulu dipisahkan dari tabel yang dibagi dengan task lain.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Linux close_range Menjadikan Pembersihan Descriptor sebagai Operasi Tabel

Proses yang bersiap menjalankan execve() sering memerlukan invariant sederhana: descriptor di atas allowlist kecil tidak boleh bertahan ke program baru. Menutup nomor descriptor satu per satu mengubah invariant tersebut menjadi masalah enumerasi. Linux close_range() menyatakannya langsung sebagai operasi pada interval inklusif di tabel file descriptor milik task pemanggil. Interface ini khusus Linux. Perilakunya berasal dari semantik file table dan system call Linux, bukan dari bahasa C atau jaminan POSIX yang portabel.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

CLOSE_RANGE_UNSHARE Mengisolasi Pembersihan Tabel Descriptor

Sebuah thread yang bersiap melewati batas execve() dapat perlu menghapus seluruh file descriptor di atas sekumpulan kecil descriptor yang dipertahankan ketika thread lain masih memakai tabel descriptor yang sama. Penutupan descriptor satu per satu membuka race: thread lain dapat mengalokasikan descriptor baru ke interval tersebut saat pembersihan masih berjalan. Di Linux, close_range() dengan CLOSE_RANGE_UNSHARE mengubah batas pemakaian bersama tabel sebelum operasi range diterapkan. Perilaku ini penting karena nomor file descriptor hanya merupakan indeks pada tabel descriptor proses. Dengan CLONE_FILES, beberapa task dapat merujuk tabel yang sama, sehingga penutupan oleh satu task mengubah visibilitas descriptor bagi seluruh task yang berbagi tabel tersebut. CLOSE_RANGE_UNSHARE memberi task pemanggil tabel descriptor privat sebagai bagian dari operasi.

Linux 18 Sep 2026 5 min read

close_range Mengontrol Pewarisan Descriptor pada Batas exec

Sebuah proses yang bersiap memanggil execve() dapat memiliki ratusan atau ribuan file descriptor terbuka, sementara program baru hanya seharusnya mewarisi beberapa descriptor tertentu. Menutup descriptor satu per satu menimbulkan biaya pencatatan sekaligus masalah concurrency: thread lain dapat mengalokasikan descriptor ketika loop pembersihan masih berjalan. Linux close_range() memindahkan operasi tersebut ke batas tabel descriptor. Caller menentukan rentang angka inklusif dan meminta kernel menutup descriptor dalam rentang itu atau menandainya close-on-exec. Dengan CLOSE_RANGE_UNSHARE, caller dapat lebih dahulu memisahkan tabel descriptornya dari thread atau proses yang berbagi tabel tersebut.

Keamanan Siber 18 Sep 2026 5 min read

close_range Mempersempit Pewarisan File Descriptor Sebelum exec

Sebuah proses layanan dapat mengumpulkan socket, pipe, handle direktori, file log, dan descriptor kontrol jauh sebelum menjalankan helper. Jika descriptor tersebut tetap terbuka pada program baru, helper menerima kapabilitas yang tidak tampak dari argumen command line maupun environment. Socket yang sudah terhubung dapat membawa akses terautentikasi; direktori yang terbuka dapat mempertahankan akses ke lokasi filesystem; pipe dapat membuka jalur data komponen lain. Linux close_range() memberi kode sebelum exec operasi berbasis rentang atas file descriptor. Nilai keamanannya bukan karena descriptor menjadi tidak berbahaya. Mekanisme ini memungkinkan proses mempersempit kumpulan descriptor yang melewati batas execve() tanpa menginventarisasi /proc/self/fd atau memanggil close() satu per satu untuk setiap descriptor kandidat.