真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向

sockpair實(shí)現(xiàn)進(jìn)程間通信

創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為朔州等服務(wù)建站,朔州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為朔州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

我們以前學(xué)習(xí)的利用管道(此處為匿名管道)實(shí)現(xiàn)進(jìn)程間通信,只能是單向的,一邊只能讀而另一邊只能寫(xiě),且只能在有血緣關(guān)系的進(jìn)程間才能通信,若想實(shí)現(xiàn)雙向通信就必須創(chuàng)建雙向管道,而sockpair它的實(shí)現(xiàn)就是雙向管道進(jìn)行通信。它可以用來(lái)創(chuàng)建雙向通信管道

1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 
  9 int main()
 10 {
 11     int sv[2]={0,0};
 12     char buf[1024];
 13     int sock_pair=socketpair(AF_LOCAL,SOCK_STREAM,0,sv);
 14     if(sock_pair < 0)
 15     {
 16         perror("socketpair");
 17         exit(1);
 18     }
 19     pid_t id=fork();
 20     if(id<0)
 21     {
 22         perror("fork");
 23         return -1;
 24     }else if(id==0){ //child
 25         close(sv[0]);
 26         while(1)
 27         {
 28             memset(buf,'\0',sizeof(buf));
 29             strcpy(buf,"I'm child");
 30             write(sv[1],buf,strlen(buf));
 31             ssize_t _size=read(sv[1],buf,sizeof(buf)-1);
 32             if(_size<0)
 33             {
 34                 perror("read");
 35                 return -2;
 36             }else if(_size > 0)
 37             {
 38                 buf[_size]='\0';
 39                 printf("father->child:%s\n",buf);
 40             }
 41             sleep(1);
 42         }
 43         close(sv[1]);
 44 
 45     }else
 46     {
 47         close(sv[1]);
 48         while(1)
 49         {
 50             ssize_t _size=read(sv[0],buf,sizeof(buf)-1);
 51             if(_size<0)
 52             {
 53                 perror("read");
 54                 exit(2);
 55             }else if(_size >0)
 56             {
 57                 buf[_size]='\0';
 58                 printf("child->father:%s\n",buf);
 59             }
 60 //          memset(buf,'\0',sizeof(buf));
 61             strcpy(buf,"I'm father");
 62             write(sv[0],buf,sizeof(buf)-1);
 63         }
 64         close(sv[0]);
 65     }
 66     return 0;
 67 }

程序運(yùn)行結(jié)果:

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向

重定向:對(duì)文件描述符進(jìn)行重定向

例:將一個(gè)文件中的內(nèi)容打印到標(biāo)準(zhǔn)輸出上,若關(guān)閉了標(biāo)準(zhǔn)輸出文件描述符,此時(shí)再打開(kāi)一個(gè)文件,文件描述符將為1,而此時(shí)第一個(gè)文件的內(nèi)容將會(huì)被打印到文件中(即重定向)

 若新創(chuàng)建一個(gè)進(jìn)程文件描述符會(huì)從3(若0、1、2都不關(guān))開(kāi)始?

當(dāng)打開(kāi)一個(gè)終端時(shí),該過(guò)程即為創(chuàng)建一個(gè)會(huì)話(huà)的過(guò)程,會(huì)有一個(gè)控制進(jìn)程bash,也就是會(huì)話(huà)首進(jìn)程,關(guān)聯(lián)terminal終端后會(huì)默認(rèn)填上標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯(cuò)誤,因此在當(dāng)下創(chuàng)建的進(jìn)程都為子進(jìn)程,又因子進(jìn)程在創(chuàng)建時(shí)會(huì)繼承父進(jìn)程的文件描述符,因此創(chuàng)建一個(gè)進(jìn)程后文件描述符會(huì)從3開(kāi)始。

使用dup重定向:函數(shù)原型 int dup(int oldfd)

例:關(guān)閉1號(hào)文件描述符(標(biāo)準(zhǔn)輸出),本應(yīng)將標(biāo)準(zhǔn)輸入的內(nèi)容打印到標(biāo)準(zhǔn)輸出上,重定向到了log文件中

 1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 
  9 int main()
 10 {
 11     int fd=open("./log",O_CREAT|O_RDWR,0644);
 12     if(fd<0)
 13     {
 14         perror("open");
 15         exit(1);
 16     }
 17     close(1); //必須關(guān)閉要重定向的文件描述符
 18     int newfd=dup(fd);
 19     if(newfd <0)
 20     {
 21         perror("dup");
 22         exit(2);
 23     }

 24     char buf[1024];

 25 

 26     while(1)

 27     {

 28         memset(buf,'\0',sizeof(buf));

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

 30         if((strncmp("quit",buf,4))==0)

 31         {

 32             break;

 33         }

 34         printf("%s\n",buf);

 35         //printf("hello world\n");

 36         fflush(stdout);

 37     }

 38     close(newfd);

 39 

 40     return 0;

 41 }

輸入內(nèi)容:

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向

重定向到log文件中內(nèi)容

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向

int dup2(int oldfd,int newfd)

 1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include
  8 
  9 int main()
 10 {
 11     int fd=open("./log",O_CREAT|O_RDWR,0644);
 12     if(fd<0)
 13     {
 14         perror("open");
 15         exit(1);
 16     }
 17     close(1); //可以不必關(guān)閉1號(hào)文件描述符
 18     int newfd=dup2(fd,1);
 19     if(newfd <0)
 20     {
 21         perror("dup");
 22         exit(2);
 23     }

 

24     char buf[1024];
 25     while(1)
 26     {
 27         memset(buf,'\0',sizeof(buf));
 28         fgets(buf,sizeof(buf),stdin);
 29         if((strncmp("quit",buf,4))==0)
 30         {
 31             break;
 32         }
 33         printf("%s",buf);
 34         //printf("hello world\n");
 35         fflush(stdout);
 36     }
 37     close(newfd);
 38 
 39     return 0;
 40 }
 41

輸入內(nèi)容:

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向

log文件中內(nèi)容:

高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向


分享名稱(chēng):高級(jí)IO中socketpair實(shí)現(xiàn)進(jìn)程間通信以及重定向
瀏覽路徑:http://weahome.cn/article/gcdcjj.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部