Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghalang Berbilang Contoh Aplikasi C/C Anda daripada Berjalan?

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

Linda Hamilton
Linda Hamiltonasal
2024-10-27 05:31:03903semak imbas

 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>

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>

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>

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!

Kenyataan:
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