Linux系統程式設計 程序間同步

2021-10-12 16:39:39 字數 2491 閱讀 6008

我們知道,執行緒間同步有多種方式,比如:訊號量、互斥量、讀寫鎖,等等。那程序間如何實現同步呢?本文介紹兩種方式:互斥量和檔案鎖。

##互斥量mutex

主要應用函式:

pthread_mutexattr_t mattr 型別: 用於定義互斥量的屬性 pthread_mutexattr_init函式:初始化乙個mutex屬性物件 pthread_mutexattr_destroy函式:銷毀mutex屬性物件 (而非銷毀鎖) pthread_mutexattr_setpshared函式:修改mutex屬性。

int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);

我們重點看第二個引數:pshared,它有以下兩個取值:

執行緒鎖:pthread_process_private (mutex的預設屬性即為執行緒鎖,程序間私有)

程序鎖:pthread_process_shared

要想實現程序間同步,需要將mutex的屬性改為pthread_process_shared

#include #include #include #include #include #include #include #include struct mt ;

int main(void)

} else if (pid > 0)

wait(null);

}pthread_mutexattr_destroy(&mm->mutexattr); //銷毀mutex屬性物件

pthread_mutex_destroy(&mm->mutex); //銷毀mutex

munmap(mm,sizeof(*mm)); //釋放對映區

##檔案鎖顧名思義,就是通過檔案實現鎖機制。具體來講,是通過借助 fcntl函式來實現鎖機制。當操作檔案的程序沒有獲得鎖時,雖然可以開啟檔案,但無法對檔案執行執行read、write操作。

###fcntl函式:

函式原型:int fcntl(int fd, int cmd, ... /* arg */ );

函式作用:獲取、設定檔案訪問控制屬性。

引數介紹:引數cmd有以下取值: f_setlk (struct flock *)設定檔案鎖(trylock) f_setlkw (struct flock *) 設定檔案鎖(lock)w --> wait f_getlk (struct flock *)獲取檔案鎖 資料型別flock原型如下: struct flock ;

###程序間檔案鎖示例

多個程序對加鎖檔案進行訪問:

#include #include #include #include #include #include void sys_err(char *str)

int main(int argc, char *ar**)

if ((fd = open(ar**[1], o_rdwr)) < 0)

sys_err("open");

f_lock.l_type = f_wrlck; /*選用寫瑣*/

// f_lock.l_type = f_rdlck; /*選用讀瑣*/

f_lock.l_whence = seek_set;

f_lock.l_start = 0;

f_lock.l_len = 0; /* 0表示整個檔案加鎖 */

fcntl(fd, f_setlkw, &f_lock);

printf("get flock\n");

sleep(10);

f_lock.l_type = f_unlck;

fcntl(fd, f_setlkw, &f_lock);

printf("un flock\n");

close(fd);

return 0;

}

檔案鎖類似於讀寫鎖,依然遵循「讀共享、寫獨佔」特性。但是,如果程序不加鎖直接操作檔案,依然可訪問成功,但資料勢必會出現混亂。

既然檔案鎖可用應用在程序中,那在多執行緒中,可以使用檔案鎖嗎?

答案是不行的。因為多執行緒間共享檔案描述符,而給檔案加鎖,是通過修改檔案描述符所指向的檔案結構體中的成員變數來實現的。因此,多執行緒中無法使用檔案鎖。

linux系統程式設計 程序間通訊 pipe

程序間通訊 pipe 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproce...

Linux系統程式設計 程序間通訊 IPC

利用檔案進行程序間通訊的程式示例 include include include include include include intmain if pid 0 write fd1,str,strlen str printf child wrote over n if pid 0 sleep 1 ...

Linux系統程式設計 程序間通訊(一)

linux系統主要的程序間通訊機制如下 無名管道 pipe 及命名管道 named pipe 無名管道可用於具有父子關係程序間的通訊 命名管道用於無父子關係的程序之間的通訊。無父子關係的程序可將資訊傳送到某個命名管道中,通過管道名讀取資訊 訊號 signal 程序間的高階通訊方式,用於通知其他程序有...