linux程序間通訊之管道通訊

2021-09-11 03:51:33 字數 1961 閱讀 8893

一、命名管道通訊

管道通訊分為:無名管道和有名管道

無名管道是用於父子孫程序,之間有血緣關係

有名管道:用於任意兩個程序

無名管道:

1、建立:int pipe(int filedis[2]); 它會建立兩個檔案描述符 filedis[0] 用於讀管道

filedis[1] 用於寫管道

(通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道。必須在系統呼叫fork()前呼叫pipe(),否則子程序將不會繼承檔案描述符)

2、關閉:close(filedis[0]),close(filedis[1])

//利用無名管道進行程序間通訊,父程序write,子程序read

//所需要用到的函式pipe,fork,write,read,memset,strcmp

#include #include #include #include #include void write(int fd)

; memset(buf,0,sizeof(buf));

printf("please input what you would write:\n");

fgets(buf,sizeof(buf),stdin);

int ret = write(fd,buf,sizeof(buf));

if(-1 == ret)

}void read(int fd)

; memset(buf,0,sizeof(buf));

int ret = read(fd,buf,sizeof(buf));

if(-1 == ret)

printf("read from pipe:%s\n",buf);

}int main()

; pid_t pid;

ret = pipe(fd);//建立乙個無名管道

if(-1 == ret)

pid = fork();

if(-1 == pid)

else if(0 == pid)//子程序,read

else//父程序,write

return 0;

}

二、命名管道

fifo_read.c

//應用有名管道進行不同程序之間的通訊,其實是在磁碟上開啟乙個tmp檔案進行讀寫

//所要應用到的函式:mkfifo,open,read,close,unlink,strcmp

#include #include #include #include #include #include #include int main()

while(1)

printf("read from 1.tmp :%s\n",buf);

if(!strcmp(buf,"bye\n"))

memset(buf,0,sizeof(buf));

} close(fd);

unlink("1.tmp");

return 0;

}

fifo_write.c

//有名管道寫程序

//open,write,strcmp,close

#include #include #include #include #include #include #include int main()

; fd = open("1.tmp",o_wronly);

if(-1 == fd)

while(1)

if(!strcmp(buf,"bye\n"))

memset(buf,0,sizeof(buf));

}close(fd);

return 0;

}

linux程序間通訊之管道

下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...

Linux程序間通訊之管道

管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...

Linux 程序間通訊之管道

這裡說的管道是指匿名管道 無名管道 是 unix 系統ipc最古老的形式。其本質是乙個偽檔案 實為核心緩衝區 它是半雙工的 即資料只能在乙個方向上流動 具有固定的讀端和寫端。它只能用於具有親緣關係的程序之間的通訊 也是父子程序或者兄弟程序之間 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的...