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

2021-08-20 14:00:16 字數 4693 閱讀 4512

利用檔案進行程序間通訊的程式示例:

#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

);int ret =

read

(fd2, buf,

sizeof

(buf));

write

(stdout_fileno, buf, ret)

;wait

(null);

}return0;

}

#include

#include

#include

void

sys_err

(char

* str)

intmain()

else

if(pid >0)

return0;

}

//fifo_w.c

#include

#include

#include

#include

#include

#include

void

sys_err

(char

*str)

intmain

(int argc,

char

*argv)

int ret =

access

(argv[1]

, f_ok);if

(ret !=0)

fd =

open

(argv[1]

, o_wronly);if

(fd <0)

sys_err

("open");

while(1

)close

(fd)

;return0;

}//fifo_r.c

#include

#include

#include

#include

#include

#include

#include

void

sys_err

(char

*str)

intmain

(int argc,

char

*argv)

fd =

open

(argv[1]

, o_rdonly);if

(fd <0)

sys_err

("open");

while(1

)close

(fd)

;return0;

}

#include

#include

#include

#include

#include

#include

int var =0;

intmain()

unlink

("temp.txt");

ftruncate

(fd,4)

; p =

mmap

(null,4

, prot_read | prot_write, map_shared, fd,0)

;//p = mmap(null, 4, prot_read | prot_write, map_private, fd, 0);

if(p == map_failed)

close

(fd)

; pid =

fork()

;if(pid ==0)

else

if(pid >0)

}return0;

}

#include

#include

#include

#include

#include

#include

int var =0;

intmain()

pid =

fork()

;if(pid ==0)

else

if(pid >0)

}return0;

}

//mmap_nonpc_write.c

#include

#include

#include

#include

#include

#include

struct std

;void

sys_err

(const

char

* str)

intmain

(int argc,

char

** argv)

;struct std* mm;

if(argc <2)

fd =

open

(argv[1]

, o_rdwr | o_creat,

0644);

if(fd <0)

int ret =

ftruncate

(fd,

sizeof

(struct std));

if(ret <0)

sys_err

("ftruncate error");

mm =

mmap

(null

,sizeof

(struct std)

, prot_read | prot_write, map_shared, fd,0)

;if(mm == map_failed)

sys_err

("mmap error");

close

(fd)

;while(1

)munmap

(mm,

sizeof

(struct std));

return0;

}//mmap_nonpc_read.c

#include

#include

#include

#include

#include

#include

struct std

;void

sys_err

(const

char

* str)

intmain

(int argc,

char

** argv)

fd =

open

(argv[1]

, o_rdonly);if

(fd <0)

mm =

mmap

(null

,sizeof

(struct std)

, prot_read, map_shared, fd,0)

;if(mm == map_failed)

sys_err

("mmap error");

close

(fd)

;while(1

)munmap

(mm,

sizeof

(struct std));

return0;

}

並且,由於open、write、read函式的底層實現是借助mmap函式,因此非血緣關係程序間通訊也可以借助檔案的方式。

//file_mmap_w.c

#include

#include

#include

#include

#include

void

sys_err

(char

*str)

#define n 5

intmain()

close

(fd)

;return0;

}//file_mmap_r.c

#include

#include

#include

#include

#include

void

sys_err

(char

*str)

intmain()

unix domain socket是全雙工的,api介面語義豐富,相比其它ipc機制有明顯的優越性,目前已成為使用最廣泛的ipc機制。

unix domain socket與網路socket程式設計最明顯的不同在於位址格式不同,用結構體sockaddr_un表示,網路程式設計的socket位址是ip位址加埠號,而unix domain socket的位址是乙個socket型別的檔案在檔案系統中的路徑,這個socket檔案由bind()呼叫建立,如果呼叫bind()時該檔案已存在,則bind()錯誤返回。

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

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

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

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

系統程式設計 程序間通訊 概述

程序間通訊概述 1.什麼是程序間通訊?什麼是執行緒間通訊?程序間通訊 在使用者空間實現程序間通訊是不可能的,程序間通訊通過linux核心物件來實現。執行緒間通訊 這在使用者空間就可以實現,甚至可以通過全域性變數來通訊。2.有哪幾種程序間通訊方式?管道通訊 無名管道 有名管道 檔案系統中有名 訊號通訊...