<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 進(jìn)程的通信-創(chuàng)新互聯(lián)

            通信領(lǐng)域的幾個(gè)概念:

            專(zhuān)注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)靈石免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

            ? 單工通信:數(shù)據(jù)的傳送方向?yàn)閱蜗虻?,發(fā)送端和接收端都是固定的,后續(xù)不可更改【廣播:廣播是發(fā)送端,聽(tīng)的人是接收端】

            ? 半雙工通信:數(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.無(wú)名管道:實(shí)現(xiàn)交換的第三方的介質(zhì),存在在linux內(nèi)核中,在文件系統(tǒng)中不可見(jiàn)

            ? 是用pipe創(chuàng)建的一個(gè)內(nèi)核文件

            特點(diǎn):

            1.只能用于具有親緣關(guān)系(父子,子孫,兄弟)的進(jìn)程間的通信,

            2.是一種單工通信模式(理論上是雙工的,但是通信雙方的收發(fā)順序不好控制,通常用作單工)

            3.無(wú)名管道的數(shù)據(jù)存放在內(nèi)存中,管道中的數(shù)據(jù)讀走后就不存在了,無(wú)名管道只存在在內(nèi)核中,在文件系統(tǒng)中不可見(jiàn)

            不好用?。?!

            ? pipe函數(shù):

            #include//作用:創(chuàng)建無(wú)名管道
            
            int pipe(int fd[2]);
            
            //pipefd[2]:數(shù)組,fd[0]用來(lái)標(biāo)識(shí)讀管道文件
                             //fd[1]用來(lái)標(biāo)識(shí),寫(xiě)管道文件(IO函數(shù),read,write)
            //參數(shù):有兩個(gè)整數(shù)的數(shù)組
            
            //成功返回0,失敗返回-1
            #include#include#include#define SIZE 30
            
            //無(wú)名管道
            
            int main()
            {
            
            	//創(chuàng)建無(wú)名管道
                //fd[0],fd[1]是文件描述符
            	//fd[0]用來(lái)標(biāo)識(shí)讀出管道文件
            	//fd[1]用來(lái)標(biāo)識(shí)寫(xiě)入管道文件
            	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:要寫(xiě)的內(nèi)存空間的首地址
            		//參數(shù)3:要寫(xiě)的內(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)中可見(jiàn)

            #include#includeint mkfifo(const char *pathname, mode_t mode);
            
            //作用:創(chuàng)建一個(gè)有名管道
            //*pathname:是有名管道文件的名稱(chēng)
            //mode :文件的權(quán)限
            //返回值:成功返回0,失敗返回-1
            
            
            //A進(jìn)程數(shù)據(jù)傳到B進(jìn)程
            A:
                1.mkfifo->有名稱(chēng)
                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ù)讀走后就沒(méi)有了

            4.有名管道文件在文件系統(tǒng)中可見(jiàn),文件大小為0,因?yàn)閿?shù)據(jù)存放在內(nèi)存中

            先寫(xiě)后讀?

            #include#include#include#define SIZE 30
            
            //無(wú)名管道
            
            int main()
            {
            
            	//創(chuàng)建無(wú)名管道
            	//fd[0]用來(lái)標(biāo)識(shí)讀出管道文件
            	//fd[1]用來(lái)標(biāo)識(shí)寫(xiě)入管道文件
            	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:要寫(xiě)的內(nèi)存空間的首地址
            		//參數(shù)3:要寫(xiě)的內(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;
            }

            先讀后寫(xiě)

            #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ù))--->用來(lái)改變信號(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)類(lèi)型,可以取除了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)處理,不寫(xiě)的話此處理默認(rèn)也是執(zhí)行系統(tǒng)默認(rèn)處理
                               

            -->sighandler_t類(lèi)型的函數(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è)類(lèi)型為sig的信號(hào)時(shí),就執(zhí)行handler 所指定的函數(shù),(int)signum是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進(jìn)程只要接收到類(lèi)型為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://www.jbt999.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;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 草比91| 18禁日韩无码 | 国产女人18毛片18精品 | 各种三级爱爱视频 | 最新国产在线视频 |