Linux是一个庞大的操作系统,并且在多任务环境中发挥着重要作用。但是,即使现代操作系统可以支持许多任务,它仍然需要实现进程间通信(Inter-process Communication,IPC)才能实现有效的任务处理。
Linux下的IPC机制有很多,其中最常见的是管道(Pipe),信号(Signal),共享内存(Shared Memory),消息队列(Message Queue)和信号量(Semaphore)等几种方式进行进程间通信。
管道(Pipe)是最常见的IPC通信方式。管道由一个读取端(read end)和一个写入端(write end)组成,不同的进程可以通过这两个端来实现数据的发送和接收。管道的优点是数据流的简单明了,适用于数据量小比较频繁的进程间通信。
//创建一个管道
int pipe_fd[2];
if(pipe(pipe_fd)
perror("pipe create error");
exit(EXIT_FAILURE);
}
信号(Signal)是另一种实现进程间通信的有效方式。信号是一种轻量级的消息传递机制,可以用来通知进程发生了哪些变化,信号由发送端发出,接收端接收,信号发送以后,接收端会收到通知,和接收信号有关的系统调用有:kill(),sigaction(),sigpending()等等.
//发送信号
kill(pid,signo);
//设置信号处理函数
signal(int signo, void (*func)(int))
//捕获信号
sigaction( int signo, const struct sigaction *act,struct sigaction *oact);
共享内存(Shared Memory)是一种固定大小的进程间通信方式,可以允许不同的进程访问不同的地址空间中同一段内存区域,这使得我们可以利用这一特性来实现进程间通信,也是Linux下IPC通信机制中最重要的一种。
//创建共享内存
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
//映射共享内存
ptr = mmap(NULL, sizeof(int),PROT_READ | PROT_WRITE, MAP_SHARED,shm_fd, 0);
//写入共享内存
int val = 12;
memcpy(ptr, &val, sizeof(int));
//关闭共享内存
munmap(ptr, sizeof(int));
close(shm_fd);
消息队列(Message Queue)是一种用于进程间的消息传递的IPC机制,它有一个特点:消息可以保存在消息队列中,它是一种类似于文件系统的IPC方式。使用该方法可以更好地控制消息的传递,可以按照先进先出或者先进后出的顺序传递消息。
//创建一个消息队列
mqd_t mqd;
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 100;
mqd = mq_open(name,O_RDWR | O_CREAT, 0666, &attr);
//向消息队列发送消息
mq_send(mqd, buf,len, priority);
//从消息队列接收消息
mq_receive(mqd, buf, len , priority);
//关闭消息队列
mq_close(mqd);
最后还有一种实现Linux下IPC的机制就是信号量(Semaphore),这是一种用于同步多个进程之间操作的一种机制,和其他IPC机制一样,信号量也可以用来实现多个进程间的通信。
//创建信号量
sem_t *sem;
sem = sem_open(name, O_CREAT, 0666, 1);
//P操作,减少信号量
sem_wait(sem);
//V操作,增加信号量
sem_post(sem);
//销毁信号量
sem_close(sem);
总的来说,管道,信号,