Linux进程间通信类系统调用总结与示例

 
Category: Linux-Shell

写在前面

基本方法

  • 通信:关注进程之间的数据交换
    1. 数据传输:
      • 管道, FIFO, socket
      • 伪终端
      • 消息队列(POSIX/System V)
    2. 共享内存:
      • 共享内存(POSIX/System V)
      • 内存映射
  • 同步:关注进程和线程操作之间的同步, 有以下四种主要形式:
    1. 信号量(POSIX/System V)
    2. 文件锁
    3. 互斥(线程)
    4. 条件变量(线程)
  • 信号:尽管信号的主要作用并不在此,但在特定场景下仍然可以将它作为一种同步技术。更罕见的是信号还可以作为一种通信技术:信号编号本身是一种形式的信息,并且可以在实时信号上绑定数据(一个整数或指针)
    1. 标准信号
    2. 实时信号

信号

获取信号描述字符串

两种方法, 一种是读取全局数组, 一种是使用strsignal()系统调用.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#define getsig(x) (#x)

extern const char* const sys_siglist[];
void t1() {
    int sig = SIGPIPE;
    printf("sig:%d, %s, info:%s\n", sig, getsig(SIGPIPE), sys_siglist[sig]);
    /* sig:13, SIGPIPE, info:Broken pipe */
}

extern char* strsignal(int);
void t2() {
    printf("sig:%d, %s, info:%s\n", SIGPIPE, getsig(SIGPIPE),
           strsignal(SIGPIPE));
    /* sig:13, SIGPIPE, info:Broken pipe */
}

int main(int argc, char* argv[]) {
    /* t1(); */
    t2();
    return 0;
}