网站外链建设周期,大数据营销方案,部门网站建设情况总结,舆情分析师匿名管道
struct_file的两套资源 管道只能单向通信 特征
1.如果管道没有数据 读端在读 默认会直接阻塞正在读取的进程 2.写端写满 在写会阻塞 等待对方读取 管道设计 命名管道 实现管道通信
#pragma once
#includeiostream
#includestring
#includesys/… 匿名管道
struct_file的两套资源 管道只能单向通信 特征
1.如果管道没有数据 读端在读 默认会直接阻塞正在读取的进程 2.写端写满 在写会阻塞 等待对方读取 管道设计 命名管道 实现管道通信
#pragma once
#includeiostream
#includestring
#includesys/types.h
#includesys/stat.h
#includecerrno
#includecstring
#includecassert
#includeunistd.h
#includefcntl.husing namespace std;
#define NAME_PIPE /home/ls/lesson24/tmp2bool createFifo(const string path){int nmkfifo(path.c_str(),0777);if(n0)return true;else{couterrno:errnoerr stringstrerror(errno)endl;return false;}
}void removeFifo(const string path){int nunlink(path.c_str());assert(n0);(void)n;}#includecomm.hppint main(){bool rcreateFifo(NAME_PIPE);assert(r);int rfdopen(NAME_PIPE,O_RDONLY);if(rfd0)exit(0);char buffer[1024];while(true){ssize_t sread(rfd,buffer,sizeof(buffer));if(s0){buffer[s]0;coutclient-server#bufferendl;}else if(s0){coutclient quit me tooendl;break;}else{couterr string:strerror(errno)endl;break;}}close(rfd);remove(NAME_PIPE);return 0;
}#includecomm.hppusing namespace std;
int main(){int wfdopen(NAME_PIPE,O_WRONLY);if(wfd0)exit(0);char buffer[1024];while(true){coutPlease Say#;fgets(buffer,sizeof(buffer),stdin);ssize_t nwrite(wfd,buffer,strlen(buffer));assert(nstrlen(buffer));(void)n;}close(wfd);return 0;
}共享内存
原理 接口的认识 共享内存的优缺点
和管道对比拷贝次数 实现通信
//comm.hpp
#pragma once
#includesys/ipc.h
#includesys/shm.h
#includecerrno
#includecstring
#includeiostream
#includeunistd.h#define PATHNAME .
#define PROJ_ID 0x66
#define MAX_SIZE 4096key_t getkey(){key_t kftok(PATHNAME,PROJ_ID);if(k0){std::cerrerrno:strerror(errno)std::endl;exit(1);}return k;
}int getShmHelper(key_t k,int flags){int shmidshmget(k,MAX_SIZE,flags);if(shmid0){std::cerrerrno:strerror(errno)std::endl;exit(2);}return shmid;
}int getShm(key_t k){return getShmHelper(k,IPC_CREAT);
}int createShm(key_t k){return getShmHelper(k,IPC_CREAT|IPC_EXCL|0666);
}void* attachShm(int shmid){void* memshmat(shmid,nullptr,0);if((long long)mem-1){std::cerrerrno:strerror(errno)std::endl;exit(3);}return mem;
}void detachShm(void* start){if(shmdt(start)-1){std::cerrerrno:strerror(errno)std::endl;}
}void delShm(int shmid){if(shmctl(shmid,IPC_RMID,nullptr)-1){std::cerrerrno:strerror(errno)std::endl;}
} //shm_client.cpp
#includeiostream
#includecomm.hppint main(){key_t kgetkey();printf(key:0x%x\n,k);int shmidgetShm(k);printf(shmid:%d\n,shmid);sleep(5);char* start(char*)attachShm(shmid); //关联共享内存printf(attch sucess,address start:%p\n,start);const char* messagehello server,我是另一个进程 正在和你通信;pid_t idgetpid();int cnt1;while(true){sleep(1);snprintf(start,MAX_SIZE,%s[pid:%d][消息编号:%d],message,id,cnt);}detachShm(start); //去关联sleep(5);return 0;
} //shm_server.cpp
#includeiostream
#includecomm.hppint main(){key_t kgetkey();printf(key:0x%x\n,k);int shmidcreateShm(k);printf(shmid:%d\n,shmid);sleep(5);//关联共享内存char *start(char*)attachShm(shmid);printf(attch sucess,address start:%p\n,start);//使用while(true){printf(client say:%s\n,start);sleep(1);}//去关联detachShm(start);sleep(10);//删除共享内存delShm(shmid);return 0;
} 消息队列了解 信号量 为什么要有信号量 信号 实现kill
#includeiostream
#includeunistd.h
#includesignal.h
#includecstdio
#includecstring
#includestringstatic void Usage(const std::string proc){std::coutUsage:procpid signo\nstd::endl;
}int main(int argc,char *argv[]){if(argc!3){Usage(argv[0]);exit(1);}pid_t pidatoi(argv[1]);int signoatoi(argv[2]);int nkill(pid,signo);if(n!0)perror(kill);while(true){std::couthellostd::endl;sleep(1);}
} 产生信号的方式
除0的理解 软件条件
#includeiostream
#includeunistd.h
#includesignal.h
#includecstdio
#includecstring
#includestring
#includecstdlib/* static void Usage(const std::string proc){std::coutUsage:procpid signo\nstd::endl;
} */
int cnt0;
void catchSig(int signo){std::cout获取一个信号 信号编号:cntstd::endl;exit(1);
}int main(int argc,char *argv[]){signal(SIGALRM,catchSig);alarm(1);while(true){cnt;}
}
闹钟管理 核心转储 阻塞信号 信号捕捉流程 状态切换 实验
#includeiostream
#includeunistd.h
#includesignal.h
#includevector#define MAX_SIGNUM 31
#define BLOCK_SIGNAL 2static std::vectorint sigarr{2,3};static void show_pending(const sigset_t pending){for(int signoMAX_SIGNUM;signo0;signo--){if(sigismember(pending,signo)){std::cout1;}elsestd::cout0;}std::cout\n;
}static void myhandler(int signo){std::coutsigno号信号已经被递达std::endl;
}int main(){for(const auto sig:sigarr){signal(sig,myhandler);}sigset_t block,oblock,pending;//初始化sigemptyset(block);sigemptyset(oblock);sigemptyset(pending);//增加要屏蔽的信号for(const auto sig:sigarr){sigaddset(block,sig);}//开始屏蔽 设置进内核进程sigprocmask(SIG_SETMASK,block,oblock);//遍历打印pending信号集while(true){//初始化sigemptyset(pending);//获取它sigpending(pending);//打印show_pending(pending);sleep(1);}int cnt10;if(cnt--0){sigprocmask(SIG_SETMASK,oblock,block);std::cout恢复信号屏蔽\n;}}