MST

星途 面试题库

面试题:C++多进程编程中的进程间通信

在C++多进程编程中,常用的进程间通信方式有哪些?请简述每种方式在Linux系统下使用C++实现的基本步骤,比如管道通信,需要提及如何创建管道、父子进程如何使用管道进行数据传递。
34.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

管道(Pipe)

  1. 创建管道:使用 pipe 函数,其原型为 int pipe(int pipefd[2]);,该函数创建一个管道,pipefd[0] 用于读,pipefd[1] 用于写。
  2. 父子进程使用管道进行数据传递
    • 父进程创建子进程 pid_t pid = fork();
    • 如果 pid == 0(子进程):关闭读端 close(pipefd[0]);,向管道写数据 write(pipefd[1], data, sizeof(data));,然后关闭写端 close(pipefd[1]);
    • 如果 pid > 0(父进程):关闭写端 close(pipefd[1]);,从管道读数据 read(pipefd[0], buffer, sizeof(buffer));,然后关闭读端 close(pipefd[0]);

命名管道(Named Pipe,FIFO)

  1. 创建命名管道:使用 mkfifo 函数,原型为 int mkfifo(const char *pathname, mode_t mode);pathname 是命名管道的路径名,mode 是文件权限。
  2. 进程使用命名管道进行数据传递
    • 写端:打开命名管道 int fd = open(pathname, O_WRONLY);,写数据 write(fd, data, sizeof(data));,关闭 close(fd);
    • 读端:打开命名管道 int fd = open(pathname, O_RDONLY);,读数据 read(fd, buffer, sizeof(buffer));,关闭 close(fd);

消息队列(Message Queue)

  1. 创建或获取消息队列:使用 msgget 函数,原型为 int msgget(key_t key, int msgflg);key 是消息队列的键值,msgflg 是标志位。
  2. 发送消息:定义消息结构,例如 struct msgbuf { long mtype; char mtext[256]; };,使用 msgsnd 函数,原型为 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);msqid 是消息队列标识符,msgp 是指向消息结构的指针,msgsz 是消息正文的长度,msgflg 是标志位。
  3. 接收消息:使用 msgrcv 函数,原型为 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);msgtyp 是期望接收的消息类型。

共享内存(Shared Memory)

  1. 创建或获取共享内存:使用 shmget 函数,原型为 int shmget(key_t key, size_t size, int shmflg);key 是共享内存的键值,size 是共享内存的大小,shmflg 是标志位。
  2. 映射共享内存到进程地址空间:使用 shmat 函数,原型为 void *shmat(int shmid, const void *shmaddr, int shmflg);shmid 是共享内存标识符,shmaddr 一般为 NULL 表示让系统选择合适的地址,shmflg 是标志位。
  3. 使用共享内存进行数据交互:直接对映射后的地址进行读写操作。
  4. 分离共享内存:使用 shmdt 函数,原型为 int shmdt(const void *shmaddr);shmaddr 是映射后的地址。
  5. 删除共享内存:使用 shmctl 函数,原型为 int shmctl(int shmid, int cmd, struct shmid_ds *buf);cmdIPC_RMID 时表示删除共享内存。

信号量(Semaphore)

  1. 创建或获取信号量集:使用 semget 函数,原型为 int semget(key_t key, int nsems, int semflg);key 是信号量集的键值,nsems 是信号量集中信号量的个数,semflg 是标志位。
  2. 初始化信号量:使用 semctl 函数,原型为 int semctl(int semid, int semnum, int cmd, ...);semid 是信号量集标识符,semnum 是要操作的信号量编号,cmdSETVAL 时用于初始化信号量。
  3. P操作(等待信号量):自定义 semaphore_p 函数,使用 semop 函数,原型为 int semop(int semid, struct sembuf *sops, unsigned nsops);sops 是指向 sembuf 结构数组的指针,nsops 是数组中元素的个数,在 sembuf 结构中设置 sem_op 为 -1 实现 P 操作。
  4. V操作(释放信号量):自定义 semaphore_v 函数,同样使用 semop 函数,在 sembuf 结构中设置 sem_op 为 1 实现 V 操作。