新聞中心
在多進程編程中,互斥鎖是一種重要的工具,用于協(xié)調(diào)多個進程或線程對共享資源的訪問。然而,在Linux下創(chuàng)建子進程時,需要考慮如何繼承互斥鎖。

主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站開發(fā)、程序開發(fā)、微網(wǎng)站、小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體,具備承接不同規(guī)模與類型的建設(shè)項目的能力。
需要理解互斥鎖的概念和使用方法?;コ怄i是一種同步原語,用于保護共享資源免受并發(fā)訪問的風(fēng)險。當(dāng)多個進程或線程需要訪問同一共享資源時,互斥鎖可以確保在同一時間只有一個進程或線程可以訪問該共享資源。
在Linux下創(chuàng)建子進程時,子進程會復(fù)制父進程的所有資源,包括互斥鎖。但是,復(fù)制并不意味著子進程可以直接使用父進程的互斥鎖。相反,子進程需要重新初始化互斥鎖,并確保只有它自己可以使用它。否則,子進程和父進程之間的競爭會導(dǎo)致互斥鎖失效,而共享資源會受到破壞。
為了繼承父進程的互斥鎖,子進程需要注意以下幾點:
1. 鎖的類型
互斥鎖可以分為進程鎖和線程鎖。進程鎖是利用文件鎖實現(xiàn)的,可以在不同進程之間共享。線程鎖只能在同一進程中使用。如果父進程使用的是線程鎖,子進程需要更改為進程鎖,以便在不同進程享。
2. 鎖的名字
在初始化鎖時,需要為鎖指定一個唯一的名字,以便在不同進程之間共享。如果父進程沒有指定鎖的名字,那么子進程必須使用同樣的近似策略來為鎖命名。
3. 鎖的屬性
在初始化鎖時,需要根據(jù)要保護的共享資源來設(shè)置鎖的屬性。例如,如果需要保護的資源是在內(nèi)存中的,則需要將鎖的屬性設(shè)置為PTHREAD_PROCESS_SHARED。這樣,子進程才能夠共享該鎖并保護該資源。
因此,在繼承父進程的互斥鎖時,子進程需要進行以下步驟:
1. 獲取鎖的類型
可以使用pthread_mutexattr_t結(jié)構(gòu)體中的pshared成員來判斷鎖的類型(線程鎖或進程鎖)。
2. 獲取鎖的名字
如果父進程指定了鎖的名字,則子進程可以通過shm_open()或sem_open()等函數(shù)來打開該鎖。否則,子進程需要使用同樣的近似策略來為鎖命名。
3. 獲取鎖的屬性
可以使用pthread_mutexattr_t結(jié)構(gòu)體中的flags成員來獲取鎖的屬性。
4. 初始化鎖
通過調(diào)用pthread_mutex_init()函數(shù)來初始化鎖。如果子進程需要更改鎖類型、名字或?qū)傩?,則必須傳遞相應(yīng)的參數(shù)。
5. 銷毀鎖
在子進程中使用完鎖后,必須調(diào)用pthread_mutex_destroy()函數(shù)來銷毀鎖以釋放資源。
在實際編程中,可以采用如下代碼來繼承父進程的互斥鎖:
#include
#include
#include
#include
#include
#include
#include
#define SHM_SIZE 4096
void PthreadMutexInit(pthread_mutex_t *mutex)
{
int res;
pthread_mutexattr_t mutexAttr;
res = pthread_mutexattr_init(&mutexAttr);
if (res != 0){
perror(“pthread_mutexattr_init() error.”);
exit(1);
}
res = pthread_mutexattr_setpshared(&mutexAttr, PTHREAD_PROCESS_SHARED);
if (res != 0){
perror(“pthread_mutexattr_setpshared() error.”);
exit(1);
}
res = pthread_mutexattr_setprotocol(&mutexAttr, PTHREAD_PRIO_INHERIT);
if (res != 0){
perror(“pthread_mutexattr_setprotocol() error.”);
exit(1);
}
res = pthread_mutex_init(mutex, &mutexAttr);
if (res != 0){
perror(“pthread_mutex_init() error.”);
exit(1);
}
}
int mn()
{
int shmid;
char *addr;
pid_t pid;
pthread_mutex_t *mutex;
shmid = shm_open(“/myshm”, O_RDWR | O_CREAT, 0777);
if (shmid == -1){
perror(“shm_open() error.”);
exit(1);
}
if (ftruncate(shmid, SHM_SIZE) == -1){
perror(“ftruncate() error.”);
exit(1);
}
addr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shmid, 0);
if (addr == MAP_FLED){
perror(“mmap() error.”);
exit(1);
}
mutex = (pthread_mutex_t *) addr;
PthreadMutexInit(mutex);
pid = fork();
if (pid
perror(“fork() error.”);
exit(1);
}
else if (pid == 0){
printf(“Child process.\n”);
mutex = (pthread_mutex_t *) addr;
pthread_mutex_lock(mutex);
printf(“Child process locked.\n”);
sleep(5);
pthread_mutex_unlock(mutex);
printf(“Child process unlocked.\n”);
exit(0);
}
else{
printf(“Parent process.\n”);
pthread_mutex_lock(mutex);
printf(“Parent process locked.\n”);
sleep(5);
pthread_mutex_unlock(mutex);
printf(“Parent process unlocked.\n”);
wt(NULL);
pthread_mutex_destroy(mutex);
munmap(addr, SHM_SIZE);
shm_unlink(“/myshm”);
exit(0);
}
}
在上述代碼中,我們使用了共享內(nèi)存來實現(xiàn)父進程和子進程之間的通信。通過共享內(nèi)存,父進程和子進程都可以訪問同一把互斥鎖。同時,我們在初始化互斥鎖時使用PTHREAD_PROCESS_SHARED屬性,以保證其可以在不同進程間共享。在父進程和子進程使用完互斥鎖后,必須分別調(diào)用pthread_mutex_destroy()和munmap()函數(shù)來銷毀鎖和釋放共享內(nèi)存。
相關(guān)問題拓展閱讀:
- linux中A進程調(diào)用system執(zhí)行shell,啟動B進程然后kill A進程,這個時候再啟動A進程時,報錯端口被占用了
- Linux Shell腳本的執(zhí)行過程
linux中A進程調(diào)用system執(zhí)行shell,啟動B進程然后kill A進程,這個時候再啟動A進程時,報錯端口被占用了
進程A使用system調(diào)用執(zhí)行一個命令,會生成一個子進程C來執(zhí)行,當(dāng)啟動進程Bkill了A進程后,進程A打開的文件描述符會由子進程繼承,所以A原本占用的端口(其實纖宴 就是文件描述符)就被子進程C占用了。
正確的方法應(yīng)該是先停止子進程C,然后再讓進程A退出。或者在進程A的代碼中,使用unix編程接口,不要讓子進談讓程繼承繼承文件描述符(這個比較復(fù)雜,需要自己看unix編程毀侍銀的書)
Linux Shell腳本的執(zhí)行過程
用戶登錄時,將會取得一個
bash
,這個
bash
在系統(tǒng)中有一個全局唯一的ID,也就是進程的ID,使用命令
ps -ef
并配合
grep
來查看進程ID。
ps -ef|grep bash
,此命令還能查看進程對應(yīng)的父進程ID,系統(tǒng)中所有進程的祖先進程都是INIT進程戚隱(進程ID=1),它是更先啟動運行的。
回到
bash
進程,也就是我們的命令行界面,進程的執(zhí)行都神圓有其附屬的執(zhí)行環(huán)境,環(huán)境變量就屬于其中之一。并且環(huán)境變量是可以完全被子進程繼承的,也就是說,子進程可以使用父進程的環(huán)境變量,但是不能使用父進程的自定義變量。
簡而言之:
子進高瞎廳程繼承父進程的環(huán)境變量,不繼承父進程的自定義變量。
shell腳本有4種執(zhí)行方式,不同的執(zhí)行方式可能導(dǎo)致結(jié)果不一致
四種方式的執(zhí)行結(jié)果如下:
關(guān)于linux子進程繼承互斥的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站名稱:Linux下子進程如何繼承互斥鎖(linux子進程繼承互斥)
文章轉(zhuǎn)載:http://m.fisionsoft.com.cn/article/dhdjdpg.html


咨詢
建站咨詢
