我們知道,執行緒間同步有多種方式,比如:訊號量、互斥量、讀寫鎖,等等。那程序間如何實現同步呢?本文介紹兩種方式:互斥量和檔案鎖。
##互斥量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 程序間的高階通訊方式,用於通知其他程序有...