Linux程序通訊

2021-07-23 22:49:46 字數 4255 閱讀 9508

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命令中,執行乙個程式,後面加上 代表後台執行,也就是執行這個程式的同時,你...