通信領(lǐng)域的幾個(gè)概念:
? 單工通信:數(shù)據(jù)的傳送方向?yàn)閱蜗虻?,發(fā)送端和接收端都是固定的,后續(xù)不可更改【廣播:廣播是發(fā)送端,聽的人是接收端】
? 半雙工通信:數(shù)據(jù)的傳送方向?yàn)殡p向,但不同時(shí),發(fā)送端和接收端不固定,但不能同時(shí)兩端都為發(fā)送端或都為接收端【對(duì)講機(jī)】
? 全雙工通信:數(shù)據(jù)的傳送方向?yàn)殡p向且同時(shí)(電腦)
進(jìn)程間通信:兩個(gè)進(jìn)程數(shù)據(jù)交換
1.無名管道:實(shí)現(xiàn)交換的第三方的介質(zhì),存在在linux內(nèi)核中,在文件系統(tǒng)中不可見
? 是用pipe創(chuàng)建的一個(gè)內(nèi)核文件
特點(diǎn):
1.只能用于具有親緣關(guān)系(父子,子孫,兄弟)的進(jìn)程間的通信,
2.是一種單工通信模式(理論上是雙工的,但是通信雙方的收發(fā)順序不好控制,通常用作單工)
3.無名管道的數(shù)據(jù)存放在內(nèi)存中,管道中的數(shù)據(jù)讀走后就不存在了,無名管道只存在在內(nèi)核中,在文件系統(tǒng)中不可見
不好用?。?!
? pipe函數(shù):
#include//作用:創(chuàng)建無名管道
int pipe(int fd[2]);
//pipefd[2]:數(shù)組,fd[0]用來標(biāo)識(shí)讀管道文件
//fd[1]用來標(biāo)識(shí),寫管道文件(IO函數(shù),read,write)
//參數(shù):有兩個(gè)整數(shù)的數(shù)組
//成功返回0,失敗返回-1
#include#include#include#define SIZE 30
//無名管道
int main()
{
//創(chuàng)建無名管道
//fd[0],fd[1]是文件描述符
//fd[0]用來標(biāo)識(shí)讀出管道文件
//fd[1]用來標(biāo)識(shí)寫入管道文件
int fd[2]={0};
if(0!=pipe(fd))
{
return -1;
}
printf("create piped success\r\n");
//創(chuàng)建一個(gè)子進(jìn)程
pid_t pid=-1;
pid=fork();
if(pid==-1)
{
//進(jìn)程未創(chuàng)建成功
return -1;
}
char buf[SIZE]={0};
if(pid==0)
{
//進(jìn)入子進(jìn)程,write
printf("child process----\r\n");
strcpy(buf,"child to parent");
//write(int fd,const void *buf,size_t count)
//參數(shù)1:文件描述符
//參數(shù)2:要寫的內(nèi)存空間的首地址
//參數(shù)3:要寫的內(nèi)容的大小
write(fd[1],buf,SIZE);
//printf("buf=%s\r\n",buf);
}
if(pid!=0)
{
//進(jìn)入父進(jìn)程
printf("parent process----\r\n");
//read(int fd,void *buf,size_t count)
//參數(shù)1:文件描述符
//參數(shù)2:要讀的內(nèi)存空間的首地址
//參數(shù)3:要讀的內(nèi)容的大小
read(fd[0],buf,SIZE);
printf("read success,buf=%s\r\n",buf);
}
return 0;
}
2.有名管道(用于任意進(jìn)程間的通信)
? 有名管道使用mkfifo創(chuàng)建的一個(gè)內(nèi)核文件,用于任意兩個(gè)進(jìn)程之間的通信
? 管道文件在文件系統(tǒng)中可見
#include#includeint mkfifo(const char *pathname, mode_t mode);
//作用:創(chuàng)建一個(gè)有名管道
//*pathname:是有名管道文件的名稱
//mode :文件的權(quán)限
//返回值:成功返回0,失敗返回-1
//A進(jìn)程數(shù)據(jù)傳到B進(jìn)程
A:
1.mkfifo->有名稱
2.open
3.write
B:
1.mkfifo
2.open
3.read
特點(diǎn):
1.有名管道可以用于任意兩個(gè)進(jìn)程間的通信
2.可以實(shí)現(xiàn)雙工通信,是建立在兩個(gè)管道上的
3.有名管道中的數(shù)據(jù)存放在內(nèi)存中,數(shù)據(jù)讀走后就沒有了
4.有名管道文件在文件系統(tǒng)中可見,文件大小為0,因?yàn)閿?shù)據(jù)存放在內(nèi)存中
先寫后讀?
#include#include#include#define SIZE 30
//無名管道
int main()
{
//創(chuàng)建無名管道
//fd[0]用來標(biāo)識(shí)讀出管道文件
//fd[1]用來標(biāo)識(shí)寫入管道文件
int fd[2]={0};
if(0!=pipe(fd))
{
return -1;
}
printf("create piped success\r\n");
//創(chuàng)建一個(gè)子進(jìn)程
pid_t pid=-1;
pid=fork();
if(pid==-1)
{
//進(jìn)程未創(chuàng)建成功
return -1;
}
char buf[SIZE]={0};
if(pid==0)
{
//進(jìn)入子進(jìn)程,write
printf("child process----\r\n");
strcpy(buf,"child to parent");
//write(int fd,const void *buf,size_t count)
//參數(shù)1:文件描述符
//參數(shù)2:要寫的內(nèi)存空間的首地址
//參數(shù)3:要寫的內(nèi)容的大小
write(fd[1],buf,SIZE);
//printf("buf=%s\r\n",buf);
}
if(pid!=0)
{
//進(jìn)入父進(jìn)程
printf("parent process----\r\n");
//read(int fd,void *buf,size_t count)
//參數(shù)1:文件描述符
//參數(shù)2:要讀的內(nèi)存空間的首地址
//參數(shù)3:要讀的內(nèi)容的大小
read(fd[0],buf,SIZE);
printf("read success,buf=%s\r\n",buf);
}
return 0;
}
先讀后寫
#include#include#include#include#include#include#include#define SIZE 20
int main()
{
//1.1.mkfifoA
int ret=-1;
ret=mkfifo("fifoa",0666);
//創(chuàng)建文件失敗并且該文件不存在
if(ret< 0 &&EEXIST!=errno)
{
printf("error\r\n");
return -1;//創(chuàng)建文件失敗
}
//創(chuàng)建文件失敗但是該文件存在--》創(chuàng)建文件成功
printf("1.1:create fifoa ok!----\r\n");
//1.2.mkfifoB
ret=mkfifo("fifob",0666);
//創(chuàng)建文件失敗并且該文件不存在
if(ret< 0 &&EEXIST!=errno)
{
printf("error\r\n");
return -1;//創(chuàng)建文件失敗
}
//創(chuàng)建文件失敗但是該文件存在--》創(chuàng)建文件成功
printf("1.2:create fifob ok!----\r\n");
//2.1.open fifoa
int fdr=open("fifoa",O_RDONLY,0666);
if(-1 == fdr)
{
perror("open error");
return -1;
}
printf("2.1:open fifoa ok!-----\r\n");
//2.2.open fifob
int fdw=open("fifob",O_WRONLY,0666);
if(-1 == fdw)
{
perror("open error");
return -1;
}
printf("2.2:open fifob ok!-----\r\n");
char buf[SIZE]={0};
while(1)
{
//read
memset(buf,0,SIZE);
read(fdr,buf,SIZE);
printf("a->b:%s\r\n",buf);
//write
memset(buf,0,SIZE);
fgets(buf,SIZE,stdin);
write(fdw,buf,SIZE);
}
//5.close
close(fdw);
close(fdr);
return 0;
}
兩個(gè)同時(shí)運(yùn)行,可實(shí)現(xiàn)通信?
3.信號(hào)通信 (唯一一種異步通信方式)
異步:被通信方不知道什么時(shí)候通信,
進(jìn)程:task_struct+4G的虛擬空間
用戶空間進(jìn)程:task_struct+(0G-3G)的虛擬空間
內(nèi)核空間進(jìn)程:task_struct+(3G-4G)的虛擬空間
信號(hào):linux操作系統(tǒng)預(yù)先定義好了64個(gè)信號(hào)(操作系統(tǒng)提供)
?kill -l :查看當(dāng)前系統(tǒng)提供的所有信號(hào)
kill -9? 進(jìn)程號(hào):程序員調(diào)用,給內(nèi)核發(fā)送SIGKILL信號(hào),讓內(nèi)核殺死指定的進(jìn)程號(hào)的進(jìn)程
用戶進(jìn)程對(duì)信號(hào)的響應(yīng)方式:捕獲信號(hào),忽略信號(hào),采用默認(rèn)處理動(dòng)作
signal (信號(hào),自定義的信號(hào)對(duì)應(yīng)的處理函數(shù))--->用來改變信號(hào)的默認(rèn)處理狀態(tài)
實(shí)現(xiàn)兩個(gè)進(jìn)程的異步通信(信號(hào)通信)
A? ?收信號(hào)進(jìn)程:要用signal注冊(cè)信號(hào)處理函數(shù),signal?,pause
B? ?發(fā)信號(hào)進(jìn)程:kill (),
//kill
#include#includeint kill(pid_t pid,int sig);
//參數(shù)1:對(duì)方的進(jìn)程號(hào)
//參數(shù)2:要發(fā)送的信號(hào)
同步通信和異步通信:
? 同步通信:發(fā)送方發(fā)數(shù)據(jù),接收方收數(shù)據(jù),雙方需要在很短的時(shí)間內(nèi)完成數(shù)據(jù)交換,否則會(huì)造成一方阻塞
? 異步通信:被通信方不知道通信方什么時(shí)候和它通信
#includetypedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
//作用:設(shè)置某一信號(hào)的動(dòng)作
//參數(shù)1:要處理的信號(hào)類型,可以取除了SIGKILL和SIGSTOP之外的任意一種信號(hào)
//參數(shù)2:描述了與信號(hào)關(guān)聯(lián)的動(dòng)作-->有3個(gè)
//返回值:成功返回先前的信號(hào)處理函數(shù)指針,錯(cuò)誤返回-1
SIG_IGN //表示忽略該信號(hào)
-->SIG_DFL //表示恢復(fù)對(duì)信號(hào)的系統(tǒng)默認(rèn)處理,不寫的話此處理默認(rèn)也是執(zhí)行系統(tǒng)默認(rèn)處理
-->sighandler_t類型的函數(shù)指針
:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
?此函數(shù)必須在signal()被調(diào)用前申明,handler(參數(shù)2)中為這個(gè)函數(shù)名,當(dāng)接收到一個(gè)類型為sig的信號(hào)時(shí),就執(zhí)行handler 所指定的函數(shù),(int)signum是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進(jìn)程只要接收到類型為sig的信號(hào),不管其正在執(zhí)行程序的哪一部分,就立即執(zhí)行func()函數(shù)。當(dāng)func()函數(shù)執(zhí)行結(jié)束后,控制權(quán)返回進(jìn)程被中斷的那一點(diǎn)繼續(xù)執(zhí)行。?
常用的Signal信號(hào):
轉(zhuǎn)載自Signal ()函數(shù)詳細(xì)介紹_懷想天空2010的博客-博客_signal函數(shù)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:進(jìn)程的通信-創(chuàng)新互聯(lián)
當(dāng)前URL:http://sd-ha.com/article34/shhpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容