Linux软件编程--进程间通信

1、概述

  1.进程间通信概述

  • 进程间空间是独立的,包含文本段、数据段和系统数据段,进程是操作系统的最小操作单元
  • 在 Linux 中,可以使用Linux内核实现多个进程间的通信

  2.进程间通信常用的方式

  • 传统 Unix 系统中的通信方式:管道、信号
  • SYS V分支中的通信方式:消息队列、共享内存、信号灯
  • BSD 分支中的通信方式:本地域套接字

2、管道

  1.分类

  • 有名管道:可以用于任意进程间通信
  • 无名管道:只能用于父子进程间通信

  2.无名管道

        概述
  • 无名管道是一段内核缓存区
        函数接口

        pipe 

原型:

        int pipe(int pipefd[2]);

功能:

        创建一个无名管道(内核缓存区)

参数:

        pipefd[0]:读管道文件描述符

        pipefd[1]:写管道文件描述符

        注:只有该父进程的子进程才能继承得到这两个文件描述符实现通信

返回值:

        成功返回0 失败返回-1

        管道操作特性
类型读取数据结果写入数据结果
至少有一个写端如果管道中有数据则直接读出如果管道中没有数据则阻塞等待有数据写入才能读出
没有写端管道中有数据则直接读出管道中没有数据不阻塞等待直接向下执行
至少有一个读端如果管道没有写满则直接写入如果管道存满则阻塞等待有数据读出才能继续写入
没有读端  --会产生管道破裂的信号导致进程任务异常退出

3.有名管道

        概述
  • 有名管道有名字,可以通过名字找到该管道
  • 有名管道是进程间通信最简单、易实现的方法,可以用于任意进程间的通信
  • 有名管道必须读写两端同时加入才能继续向下执行
  • 两个进程可以通过向管道文件中读写数据实现进程的通信
        函数接口

        mkfifo

原型:

        int mkfifo(const char *pathname, mode_t mode);

功能:

        创建有名管道

参数:

        pathname:管道文件名

        mode:权限

返回值:

        成功返回0  失败返回-1

3、信号

  1.概述

  • Linux系统中的信号主要实现应用层和内核层之间的信号通知
  • 信号主要用于多个进程任务间的事件通知
  • 信号可以用户异步通信

  2.常见的信号类型

信号名功能信号名功能

SIGINT

终止信号SIGALARM定时时间到达信号
SIGQUIT退出信号SIGCHLD子进程结束,父进程接收到的信号
SIGKILL杀死进程信号SIGCONT继续执行进程任务
SIGSEGV段错误信号SIGSTOP停止进程任务
SIGPIPE管道破裂信号SIGTSTP挂起信号
SIGIO异步IO信号SIFGUSR用户自定义信号

  3.信号处理方式

  • 缺省:信号到达按默认方式处理
  • 忽略:信号到达时不处理信号,忽略信号
  • 捕捉:信号到达时按用户定义的方式处理

    注:9号信号(SIGKILL)和19号信号(SIGSTOP)不能被忽略和捕捉

  4.函数接口

        signal

原型:

        typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能:

        设置signum对应信号的处理方式

参数:

        signum:信号的编号

        handler:信号的处理方式

                SIG_IGN:忽略信号

                SIG_DFL:缺省处理信号

返回值:

        成功返回之前处理信号的方式

        失败返回SIG_ERR

        alarm

原型:

        unsigned int alarm(unsigned int seconds);

功能:

        设置第一个定时,过seconds秒后,给进程发送SIGALRM信号

参数:

        seconds:秒数

返回值:

        成功返回上次定时剩余的秒数

        如果之前没有定时返回0

     kill

原型:

        int kill(pid_t pid, int sig);

功能:

        给pid对应的进程发送sig信号

参数:

        pid:进程的ID号

        sig:信号的编号

返回值:

        成功返回0 失败返回-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值