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、共享内存

共享内存是


数据运维技术 » Linux系统下进程间通信实现(linux的进程间通信)