ipc(一)

来源:互联网 发布:linux怎么用ss翻墙 编辑:程序博客网 时间:2024/04/30 00:49
一、Linux下进程间通信方式总结(管道篇)




IPC全称interprocess communication,即进程间通信。在shell下可以输入命令ipcs来查看。
[toor@zcm ipc]$ ipcs -a


------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status


------ Semaphore Arrays --------
key        semid      owner      perms      nsems


------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages


总结起来linux下进程间通信有以下几种方式:


1、管道(pipe)
2、共享队列(queue)
3、信号量(semaphore)
4、共享内存(shared memory)
5、套接字(socket)


管道
管道是UNIX系统IPC的最古老形式。它提供了进程之间的一种单向通信的方法
管道分为有名管道和有名(匿名)管道。
无名管道在父子进程中应用,有名管道是一个文件可以被系统中的所有进程使用来达到进程通信的目的。

无名管道占用两个文件描述符,只能在父子进程间使用。所以使用匿名管道就会调用fork函数创建父子进程,
可以说无名管道存在于内存中。
调用函数pipe创建。

------------------------------------------------------------------------------------------------
#include <unistd.h>

int pipe(int fildes[2]);
------------------------------------------------------------------------------------------------
pipe函数可以得到两个文件描述符:
其中fildes[0]直接可以read,即为读而打开。
  fildes[1]直接可以write,即为写而打开。
  
例如:子进程通过管道发送数据hello父进程接受并打印输出。
------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <unistd.h>

int main(void)
{
   int fd[2];
   char buff[10];
   int r;
   pipe(fd);
   if(fork() == 0)
   {
       close(fd[0]);//关闭读端
       write(fd[1], "hello\n", 6);
       return 0;
   }
   else
   {
       close(fd[1]);//关闭写端
       r = read(fd[0], buff, 6);
       buff[r] = '\0';
       printf("%s", buff);
   }
   return 0;
}
------------------------------------------------------------------------------------------------

原创粉丝点击