lniux程序間通訊 目的
1.資料傳輸:乙個程序需要將他的資料傳送給另乙個程序
2.資源共享:多個程序之間共享同樣的資源
3.通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知他們發生了某種事件
4.程序控制:有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望攔截另乙個程序的所有操作,並能夠及時知道它的狀態變化。
分類1.無名管道(pipe)和有名管道(
fifo)
2.訊號(signal)
3.訊息佇列
4.共享記憶體
5.訊號量
6.套接字(socket)
管道通訊
管道是單項的,先進先出的,它的乙個程序的輸出和另乙個程序的輸入連線在一起。
乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料.
資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。
管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞。
管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。
無名管道建立
建立管道pipe
讀管道read
寫管道write
關閉管道close
pipe
函式的作用:建立無名管道
函式的原型:int pipe(int fds[2])
函式的標頭檔案:#include
函式的引數:新建的兩個描述符有fds陣列返回,
fds[0]:
用於讀管道;
fds[1]
:用於寫管道
返回值:成功0;出錯-1
eg_1:pipe.c
##include
#include
#include
#include
int main()
int pipe_fd[2];
if(pipe(pipe_fd)<0)
printf("pipe create error\n");
return -1;
else
printf("pipe create success\n");
close(pipe_fd[0]);
close(pipe_fd[1]);
eg_2:pipe_rw.c
#include
#include
#include
#include
#include
int main()
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char* p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
/*建立管道*/
if(pipe(pipe_fd)<0)
printf("pipe create error\n");
return -1;
/*建立子程序*/
if((pid=fork())==0) //子程序
or 父程序?
printf("\n");
close(pipe_fd[1]);
sleep(2); /*為什麼要睡眠*/
if((r_num=read(pipe_fd[0],buf_r,100))>0)
printf( "%d numbers read from the pipe is %s\n",r_num,buf_r);
close(pipe_fd[0]);
exit(0);
else if(pid>0)
close(pipe_fd[0]);
if(write(pipe_fd[1],"hello",5)!=-1)
printf("parent write1 hello!\n");
if(write(pipe_fd[1]," pipe",5)!=-1)
printf("parent write2 pipe!\n");
close(pipe_fd[1]);
sleep(3);
waitpid(pid,null,0); /*等待子程序結束*/
exit(0);
return 0;
管道讀寫
管道用於不同程序間通訊,通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道
1.管道通訊是單向的,有固定的讀端和寫端
2.資料被程序從管道讀出後,在管道中該資料不存在了
3.當程序去讀取空管道的時候,程序會阻塞
4.當程序往滿管道寫入資料時,程序會阻塞
5.管道容量為64k
注意事項:必須在系統呼叫fork前呼叫
pipe
函式,否則子程序將不會繼承檔案描述符
有名管道:
有名管道和無名管道基本相同,但也有不同點:
無名管道只能有父子程序使用;
但是通過命名管道,不相關的程序也能交換資料。
有名管道操作:
建立管道mkfifo
開啟管道open
讀管道read
寫管道write
關閉管道close
刪除管道unlink
mkfifo
函式的作用:建立有名管道
函式的原型:int mkfifo(const char * filename,mode_t mode)
引數的作用:filename:有名管道的路徑,名稱
mode:開啟管道的方式:
1.o_nonblock:fifo
開啟的時候,非阻塞
2.o_rdonly:唯讀
3.o_wronly:只寫
4.o_rdwr:可讀寫
eg_1:fifo_write.c
#include
#include
#include
#include
#include
#include
#include
#define fifo_server "/tmp/myfifo"
main(int argc,char** argv)
int fd;
char w_buf[100];
int nwrite;
/*開啟管道*/
fd=open(fifo_server,o_wronly|o_nonblock,0);
if(argc==1)
printf("please send something\n");
exit(-1);
strcpy(w_buf,argv[1]);
/* 向管道寫入資料 */
if((nwrite=write(fd,w_buf,100))==-1)
printf("the fifo has not been read yet.please try later\n");
else
printf("write %s to the fifo\n",w_buf);
eg_2:fifo_read.c
#include
#include
#include
#include
#include
#include
#include
#define fifo_server "/tmp/myfifo"
main(int argc,char** argv)
int fd;
char w_buf[100];
int nwrite;
/*開啟管道*/
fd=open(fifo_server,o_wronly|o_nonblock,0);
if(argc==1)
printf("please send something\n");
exit(-1);
strcpy(w_buf,argv[1]);
/* 向管道寫入資料 */
if((nwrite=write(fd,w_buf,100))==-1)
printf("the fifo has not been read yet.please try later\n");
else
printf("write %s to the fifo\n",w_buf);
Linux程序通訊
linux程序通訊 無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用l...
Linux 程序通訊
程序通訊 通訊 communication 意味著在程序間傳送資料。也把程序間控制資訊的交換稱為低階通訊,而把程序間大批量資料的交換稱為高階通訊。程序通訊的型別 1 共享儲存器系統 記憶體 共享儲存器系統為了傳送大量資料,在儲存器中劃出一塊共享儲存區,諸程序可通過對共享儲存區進行讀資料或寫資料以實現...
Linux 程序通訊
linux下程序通訊的八種方法 管道 pipe 命名管道 fifo 共享記憶體 shared memory 訊息佇列 message queue 訊號量 semaphore 訊號 signal 套接字 socket linux命令中,執行乙個程式,後面加上 代表後台執行,也就是執行這個程式的同時,你...