拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux应用软件编程 第四章:IPC机制(进程间通信)

IPC 进程间通信 interprocess communicate三大类1.同一主机进程间通信①古老的通信方式②无名管道③有名管道④信号2.IPC对象通信 system v①共享内存*②消息队列③信号量集3.主要用在不同主机进程间通信①socket通信②网络通信1. 无名管道无名管道 只能用在具有亲缘关系的进程间通信父子进程有名管道 可以用在同一主机任意进程间通信。操作流程创建并打开管道 pipe()读管道read();写管道write();关闭管道close();int pipe(int pipefd[2]);功能创建并打开一个无名管道参数pipefd管道读端和写端的文件描述符pipefd[0] 读端pipefd[1] 写端返回值成功0失败-1管道的特点管道本质是内核中的一段缓冲区默认64K字节遵循队列存储方式FIFO。1. 写阻塞当管道的读写端都存在时管道写满数据时发生写阻塞。2. 读阻塞当管道的读写端都存在时管道为空时读管道发生读阻塞。3. 读返回0当管道没有写端只有读端时管道中有数据则读出数据无数据时不再读阻塞读管道直接返回0字节。4. 管道破裂当管道没有读端向管道中写数据发生管道破裂异常2. 有名管道有名管道 可以用在同一主机任意进程间通信创建有名管道文件: mkfifo();打开管道文件 open();写管道文件:write();读管道文件:read();关闭管道文件:close();3. 信号信号进程间通知机制不携带数据---异步通知机制信号软中断1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN1 36) SIGRTMIN2 37) SIGRTMIN338) SIGRTMIN4 39) SIGRTMIN5 40) SIGRTMIN6 41) SIGRTMIN7 42) SIGRTMIN843) SIGRTMIN9 44) SIGRTMIN10 45) SIGRTMIN11 46) SIGRTMIN12 47) SIGRTMIN1348) SIGRTMIN14 49) SIGRTMIN15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX2 SIGINT:ctrl c 让一个进程被打断3 SIGQUIT:ctrl \让一个进程结束9 SIGKILL:强制让一个进程结束11SIGSEGV:让一个进程结束(段错误)13SIGPIPE:让一个进程结束(管道破裂)14SIGALRM:让一个进程结束(定时时间到达)17SIGCHLD:子进程结束时发送给父进程18SIGCONT:让停止态的进程继续执行19SIGSTOP:让运行态的进程进入停止态暂停强制停止20SIGTSTP:ctrl z 让进程进入暂停态后台进程来自终端的停止信号10 SIGUSR112 SIGUSR2专门预留给程序员使用的未定义信①注册信号信号处理方式a. 忽略 不处理b. 缺省 按照操作系统默认方式处理c. 捕获 按照自定义方式处sighandler_t signal(int signum, sighandler_t handler);功能注册一个信号参数signum 要注册的信号的编号handler对信号的处理方式SIG_IGN : 按忽略方式处理SIG_DFL 按照缺省方式处理自定义的函数按照捕获方式处理返回值成功handler失败SIG_ERR【注意】1. 如果信号不注册自动按照默认缺省方式处理大多数信号默认处理方式是结束一个进程。2. 信号尽量早注册。② 发送信号int kill(pid_t pid, int sig);功能给进程发送一个信号参数pid接收信号的进程sig信号的编号返回值成功0失败-1③ pausevoid pause(void);功能挂起一个进程让进程进入休眠可以通过一个信号唤醒pause挂起的进程但是这个信号必须被捕获。④alarmunsigned int alarm(unsigned int seconds);功能定时若干秒之后发送一个SIGALRM的信号4. 消息队列system V IPC对象消息队列①将进程间通信的数据封装成消息体发送②增加消息类型可以根据消息的类型设置数据的优先级。获取IPC的key值ftok();创建消息队列 msgget();发送消息队列消息: msgsnd();接收消息队列消息 :msgrcv();删除消息队列 : msgctl()key_t ftok(const char *pathname, int proj_id);功能产生一个IPC对象key值参数pathname路径名proj_id项目id返回值成功key值失败-1int msgget(key_t key, int msgflg);功能根据key值创建一个消息队列参数key IPC key值msgflgIPC_CREAT|0664返回值成功消息队列ID失败-1int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);功能发送消息队列的消息参数msqid消息队列IDmsgp要发送的消息体struct msgbuf {long mtype; /* message type, must be 0 */ 消息类型char mtext[1]; /* message data */ 消息正文};msgsz消息正文大小msgflg 标志位0默认方式发送返回值成功0失败-1int msgctl(int msqid, int cmd, struct msqid_ds *buf);功能操作IPC对象对应的消息队列参数msqid消息队列的idcmd操作方法IPC_STAT:获取状态操作IPC_SET: 设置IPC_RMID:删除操作bufIPC_RMID buff-》NULL返回值成功0失败-1ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);功能从消息队列中接收消息参数msqid消息队列IDmsgp 要接受的消息的存储位置msgsz消息正文的大小msgtyp消息类型msgflg标志位0默认方式返回值成功返回实际消息正文的大小失败-1IPC对象命令ipcs -a查看系统中的IPC对象ipcrm -q msgidipcrm -Q msgkey删除消息队列5. 共享内存共享内存进程间效率最高的通信方式利用内存映射技术避免了数据的反复拷贝int shmget(key_t key, size_t size, int shmflg);功能创建共享内存并获得共享内存的id参数key IPC对象key值size共享内存的大小PAGE_SIZE4096字节整数倍shmflg IPC_CREAT | 0664返回值成功共享内存的ID失败-1void *shmat(int shmid, const void *shmaddr, int shmflg);功能建立共享内存和用户空间的内存映射参数shmid共享内存idshmaddr映射的用户空间首地址NULL 由操作系统选择用户空间并以返回值的方式返回空间首地址shmflg SHM_RDONLY :只读SHM_RDONLY 读写返回值成功映射的用户空间首地址失败void *-1int shmctl(int shmid, int cmd, struct shmid_ds *buf);功能操作共享内存参数shmid共享内存idcmd操作指令IPC_RMID 删除操作buf NULL返回值成功0失败-16. 信号量集信号量集信号量数组进程间同步
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门