GNU/Linux >> Belajar Linux >  >> Linux

Apakah fopen() fungsi thread safe di Linux?

Jika dua utas keduanya membuka file yang sama dengan fopen() , mereka masing-masing akan memiliki aliran file independen (FILE * ) didukung oleh deskriptor file independen yang merujuk ke file yang sama. Anda dapat menulis secara independen ke dua aliran file, tetapi hasil bersih pada file akan bergantung pada di mana utas menulis dan kapan mereka menyiram aliran file. Hasilnya tidak dapat diprediksi kecuali Anda mengontrol di mana setiap utas ditulis. Hal paling sederhana adalah memastikan kedua utas menggunakan aliran file yang sama, tetapi Anda mungkin masih perlu mengoordinasikan utas. Perhatikan bahwa POSIX memerlukan fungsi C untuk memberikan akses terkoordinasi ke aliran file — lihat flockfile() yang memberlakukan persyaratan bahwa

Semua fungsi yang mereferensikan (FILE *) objek, kecuali yang namanya diakhiri dengan _unlocked , akan berperilaku seolah-olah mereka menggunakan flockfile() dan funlockfile() secara internal untuk mendapatkan kepemilikan objek (FILE *) ini.

Jika Anda membuka file dalam mode penambahan di kedua utas, maka penulisan akan selalu aman di bagian akhir file, tetapi Anda masih harus khawatir membuang data sebelum buffer terisi.

Kebetulan, jika Anda membuka file dalam mode tambahkan (O_APPEND dengan open() , menggunakan "a" dengan fopen() ), maka semua penulisan harus berada di akhir file, dan Anda seharusnya tidak mendapat masalah dengan penulisan yang disisipkan — kecuali, mungkin, utas independen Anda menggunakan aliran file dan menulis lebih dari buffer-full sekaligus, atau mereka menggunakan fflush() setelah menulis bagian dari setiap baris keluaran, atau mereka menggunakan write() atau salah satu dari segudang kerabatnya untuk menulis bagian dari satu baris setiap kali. Ada cara untuk mengalami masalah bahkan dengan mode penambahan, tetapi biasanya Anda harus mencoba untuk mengalaminya.


fopen() adalah masuk kembali , dan Anda dapat memiliki banyak deskriptor yang mengarah ke file yang sama sesuka Anda.

Apa yang Anda dapatkan sebagai hasil dari membaca/menulis dari/ke file menggunakan beberapa deskriptor bukanlah pertanyaan keamanan utas, melainkan akses file bersamaan, yang dalam banyak kasus (selain saat file hanya-baca) tidak akan berfungsi baik.


Linux
  1. C fopen vs terbuka

  2. Penanganan sinyal dengan banyak utas di Linux

  3. Mengarahkan output dari blok fungsi ke file di Linux

  1. Dasar-dasar Izin File Linux

  2. Linux – Semuanya Adalah File?

  3. Apakah utas kernel Linux benar-benar proses kernel?

  1. Cara memindahkan file di Linux

  2. Memahami Izin File Linux

  3. Cara Membuat Thread di Linux (Dengan Program Contoh C)