GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memulihkan semaphore ketika proses yang menurunkannya menjadi nol macet?

Ternyata tidak ada cara yang andal untuk memulihkan semaphore. Tentu, siapa pun bisa post_sem() ke semafor bernama untuk mendapatkan hitungan meningkat melewati nol lagi, tetapi bagaimana cara mengetahui kapan pemulihan seperti itu diperlukan? API yang diberikan terlalu terbatas dan sama sekali tidak menunjukkan kapan hal ini terjadi.

Waspadalah terhadap alat ipc juga tersedia -- alat umum ipcmk , ipcrm , dan ipcs hanya untuk semafor SysV yang kedaluwarsa. Mereka secara khusus tidak bekerja dengan semafor POSIX baru.

Tapi sepertinya ada hal lain yang bisa digunakan untuk mengunci sesuatu, yang dilakukan sistem operasi secara otomatis saat aplikasi mati dengan cara yang tidak bisa ditangkap oleh penangan sinyal. Dua contoh:soket pendengar yang terikat ke port tertentu, atau kunci pada file tertentu.

Saya memutuskan kunci pada file adalah solusi yang saya butuhkan. Jadi bukannya sem_wait() dan sem_post() panggilan, saya menggunakan:

lockf( fd, F_LOCK, 0 )

dan

lockf( fd, F_ULOCK, 0 )

Ketika aplikasi keluar dengan cara apa pun, file ditutup secara otomatis yang juga melepaskan kunci file. Aplikasi klien lain yang menunggu "semaphore" bebas untuk melanjutkan seperti yang diharapkan.

Terima kasih atas bantuannya, teman-teman.


Gunakan file kunci alih-alih semaphore, seperti solusi @Stéphane tetapi tanpa panggilan flock(). Anda cukup membuka file menggunakan kunci eksklusif:

//call to open() will block until it can obtain an exclusive lock on the file.
errno = 0;
int fd = open("/tmp/.lockfile", 
    O_CREAT | //create the file if it's not present.
    O_WRONLY | //only need write access for the internal locking semantics.
    O_EXLOCK, //use an exclusive lock when opening the file.
    S_IRUSR | S_IWUSR); //permissions on the file, 600 here.

if (fd == -1) {
    perror("open() failed");
    exit(EXIT_FAILURE);
}

printf("Entered critical section.\n);
//Do "critical" stuff here.

//exit the critical section
errno = 0;
if (close(fd) == -1) {
    perror("close() failed");
    exit(EXIT_FAILURE);
}

printf("Exited critical section.\n");

Ini adalah masalah umum saat mengelola semaphore. Beberapa program menggunakan satu proses untuk mengelola inisialisasi/penghapusan semaphore. Biasanya proses ini hanya melakukan ini dan tidak ada yang lain. Aplikasi Anda yang lain dapat menunggu hingga semaphore tersedia. Saya telah melihat ini dilakukan dengan API tipe SYSV, tetapi tidak dengan POSIX. Mirip dengan 'Bebek ' disebutkan, menggunakan flag SEM_UNDO dalam panggilan semop() Anda.


Tapi, dengan informasi yang Anda berikan saya sarankan agar Anda tidak menggunakan semaphore. Terutama jika proses Anda dalam bahaya terbunuh atau macet. Cobalah untuk menggunakan sesuatu yang akan dibersihkan oleh OS secara otomatis untuk Anda.


Linux
  1. Bagaimana Menemukan Proses Dengan Deskriptor File Maksimum?

  2. Bagaimana cara mengetahui proses apa yang mengunci file di Linux?

  3. Bagaimana cara mengarahkan output dari system() ke file?

  1. Bagaimana memulihkan file yang terhapus jika masih dibuka oleh beberapa proses?

  2. Bagaimana menemukan pengelola file default?

  3. Bagaimana cara mengarahkan output dari suatu perintah ke file ketika perintah tersebut akan meminta input pengguna?

  1. Apa yang terjadi jika file yang 100% dimasukkan ke dalam cache halaman diubah oleh proses lain

  2. Cara menemukan file .pid untuk proses tertentu

  3. Bagaimana cara menghapus file .fuse_hidden*?