面试题答案
一键面试管道(Pipe)
- 创建管道:使用
pipe
函数,其原型为int pipe(int pipefd[2]);
,该函数创建一个管道,pipefd[0]
用于读,pipefd[1]
用于写。 - 父子进程使用管道进行数据传递:
- 父进程创建子进程
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)
- 创建命名管道:使用
mkfifo
函数,原型为int mkfifo(const char *pathname, mode_t mode);
,pathname
是命名管道的路径名,mode
是文件权限。 - 进程使用命名管道进行数据传递:
- 写端:打开命名管道
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)
- 创建或获取消息队列:使用
msgget
函数,原型为int msgget(key_t key, int msgflg);
,key
是消息队列的键值,msgflg
是标志位。 - 发送消息:定义消息结构,例如
struct msgbuf { long mtype; char mtext[256]; };
,使用msgsnd
函数,原型为int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
,msqid
是消息队列标识符,msgp
是指向消息结构的指针,msgsz
是消息正文的长度,msgflg
是标志位。 - 接收消息:使用
msgrcv
函数,原型为ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
,msgtyp
是期望接收的消息类型。
共享内存(Shared Memory)
- 创建或获取共享内存:使用
shmget
函数,原型为int shmget(key_t key, size_t size, int shmflg);
,key
是共享内存的键值,size
是共享内存的大小,shmflg
是标志位。 - 映射共享内存到进程地址空间:使用
shmat
函数,原型为void *shmat(int shmid, const void *shmaddr, int shmflg);
,shmid
是共享内存标识符,shmaddr
一般为NULL
表示让系统选择合适的地址,shmflg
是标志位。 - 使用共享内存进行数据交互:直接对映射后的地址进行读写操作。
- 分离共享内存:使用
shmdt
函数,原型为int shmdt(const void *shmaddr);
,shmaddr
是映射后的地址。 - 删除共享内存:使用
shmctl
函数,原型为int shmctl(int shmid, int cmd, struct shmid_ds *buf);
,cmd
为IPC_RMID
时表示删除共享内存。
信号量(Semaphore)
- 创建或获取信号量集:使用
semget
函数,原型为int semget(key_t key, int nsems, int semflg);
,key
是信号量集的键值,nsems
是信号量集中信号量的个数,semflg
是标志位。 - 初始化信号量:使用
semctl
函数,原型为int semctl(int semid, int semnum, int cmd, ...);
,semid
是信号量集标识符,semnum
是要操作的信号量编号,cmd
为SETVAL
时用于初始化信号量。 - P操作(等待信号量):自定义
semaphore_p
函数,使用semop
函数,原型为int semop(int semid, struct sembuf *sops, unsigned nsops);
,sops
是指向sembuf
结构数组的指针,nsops
是数组中元素的个数,在sembuf
结构中设置sem_op
为 -1 实现 P 操作。 - V操作(释放信号量):自定义
semaphore_v
函数,同样使用semop
函数,在sembuf
结构中设置sem_op
为 1 实现 V 操作。