linux系统中进程的6种状态 linux进程间通讯
进程间通信概述
进程间通信的目的是为了实现以下主要功能:数据传输:一个进程需要将其数据发送给另一个进程。资源共享:多个进程之间共享相同的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(例如,进程终止时需要通知父进程)。进程控制:某些进程希望完全控制另一个进程的执行(例如,调试进程),此时控制进程希望能够拦截另一个进程的所有蜡烛和异常,并能及时了解其状态变化。
进程间通信的发展包括:管道系统V进程间通信POSIX进程间通信
进程间通信的分类包括:管道:匿名管道(pipe)命名管道System V IPC:消息队列共享内存信号量POSIX IPC:消息队列共享内存信号量互斥量传感器传感器锁管道
管道是一种协商的进程间通信机制,用于有亲缘关系的进程间的通信,例如父子进程。匿名管道
匿名管道用于父子进程之间的通信。以下是匿名管道的使用示例:
以下是使用管道进行通信的示例代码:
完整代码如下:#include lt;iostreamgt;#include lt;stringgt;#include lt;cerrnogt; // errno.h#include lt;cstringgt; // string.h#include lt;unistd.hgt;#include lt;sysgt;#include lt;sysgt;const int size = 1024;std::string getOtherMessage(){ static int cnt = 0; std::string messageid = std::to_string(cnt); cnt ; pid_t self_id = getpid(); std::string stringpid = std::to_string(self_id); std::string message = quot;messageid: quot;; message = messageid; message = quot;我的pid是: quot;; message = stringpid;返回消息;}//子进程进行写入 void SubProcessWrite(int wfd){ int Pipesize = 0; std::string message = quot;爸爸,我是你的儿子进程!quot;; char c = 'A'; while (true) { std::cerr 0) { inbuffer
当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性;当要写入的数据量大于PIPE_BUF时,Linux不再保证写入的原子性。原子操作意味着写入操作不会被中断,读方要么读不到数据,要么读到完整的数据。
进程池实现
进程池的实现可以利用管道进行进程间通信。以下是进程池实现的示例代码:
ProcessPool.cc:#include lt;iostreamgt;#include lt;stringgt;#include lt;vectorgt;#include lt;unistd.hgt;#include lt;sysgt;#include lt;sysgt;#include quot;Task.hppquot;// void work(int rfd)// {// while (true)// {// int command = 0;// int n = read(rfd, amp;command, sizeof(command));// if (n == sizeof(int))// {// std::cout 0)// {// std::cout *channels,task_t task){ for (int我= 0: lt;unistd.hgt;#define TaskNum 3typedef void (*task_t)(); // task_t 函数指针类型 void Print(){ std::cout 2) return;tasks[number]();}int SelectTask(){ return rand() TaskNum;}void work(){ while (true) { int command = 0; int n = read(0, amp;command, sizeof(command)); if (n == sizeof(int)) { std::cout lt;/unistd.hgt;lt;/sysgt;lt;/cstdlibgt;lt;/ctimegt;lt;/iostreamgt;登录后复制
以上就是【Linux】进程间通信(匿名管道)的详细内容,更多请关注乐哥常识网其他相关文章!