掌握Linux中IPC的秘诀(linuxipcs)
IPC(Inter-process communication)是程序之间通信的一种重要方法。在Linux系统中,IPC通信有以下几种方式:
一、管道(Pipe)
管道是最简单的一种IPC通信方式,主要实现连个进程之间的通信。
1.管道有两种,一种是有名管道(FIFO),另一种是无名管道(pipe)。
2.有名管道是一个特殊的文件,有访问和操作方法,可以实现多进程间的数据通信。
3.无名管道只能用于父子进程间的通信,不能用于兄弟进程间的通信,且管道有往管道里写数据,也可以从管道读出数据。
//有名管道的创建:
#include
#include
#include
#include
#include
void main(){
int fd;
if(mkfifo(“fifo”,0777)
printf(” Creat fifo error!\n”);
}
if((fd=open(“fifo”,O_WRONLY))
printf(” open fifo error!\n”);
}
printf(“fd = %d \n”,fd);
//待写入管道的数据
char str1[]=”Hello! I’m pipe!”;
write(fd, str1, strlen(str1));
}
二、消息队列(Message Queue)
消息队列是一种以特定的消息格式存放数据的一种任务处理机制。它可以实现不同进程间的数据传输,这是一种比较高级的IPC通信机制。
//消息队列的创建:
#include
#include
int main(){
int msg_id;
key_t key;
key=ftok(“/etc/profile”,’a’);
msg_id=msgget(key,IPC_CREAT);
printf(“%d \n”,msg_id);
//希望往消息队列写入的数据
char message[]=”It’s a message!”;
struct message{
long type;
char text[100];
}msg;
msg.type=3;
strcpy(msg.text,message);
//写入消息队列
msgsnd(msg_id,(void *)&msg,sizeof(msg),IPC_NOWAIT);
return 0;
}
三、信号量(Semaphore)
信号量也被称为二值信号量,是一个相对较发较复杂的IPC通信方式,主要解决的是资源的共享和保护,它的实现主要是借助于进程同步的一种特殊机制。
//信号量的创建:
#include
#include
key_t key;
//创建一个键值
key=ftok(“/etc/profile”,’a’);
//根据键值创建一个信号量
int sem_id=semget(key,1,IPC_CREAT);
//对信号量进行初始化
union semum{
int val;
};
union semum sem_arg;
sem_arg.val=1;
semctl(sem_id,0,SETVAL,sem_arg);
以上就是Linux中IPC的秘诀,三种不同IPC机制分别满足不同需求,可以按照不同情况来使用。