
apue阅读笔记
文章平均质量分 84
five丶
上海大学软工研究生,cpp后端方向
展开
-
进程间通信(三):消息队列与共享内存
前言我们在进程间通信(一)和进程间通信(二)中,我们介绍了两种传统的通信机制,本文我们介绍两种XSI进程通信机制——消息队列和共享内存。ftokXSI通信机制会在内核中创建一个IPC结构体,并使用key作为这个结构体的外部标识,ftok函数用于生成这样一个key,ftok的函数原型如下:#include <sys/ipc.h>key_t ftok(const char *path, int id); //失败返回-1path参数用于引用一个现有的文件,ftok函数按照path取原创 2021-05-21 23:49:26 · 539 阅读 · 0 评论 -
进程间通信(二):管道
前言管道是一种非常古老的进程通信机制,在目前的Linux操作系统中也随处可见,本文我们来探讨一下不同类型管道的机制和使用方法。原理在Linux文件系统(一)中我们提到过文件的类型,其中一类文件类型就是管道文件,实际上,管道的实现原理正是借助了文件系统来实现的,下图展示了管道的读写过程。读进程和写进程分别打开一个file结构体并链接到同一个i-node,通过i-node找到对应数据页进行读写。PIPEpipe被称为无名管道,是一种只能用于亲缘关系间的单工通信方法,pipe使用下面的函数创建:#原创 2021-05-20 23:23:30 · 207 阅读 · 0 评论 -
进程间通信(一):信号
前言信号是软件中断的一种,是一种较早产生的进程间通信机制,信号的名称都以“SIG”开头,比如常见的SIGABRT、SIGALRM等。信号的种类Linux中的信号被定义为正整数常量,在bits/signum.h文件中如下:#define SIGSTKFLT 16 /* Stack fault (obsolete). */#define SIGPWR 30 /* Power failure imminent. *//* Historical signals specified by POSI原创 2021-05-17 23:34:31 · 259 阅读 · 0 评论 -
Linux文件系统(二)
文件描述符与文件的关系在虚拟地址空间中,进程将打开的文件描述符放在pcb的文件描述符表中,文件描述符指向一个文件表项,文件表项则指向文件的i-node节点。i-node节点的具体结构可以参考Linux文件系统(一)中的描述,文件表项虽然是系统层面管理的,但对于相同的i-node,不同进程对应的文件表项是不同的,文件表项实际上是struct file结构体,文件描述符表就是元素为struct file的数组,同一进程中多次打开同一文件,对应的文件表项和i-node都相同,而不同进程打开同一文件,文件表项不原创 2021-05-16 14:09:52 · 117 阅读 · 0 评论 -
Linux文件系统(一)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档Linux有一个著名的理念:一切皆文件,在Linux中,可以把任何东西都理解为文件,这是因为Linux文件包含很多类型:普通文件,包括文本文件和二进制文件;目录文件,文件目录本身其实就是一个目录类型的文件,可以通过vim等文本编辑器直接打开,但只有操作系统内核才能直接写目录文件;块特殊文件,提供对设备(如磁盘)带缓冲的访问;字符特殊文件:提供对设备不带缓冲的访问;管道:用于进程间网络通讯的管道文件;套接字:用于进程间通讯的套接原创 2021-05-11 23:24:44 · 158 阅读 · 0 评论 -
线程同步
线程安全多线程程序共享虚拟地址空间,使得多个线程可以操作同一变量,但这也可能带来意料之外的问题,比如下面的代码:#include <bits/stdc++.h>#include <pthread.h>#include <errno.h>int num = 0;void* add(void *){ ++num; return nullptr;}int main(){ pthread_t tid[10]; for(int原创 2021-05-08 23:09:48 · 105 阅读 · 0 评论 -
进程关系
终端登录linux系统启动时,内核创建ID为1的init进程,当有新用户登录时,如果终端允许登录,init进程fork出子进程,然后使用exec装载getty程序,getty程序具有超级用户权限,使用RW方式打开终端,此时将会设置文件描述符0、1、2,并等待用户输入账户登录,用户输入账户名后,进程使用exec装载login程序。login程序此时仍拥有超级用户权限,等待用户输入正确密码后,设置当前目录,终端所有权、访问权限、组ID、用户ID等信息,这些信息之前被记录在/etc/passwd中,如果多次输原创 2021-05-05 23:16:27 · 107 阅读 · 0 评论 -
fork/vfork
前言unix操作系统提供了一系列进程的控制原语来操作进程,fork()/vfork()就是其中用于创建新进程的两种系统调用。forkfork()函数创建的新的子进程是原本父进程的副本,从虚拟地址空间的角度来看,可以用下图表示。此时的子进程几乎和父进程一摸一样,包括代码的执行位置。fork()函数在unistd.h文件中声明,下面是函数原型:pid_t fork();pid_t是进程id的类型,fork()失败时,返回值为-1,fork()成功时,父进程返回子进程的进程id,子进程返回0。下面原创 2021-05-04 00:52:09 · 130 阅读 · 0 评论 -
exec函数族
这个系列是新开的apue阅读笔记系列。前言unix操作系统下,经常使用fork来创建子进程,而fork创建的子进程是完全复刻父进程的映像,如果我们想要执行另一个程序,可以使用exec函数族中的某个函数替换执行的程序,exec函数族成员exec函数族总共包含七个函数,他们都定义在unistd.h文件中,他们执行出错时均返回-1。#include <unistd.h>int execl(const char *pathname, const char *arg0,.../* (char原创 2021-05-03 14:20:16 · 114 阅读 · 0 评论