您的位置:首页 > 其它

进程间通讯摘录(1)-----无名管道

2014-03-29 12:57 218 查看
进程间通讯包括有名管道,无名管道,消息队列,信号,共享内存,套接字。

有名管道与无名管道:前者允许无亲缘关系的进程间通信,管道存在于文件系统中,后者存在于内核中。

消息队列:与队列不同的是消息队列每次可以从队列中取同一类型的数据,而不是一个数据。消息队列克服了管道通信与信号通的信息量有限的缺点。

信号:在软件层次上对中断的一种模拟。

共享内存:最有效的进程间通信的方式,使得多个进程访问同一块内存空间,共享更新。但该通信方式依赖同步机制,如互斥锁和信号量。

信号量:进程之间或同一进程不同线程之间的同步或互斥的手段。

套接字:用于网络中不同机器之间。

无名管道代码示例:

创建管道------父进程fork(创建子进程)------关闭父进程的读和子进程的写描述符————读写

#include <unistd.h>

#include <sys/type.h>

#include <error.h>

#include <stdio.h>

#include <stdlib.h>

#define MAX_DATA_LEN 256

#define DELAY_TIME 1 //父子程序分别延时等待对方关闭读写字符

int main()

{

  pid_t pid;

  int pipe_fd[2];

  char buf[MAX_DATA_LEN];

  const char data[]="Pipe Test Program";

  int real_read,real_write; //接收读写成功后返回的字节数,打印出来

  memset((void*)buf,0,sizeof(buf));

  if(pipe(pipe_fd)<0)

  {

  printf("pipe creat error !\n");

  exit(1);

  }

  if((pid=fork())==0) //子进程读管道数据

  {

  close(pipe_fd[1]); //关闭写描述符

  sleep(DELAY_TIME*3); // 延时等待父进程关闭读描述符

  if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0) // 读入buffer,成功后接受读字节数

    {

    printf("%d bytes read from the pipe is '%s'\n",real_read,buf); //打印字节数和读入内容

    }

  close(pipe_fd[0]);

  exit (0);

  }

  else if(pid>0)

  {

  close(pipe_fd[0]);

  sleep(DELAY_TIME);

  if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)

    {

      printf("Parent wrote %d bytes :'%s'\n",real_write,data);

     }

  close(pipe_fd[1]);

  waitpid(pid,NULL,0); //接收子进程退出时状态并收尸

  exit(0);

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: