uc9

来源:互联网 发布:新旧系统数据迁移方案 编辑:程序博客网 时间:2024/05/16 17:18
回顾:
  vfork()+exec系列函数 - 创建子进程的方式
  执行全新的代码
  vfork() 确保子进程先运行,不会复制 父进程的内存空间,但在调用exec系列函数之前会占用 父进程内存空间。
  exec系列函数 可以 执行新的程序,替换以前的代码区、全局区、堆区、栈区。execl() execlp()
  waitpid() 让父进程等待子进程,比wait()更灵活
  信号 - 其实就是一个整数,被用来实现 软件中断。Linux系统中,1-64(不连续),信号分为可靠信号(34-64)和不可靠信号(1-31)。为了编程的通用性,尽量使用信号的宏定义。信号的处理方式包括:
   1 默认处理
   2 忽略信号
   3 自定义处理函数 - void fa(int signo){ }
  设置信号处理方式(注册)用signal()或sigaction()
  信号发送函数:raise() kill() alarm() sigqueue
今天:
  信号
  IPC - 进程间通信(管道)
  kill()
   int kill(pid_t pid,int sig);
   pid 的值 可以是以下4种情况:
    > 0 发给进程ID=pid的某个进程
    = 0 发给和发送进程同组的所有进程
    = -1 发给所有 有发送权限的进程
    < -1 发给进程组ID=-pid的进程
  killall 进程名称
   可以杀死多个同名进程
  alarm()
   alarm(int sec)是闹钟函数,sec秒之后产生一个SIGALRM信号。
   如果多次调用alarm(),后面的闹钟会替换前面的。
   如果sec = 0 ,取消所有的闹钟
  返回值:
   如果alarm()时,以前设置的闹钟还没有执行,会返回之前的闹钟剩余的秒数;如果以前设置的闹钟执行了,或者没有设置,返回0.
 
  信号集
   以一个二进制位 代表一个信号,考虑到 扩展的问题,因此 用一个很大的整数 代表 多个信号,这个很大的整数就是信号集,信号集的类型 sigset_t.
   集合的必须提供的功能:
    增加元素、删除元素、查找元素、取出元素
   信号集的功能函数:
    sigemptyset() - 清空全部信号(二进制位置0)
    sigfillset() - 填满全部信号(二进制位置1)
    sigaddset() - 增加一个信号
    sigdelset() - 删除一个信号
    sigismember()- 判断是否有某个信号(有返回1)
  信号屏蔽
    在执行某些关键代码时,不希望代码被信号中断。此时可以使用信号屏蔽,信号屏蔽不是阻止信号的到来,而是延后信号的处理(信号来了但不处理)。解除信号屏蔽以后 再处理 来过的信号。设置信号屏蔽字函数:
   sigprocmask(int how,sigset_t* new,
    sigset_t* old)
   参数how是屏蔽方式,有三种:
    SIG_BLOCK - 相当于加法在原有的基础加上新的
     a b c + c d e -> a b c d e
    SIG_UNBLOCK - 相当于减法在原有的基础上减去新的 a b c - c d e -> a b
    SIG_SETMASK - 重新设置,与原有的无关
      a b c c d e -> c d e
    一般使用SIG_SETMASK
    参数new是新的屏蔽信号集,old可以把之前的屏蔽信号集保存起来,如果old为NULL就是不保存。
    如果保存了old,再次设置信号屏蔽字为old就是取消屏蔽。
   (常用信号的知识点over)
   sigaction() 可以注册信号的处理方式,功能和signal一样,但sigaction是增强版的signal。
   sigqueue() 函数可以发送信号,并且在发送信号的同时 附加 数据。
   计时器
    Linux系统给每个进程 维护了3个计时器,真实计时器、虚拟计时器和实用计时器。其中真实计时器最常用。真实计时器是每隔一段时间产生一个SIGALRM信号
   设置/获取计时器的函数:
    setitimer() getitimer()
 IPC - 进程间通信
  IPC就是两个或者多个进程之间的数据交互。
   IPC的方法:
    1 文件
    2 信号(signal)
    3 管道
    4 共享内存
    5 消息队列(综合练习)
    6 信号量集(与今天的信号无关semaphore)
    7 网络编程(socket)
    ....
   管道是Unix最古老的IPC方式,现在已很少使用。
   4 5 6 用法类似,统称为XSI IPC,遵守相同的规范。
   管道分为有名管道和无名管道。有名管道由程序建立管道文件,用于进程间的通信。而无名管道由内核建立管道文件,用于fork()创建的父子进程之间的通信。
  管道 是通过 管道文件(媒介) 进行交互的。管道文件和 普通文件有所区别。管道文件是 mkfifo命令创建的或者mkfifo()函数新建,管道文件的后缀 .pipe。
  管道文件只是 数据的中转站,不存储数据。因此,只有读写都ok时,才能畅通。(echo cat)
  管道的使用和文件一样的,但管道文件的创建必须用mkfifo。

0 0
原创粉丝点击