Linux系统下进程间通信实现(linux的进程间通信)
进程间通信(Inter-Process Communication,IPC)指的是多个独立运行的进程之间进行数据交换和同5步操作的手段。有时候,通过进程间通信(IPC),我们可以解决很多功能问题。在Linux系统中,使用的IPC主要有管道和消息队列、信号量、共享内存和套接字等五种技术。
1、管道
管道可以看成是一种消息传递的简易方式,它可以实现无名、半双工数据通信。它由两个进程共享一个内核缓冲区组成,其它进程仅仅是通过只读或只写的手段非永久性的访问之。管道的实现代码如下:
#include
#include
int main(){
int fd[2]; pid_t pid;
char buff[20];
if(pipe(fd) printf("Create Pipe Failed!");
return 1; }
pid = fork(); if(pid
printf("Fork process Failed!"); return 1;
}
if(pid == 0){ //子进程 close(fd[0]);
write(fd[1],"hello pipe!",12); }else{ //父进程
close(fd[1]); read(fd[0], buff, 12);
printf("buff= %s\n",buff); }
return 0;}
2、消息队列
消息队列是消息传递的另一种实现方式,它可以将消息放入一队列中,任何一个进程都可以从其中提取消息,只要提取的权限比较高就可以删除队列中的消息,接受消息的进程不知道消息来源。消息队列的实现代码如下:
#include
#include
#include
#include
struct mymsgbuf{
long mtype; char mtext[100];
};
int main(){
struct mymsgbuf message; int msgid;
msgid=msgget(1234,IPC_CREAT|0600); if(msgid==-1)
{ perror("message get failed\n");
return 1; }
message.mtype=1; sprintf(message.mtext,"This is a message to theQueue\n");
if((msgsnd(msgid,&message,sizeof(struct mymsgbuf),0))==-1) {
perror("message send failed\n"); return 1;
} printf("Message sent to message queue\n");
return 0;}
3、信号量
信号量是多进程之间同步的机制,它有两个应用:一是维护某个共享资源的访问,另一是维护多个进程之间的关系。每一个信号量都有一个值,称为信号量的初值S。当S>0时,信号量允许某个进程访问它的共享资源,每访问一次就将S的值减1;当S=0时,表示没有进程访问该共享资源;当S<0时,表示有-|S|个进程等待访问共享资源。信号量的实现代码如下:
#include
#include
#include
//定义信号量变量sem_t sem1;
//线程1执行函数void *thread1(void *arg)
{ while (1) {
sem_wait(&sem1); //执行P操作(将信号量减1) printf("Thread1 is running!\n");
}}
//线程2执行函数void *thread2(void *arg)
{ while (1) {
sem_post(&sem1); //执行V操作(将信号量加1) printf("Thread2 is running!\n");
}}
//主函数(程序入口)int main()
{ int err;
pthread_t pt1,pt2;
//初始化信号量 sem_init(&sem1, 0, 1);
err = pthread_create(&pt1,NULL,thread1,NULL); //创建线程1 if(err != 0)
{ printf("Create thread1 failed!\n");
return 1; }
err = pthread_create(&pt2,NULL,thread2,NULL); //创建线程2 if(err != 0)
{ printf("Create thread2 failed!\n");
return 1; }
pthread_join(pt1,NULL); //等待线程1执行完毕 pthread_join(pt2,NULL); //等待线程2执行完毕
sem_destroy(&sem1); //删除信号量
return 0;}
4、共享内存
共享内存是