如何在Linux中进行进程间通信?代码举例讲解

在Linux中,进程间通信(IPC)主要有以下几种方式:

  1. 信号(Signal):
  • 发送信号:kill -SIGUSR1 1234 向进程1234发送SIGUSR1信号。
  • 信号处理函数:void signal_handler(int signum)
    例如:
// 信号处理函数
void signal_handler(int signum) {
    if (signum == SIGUSR1) {
        // 收到SIGUSR1信号
        ...
    }
}

int main() {
    // 注册信号处理函数
    signal(SIGUSR1, signal_handler);  

    ...
}
  1. 管道(Pipe):
  • 创建管道:int pipefd[2]; pipe(pipefd);
  • 进程A写入管道:write(pipefd[1], “Hello”, 6);
  • 进程B从管道读取:read(pipefd[0], buf, sizeof(buf));
    例如:
// 进程A
int main() {
    int pipefd[2];
    pipe(pipefd);

    write(pipefd[1], "Hello", 6);
}

// 进程B 
int main() {
    int pipefd[2];
    pipe(pipefd);

    char buf[6];
    read(pipefd[0], buf, sizeof(buf));
    printf("%s", buf);  // Hello
}
  1. 消息队列(Message Queue):
  • 创建消息队列:mqd_t mq_open(“/mq”, O_CREAT);
  • 发送消息:mq_send(mqd, msg, sizeof(msg), 0);
  • 接收消息:mq_receive(mqd, buf, sizeof(buf), NULL);
    例如:
// 进程A
int main() {
    mqd_t mqd = mq_open("/mq", O_CREAT);

    char msg[] = "Hello";
    mq_send(mqd, msg, sizeof(msg), 0);
}  

// 进程B
int main() {
    mqd_t mqd = mq_open("/mq", O_CREAT);

    char buf[6];
    mq_receive(mqd, buf, sizeof(buf), NULL);
    printf("%s", buf); // Hello
}
  1. 共享内存(Shared Memory):
  • 创建共享内存:int shm_fd = shm_open(“/shm”, O_CREAT, 0644);
  • 映射共享内存:void *shm_ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
  • 访问共享内存:shm_ptr[0] = ‘x’;