一:任务描写叙述
A,B两个进程通过管道通信,像曾经的互相聊天一样,然后A进程每次接收到的数据通过A1进程显示(一个新进程,用于显示A接收到的信息),A和A1间的数据传递採用共享内存,相应的有一个B1进程。用于显示B进程接收到的信息。
针对A,B进程,退出时採用ctrl+c退出,当收到相应信号后。自身进程可以通过信号处理函数进行资源清理,清理后exit退出进程。(A1,B1,手动关闭就可以)。界面图例如以下。
二:代码展示
A进程
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include <sys/sem.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/time.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <signal.h> int shm_id; struct t { char buf[128]; }; struct t *p; void hanle(int sig) { shmdt(p); shmctl(shm_id,IPC_RMID,NULL);//删除共享内存 printf("delete OK........ "); exit(0); } int main() {//A进程 signal(SIGINT,hanle);//捕捉 ctrl+c信号 shm_id=shmget((key_t)1234,4096,0600|IPC_CREAT); //创建了一个共享内存 // struct t *p; p=(struct t*)shmat(shm_id,NULL,0);//拿到内存的指针结构体 int f1; f1=open("1.fifo",O_WRONLY);//对1 打开写端 int f2; f2=open("2.fifo",O_RDONLY);//对2 打开读端 fd_set readset; //定义了可读集合 int maxfd; maxfd=STDIN_FILENO > f2 ?STDIN_FILENO+1:f2+1; struct timeval check; check.tv_sec=1;//设置查看时间是一秒 char buf[128]; while(1) { FD_ZERO(&readset);//初始化 FD_SET(STDIN_FILENO,&readset);//加入监控对象 FD_SET(f2,&readset); select(maxfd,&readset,NULL,NULL,&check);//返回可读的监控对象 if(FD_ISSET(STDIN_FILENO,&readset)) {//假设监控到了1管道中有标准输入 那么获取到数据 写到管道中 memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); buf[strlen(buf)-1]='