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.