Bagaimana untuk Menghalang Berbilang Contoh Aplikasi C/C Anda daripada Berjalan?

Linda Hamilton
Lepaskan: 2024-10-27 05:31:03
asal
809 orang telah melayarinya

 How to Prevent Multiple Instances of Your C/C   Application from Running?

Mencipta Aplikasi Contoh Tunggal dalam C atau C

Dalam bidang pembangunan perisian, selalunya wajar untuk menyekat pelaksanaan aplikasi kepada satu contoh, memastikan hanya satu proses dibenarkan berjalan pada bila-bila masa. Untuk mencapai matlamat ini, pelbagai teknik boleh digunakan, terutamanya berkisar pada kunci fail, mutex dan mekanisme penyegerakan lain.

Pengunci Fail

Satu pendekatan adalah melalui penguncian fail, seperti yang ditunjukkan dalam coretan kod di bawah:

<code class="c">#include <sys/file.h>
#include <errno.h>

int pid_file = open("/var/run/whatever.pid", O_CREAT | O_RDWR, 0666);
int rc = flock(pid_file, LOCK_EX | LOCK_NB);
if(rc) {
    if(EWOULDBLOCK == errno)
        ; // another instance is running
}
else {
    // this is the first instance
}</code>
Salin selepas log masuk

Di sini, open() digunakan untuk mencipta fail bernama whatever.pid dan mendapatkan deskriptor failnya, manakala flock() cuba memperoleh kunci eksklusif, memastikan bahawa hanya satu contoh boleh memegang kunci tulis pada fail pada satu masa.

Pendekatan Berasaskan Mutex

Pilihan lain melibatkan memanfaatkan mutex, yang menyediakan penguncian yang lebih fleksibel mekanisme dalam persekitaran berbilang benang:

<code class="c">#include <pthread.h>

pthread_mutex_t mutex;
pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);
pthread_mutex_init(&mutex, &attr);

pthread_mutex_lock(&mutex);
// critical section code
pthread_mutex_unlock(&mutex);</code>
Salin selepas log masuk

Di sini, pthread_mutex_init() memulakan mutex menggunakan atribut yang dinyatakan dalam attr, manakala pthread_mutex_lock() dan pthread_mutex_unlock() melaksanakan operasi mengunci dan membuka kunci, masing-masing, memastikan bahawa hanya satu urutan boleh melaksanakan bahagian kritikal.

Soket Domain Unix

Teknik yang lebih maju melibatkan mencipta dan mengikat soket domain unix menggunakan nama soket yang telah ditetapkan:

<code class="c">#include <sys/socket.h>

int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
int rc = bind(sockfd, (struct sockaddr*)&unixaddr, sizeof(unixaddr));
if(rc) {
    if(errno == EADDRINUSE)
        ; // another instance is running
}
else {
    // this is the first instance
}</code>
Salin selepas log masuk

Di sini, socket() mencipta soket baharu, manakala bind() cuba untuk mengikatnya pada nama soket yang disimpan dalam unixaddr. Jika operasi bind gagal dengan EADDRINUSE, ini menunjukkan bahawa satu lagi contoh aplikasi sedang berjalan.

Pilihan pendekatan yang hendak digunakan bergantung pada keperluan khusus aplikasi dan tahap kebolehpercayaan dan prestasi yang diingini. Penguncian fail menyediakan penyelesaian yang mudah dan mudah dilaksanakan, manakala mutex menawarkan lebih fleksibiliti dalam persekitaran berbilang benang dan soket domain unix menawarkan pendekatan yang lebih berdaya tahan yang boleh mengendalikan maklumat proses yang lapuk.

Atas ialah kandungan terperinci Bagaimana untuk Menghalang Berbilang Contoh Aplikasi C/C Anda daripada Berjalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!