利用檔案進行程序間通訊的程式示例:
#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.有哪幾種程序間通訊方式?管道通訊 無名管道 有名管道 檔案系統中有名 訊號通訊...