本文主要是介绍20240204进程间通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.无名管道
1 //无名管道2 #include <myhead.h>3 int main(int argc, const char *argv[])4 {5 //定义进程号变量6 pid_t pid =-1;7 //定义存放管道文件描述符的数组8 int pipefd[2]={0};9 //创建管道文件10 if(pipe(pipefd)==-1)11 {12 perror("pipe error");13 return -1;14 }15 printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0],pipefd[1]);16 //创建一个子进程17 pid=fork();18 //pid>0父进程负责写19 if(pid>0)20 {21 //关闭父进程无名管道中的读端22 close(pipefd[0]);23 24 char buf[128]="";25 while (1)26 {27 fgets(buf,sizeof(buf),stdin);28 buf[strlen(buf)-1]='\0';29 write(pipefd[1],buf,sizeof(buf));30 if (strcmp(buf,"quit")==0)31 {32 break;33 }34 }35 close(pipefd[1]);36 37 }38 else if (pid==0)//子进程负责读39 {40 //关闭子进程的写端41 close(pipefd[1]);42 43 char rbuf[128]="";44 45 while (1)46 {47 bzero(rbuf,sizeof(rbuf));48 read(pipefd[0],rbuf,sizeof(rbuf));49 printf("收到父进程消息:%s\n",rbuf);50 if (strcmp(rbuf,"quit")==0)51 {52 break;53 }54 }55 close(pipefd[0]);56 }57 return 0;58 }
~
~
~
~
~
~
~
~
~
~
有名管道
myfifo 管道文件:
建一个管道文件2 #include <myhead.h>3 int main(int argc, const char *argv[])4 {5 if (mkfifo("myfifo",0664)==-1)6 {7 perror("mkfifo error");8 return -1;9 }10 getchar();//阻塞11 system("rm myfifo");//删除当前目录下的管道文件12 return 0;13 }
~
~
~
send发送端:1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 5 //打开管道文件6 int wfd=-1;7 if ((wfd=open(".myfifo",O_WRONLY))==-1)8 {9 perror("wfd open error");10 return -1;11 }12 //向管道文件中写入数据13 char wbuf[128]="";14 while (1)15 {16 printf("请输入>>>");17 fgets(wbuf,sizeof(wbuf),stdin);18 wbuf[strlen(wbuf)-1]='\0';19 20 write(wfd,wbuf,sizeof(wbuf));21 if (strcmp(wbuf,"quit")==0)22 {23 break;24 }25 }26 close(wfd);27 return 0;28 }
~
~
recv接收端:1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 int rfd=-1;5 if((rfd=open("./myfifo",O_RDONLY))==-1)6 {7 perror("rfd open error");8 return -1;9 }10 //读11 char rbuf[128]="";12 while(1)13 {14 bzero(rbuf,sizeof(rbuf));15 read(rfd,rbuf,sizeof(rbuf));16 printf("收到一条消息:%s\n",rbuf);17 if (strcmp(rbuf,"quit")==0)18 {19 break;20 }21 }22 close(rfd);23 24 return 0;25 }
~
~
信号:
1 #include <myhead.h>2 //定义信号处理函数3 void handler(int signo)4 {5 if (signo==SIGCHLD)6 {7 while(waitpid(-1,NULL,WNOHANG)>0);8 }9 }10 int main(int argc, const char *argv[])11 { 12 if (signal(SIGCHLD,handler)==SIG_ERR)13 {14 perror("signal error");15 return -1;16 } 17 //创建僵尸进程18 for (int i=0;i<20 ;i++ )19 { 20 if(fork()==0)21 {22 exit(EXIT_SUCCESS);23 }24 }25 while(1);//阻塞26 return 0;27 }
~
~
~
这篇关于20240204进程间通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!