Linux系统编程
文章平均质量分 95
笔记
D@@
这吹不出褶的平静的日子里 ,也在努力发光
展开
-
共享库的使用
在后续dlsym函数的调用中使用这个句柄会导致首先在主程序值搜索符合,然后在程序启动时加载的共享库中进行搜索,最后在所有使用了。:调用dlsym函数之后加载的共享库中搜索symbol,这个标记适用于需要创建与在其他地方定义的函数同名的包装函数的情况。,可以使用dlsym函数返回的指针来调用该函数,可以将dlsym函数返回的值存储到一个类型合适的指针中。此函数在handle执向的库以及该库的依赖树中的库中搜索名为symbol的符合(函数或变量)。此函数返回一个包含地址addr的相关信息的地址。原创 2022-10-06 21:02:54 · 947 阅读 · 0 评论 -
登录记账.
Unix系统维护着两个包含与用户登录和登出系统有关的信息的数据文件:utmp文件维护着当前登录进系统的用户记录。wtmp文件包含着所有用户登录和登出行为的留痕信息以供审计之用。Linux,utmp位于文件位于/var/run/utmp,wtmp文件位于/var/log/wtmp。原创 2022-10-06 19:36:51 · 768 阅读 · 0 评论 -
daemon
deamon生命周期很长。在后台运行并且不拥有控制终端。deamon用来指向特殊任务,如:cron:一个在规定时间执行命令的daemon。sshd:安全shell deamon,允许在远程主机上使用一个安全的通信协议登录系统。httpd:HTTP服务器daemon,用于Web页面。inetd:Internet超级服务器daemon,监听从指定的TCP/IP端口上进入的网络连接并启动相应的服务器程序来处理这些连接。通常将daemon程序的名称以字母d结尾。原创 2022-10-06 16:15:23 · 1083 阅读 · 0 评论 -
虚拟内存操作
操作会设置共享内存段的一个属性,而不是进程的属性,意味着分页一旦因故障被锁进了内存,那么即使所有进程都与这个共享内存段分离了,分页还是会保持驻留在内存中的状态。与之相反的是,使用 mlock()(或 mlockall())锁进内存的区域只有在还存在进程持有该区域上的锁时才会保持被锁进内存的状态。由于加锁操作的单位是分页,因此被锁住的区域的结束位置为大于 length 加 addr 的下一个分页边界。adr地址必须是分页对齐的,并且由于返回的信息是有关整个分页的,length分页大小的下一个整数倍。原创 2022-10-04 17:39:56 · 1333 阅读 · 0 评论 -
远程调用-Sun RPC
构建一个庞大的单一程序,完成全部工作。把整个应用程序散布到彼此通信的多个进程中。假设所有进程运行在同一台主机上。假设某些进程会运行在其他主机上。不同部分之间需要网络通信的应用程序大多数是使用显式网络编程方式编写的,也就是如UNPvl中讲述的那样直接调用套接字API或 XTI API。使用套接字API时,客户调用socket、connect、read和write, 服务器则调用socket、bind、listen、 accept、read和write。原创 2022-10-04 15:24:01 · 2722 阅读 · 1 评论 -
远程调用-门
客户-服务器情形和过程调用时,存在三种不同类型的过程调用,如下所示:本地调用是同步的,门调用也是同步的。在进程内部,门是用描述符标识的,在进程以外门可能是用文件系统中的路径名标识的。此函由客户调用,调用在服务器进程的地址空间中执行一个服务器过程。无论是参数还是结果都存在两种数据类型:数据和描述符。数据参数:是由指向的一系列总共个字节。描述符参数:是一个结构的数组,每个元素含有一个从客户往服务器过程传递的描述符。所传递的结构数为,没有描述符参数,指定成一个空指针,把指定为0。返回时指向数据结果表示结果大小,原创 2022-10-02 22:25:26 · 902 阅读 · 0 评论 -
管道和FIFO
管道是一种把两个进程之间的标准输入和标准输出连接起来的机制。管道是一种历史悠久的进程间通信的方法。当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。原创 2022-09-30 22:48:48 · 1075 阅读 · 0 评论 -
Posix与System V共享内存区
要使用 POSIX 共享内存对象需要完成下列任务:使用shm_open()函数打开一个与指定的名字对应的对象。shm_open()函数与 open()系统调用类似,它会创建一个新共享对象或打开一个既有对象。作为函数结果,shm_open()会返回一个引用该对象的文件描述符。将上一步中获得的文件描述符传入mmap()调用并在其flags参数中指定MAP_SHARED。这将共享内存对象映射进进程的虚拟地址空间。与mmap()一样,一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射。原创 2022-09-29 21:52:18 · 1160 阅读 · 0 评论 -
共享内存区
共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核。往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,各种形式的同步:互斥锁、条件变量、读写锁、记录锁、信号量。服务器使用一个信号量取得访问某个共享内存区对象的权利。服务器将数据从输入文件读入到该共享内存区对象。read函数的第二个参数所指定的数据缓冲区地址指向这个共享内存区对象。服务器读入完毕时,使用一个信号量通知客户。原创 2022-09-29 21:51:46 · 910 阅读 · 0 评论 -
Posix与System V IPC
三种类型的IPC合称为"Posix IPC":Posix消息队列;Posix信号量;Posix共享内存区;三种类型的IPC和称为"":System V消息队列。System V信号量。System V共享内存区。原创 2022-09-29 00:10:26 · 827 阅读 · 0 评论 -
System V信号量
使用Svstem V信号量的常规操作步骤:使用semget()创建或者打开一个信号量集。使用semctl() SETVAL 或 SETALL操作初始化集合中的信号量(只有一个进程需要完成这个任务)。使用semop()操作信号量的值。使用信号量的进程通常会使用这些操作来标识一种共享资源的获取和释放。当所有进程都不再需要使用信号量集之后操作删除这个集合(只有一个进程需要完成这个任务)。System V信号量是以分配被称为信号量集的组为单位进行的。在使用semget()原创 2022-09-28 16:35:46 · 937 阅读 · 0 评论 -
Posix信号量
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。Posix有名信号量:使用Posix IPC名字标识,可用于进程或线程间的同步。Posix基于内存的信号量:存放在共享内存区中,可用于进程或线程间的同步。System V信号量:在内核中维护,可用于进程或线程间的同步。只考虑不同进程间的同步。首先考虑二值信号量: 其值或为0或为1的信号量。如下图所示:图中画出该信号量是由内核来维护的(对于SystemV信号量是正确的),其值可以是0或1。Posix信号量不必在内核中维护。原创 2022-09-28 16:35:15 · 1935 阅读 · 1 评论 -
POSIX与System v消息队列
消息队列是内核地址空间中的内部链表,通过 Linux 内核在各个进程之间传递内容。消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用lPC标识符唯一 地进行标识。内核中的消息队列是通过IPC 的标识符来区别的,不同的消息队列之间是相对独立的。每个消息队列中的消息,又构成一 个独立的链表。1.信息缓冲区结构常用的结构msgbuf结构。可以使用下面的结构为模板定义自己的信息结构。在头文件};mtype: 消息类型,以正数来表示。原创 2022-09-27 12:14:12 · 1615 阅读 · 0 评论 -
进程创建和程序执行
参数flags服务于双重目,低字节中存放着子进程的终止信号,子进程退出时其父进程将收到这一信号,flags也可能为0不会产生任何信号,参数flags的剩余字节则存放位掩码,控制clone()操作。经过适当转换,子函数可对该参数的含义自由解读,当函数func返回或是调用exit()之后,克隆产出的子进程就会终止,父进程可以通过wait()函数来等待克隆子进程。升至高水位,则恢复记账。克隆子进程共享父进程,所以不能使用父进程的栈,调用时需分配内存空间供子进程栈使用,将内存指针置于参数child_stack中。原创 2022-09-26 10:30:23 · 341 阅读 · 0 评论 -
定时器与休眠
下列函数创建一个间隔定时器,这种定时器在某个时间点到期,并与此后每隔一段时间到期一次,创建的定时器可跨越exec()调用得以保存,但由fork()创建的子进程并不继承该定时器。若自处理或接收定时器信号之后,定时器仅到期一次,则溢出计数为0。所指定的时间间隔后到期的一次性定时器,否则,在每次定时器到期之后,都会将定时器重置为在指定间隔后再次到期。创建3种不同类型的定时器which的类型:对下列情况所有这些信号的默认处置均会终止进程。返回定时器的时间时间,除非再次调用setitimer(),否则该值一直不变。原创 2022-09-25 22:44:04 · 815 阅读 · 0 评论 -
监控文件事件
某些用于程序需要对文件或目录进行监控,已侦测是否发送特定事件。使用inotify API关键步骤:应用程序使用来创建 一inotify实例,该系统调用所返回的文件描述符用于在后续操作中指代该实例应用程序使用向inoify实例(由步骤 1创建) 的监控列表添加条目,告知内核哪些文件是自己的兴趣所在。每个监控项都包含一个路径名以及相关的位掩码。位掩码针对路径名指明了所要监控的事件集合。作为函数结果,将返回一监控描述符,用于在后续操作中指代该监控项。原创 2022-09-25 19:05:13 · 529 阅读 · 0 评论 -
内存分配.
进程可以通过增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减。基于内存自动释放机制,对于那些分配了内存并在进程终止前持续使用的程序而言,通常会省略对free的调用。内存块合适直接返回给调用者,更大内存则将其分割,在将一块合适内存返回给调用者,把小的留在空闲列表中。当将内存置于空闲内存列表时,free使用内存块本身的空间来存放链表指针,将自身添加到列表中。首先扫描之前由free所释放的空闲内存块列表,寻求合适的空闲内存块。原创 2022-09-24 23:33:01 · 323 阅读 · 0 评论 -
伪终端..
伪终端这个术语是指,对于一个应用程序而言,它看上去像一个终端,但 事实上它并不是一个真正的终端。伪终端提供了网络连接到面向终端程序之间缺失的一环。主伪终端和从伪终端,被称伪终端对。伪终端提供IPC通道,通道的一端是一个期望连接到终端设备的程序,另一端也是个程序,通过IPC通道来发送其输入并丢弃输出以此来驱动面向终端的程序。伪终端关键点在于从设备表现得像一个标准终端一样。对于终端的操作也同样适用于伪终端。原创 2022-09-24 21:07:39 · 2124 阅读 · 0 评论 -
终端I/O.
tcflush函数冲洗(抛弃)输入缓冲区(其中的数据是终端驱动程序已接收 到,但用户程序尚未读取的)或输出缓冲区(其中的数据是用户程序已经写 入,但尚未被传递的)。大多数UNIX系统都提供了一种跟踪当前终端窗口大小的方法,在窗口大小 发生变化时,使内核通知前台进程组。若ptr是空指针,则该函数为数组(通常作为静态变量)分配空间,进程的控制终端名存储在该数组中。窗口改变时,程序捕捉SIGWINCH信号,然后打印新的大小。在调用两个cfset函数中的任意一个 之后,要做的就是在termios结构中设置波特率。原创 2022-09-24 15:48:06 · 390 阅读 · 0 评论 -
线程控制(二)
如果信号在 sigwait 被调用 的时候没有被阻塞,那么在线程完成对sigwait的调用之前会出现一个时间窗, 在这个时间窗中,信号就可以被发送给线程。在返回之前,sigwait 将从进程中移除那些处于挂起等待状态 的信号,具体实现支持排队信号,并且信号的多个实例被挂起,那么 sigwait将会移除该信号的一个实例,其他的实例还要继续排队。,但信号的处理是进程中所有线程共享的,意味着单个线程可以阻止某些信号,但当某个线程修改了与某个给定信号相关的处理行为后,所有线程都必须共享这个处理行为的改变。原创 2022-09-22 23:30:19 · 172 阅读 · 0 评论 -
线程(一)
但有多个控制线程时,相互独立的任务的处理就可以交叉进行,此时只需要为每个任务 分配一个单独的线程。在这些情况下,如果线程拥有自旋锁,它就会进入休眠状态,阻塞在锁上的其 他线程自旋的时间可能会比预期的时间更长。主线程不允许每个线程任意处理从队列顶端取出的作业,而是由主线程控制作业的分配,主线程会在每个待处理作业的结构中放置处理该作业的线程ID,每个工作线程只能移除标有自己线程ID的作业。线程允许应用程序并发执行多个任务的一种机制,一个进程可以包含多个线程,执行不同的事,各自处理独自的任务。原创 2022-09-21 22:24:33 · 401 阅读 · 0 评论 -
信号(软中断)
信号是事情发生时对进程的通知机制,也称软中断,信号提供了一种处理异步事件的方法。不存在编号为0的信号。信号与硬件中断的相似之处在于打断了程序执行的正常流程,有的情况下,无法预测信号到达的精确时间。信号因某些事情而产生,信号产生后,会于稍后被传递给某一进程,而进程也会采取某些措施(忽略、杀死、停止进程、执行信号处理器程序等)来响应信号,在产生和到达期间,信号处于的呢过到状态。原创 2022-09-21 16:03:55 · 1303 阅读 · 0 评论 -
进程关系~
在fork之后调用此函数,使父进程设置其子进程的进程组ID,并且也使子进程设置其自己的进程组ID。这两个调用中有个是 冗余的,但让父进程和子进程都这样做可以保证,在父进程和子进程认为子进 程已进入了该进程组之前,这确实已经发生了。每个进程除了有一进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合。进程组中每 一个进程的父进程(例如,进程6100的父进程是进程1)都属于另一个会话,所以此进程组是孤儿进程组。父进程已终止的进程称为孤儿进程,这种进程由init进程“收养”。整个进程组也可成为“孤儿”。原创 2022-09-19 10:10:12 · 247 阅读 · 0 评论 -
进程控制~
当两个进程的nice值相同时,父进程占用50.2%的CPU,子进程占用49.8% 的CPU。一个进程正以特殊的权限(设置用户ID或设置组ID)运行,它又想生成另一个进程执行另一个程序,则它应当直接使用fork和exec,而且在fork之 后、exec之前要更改回普通权限。调用fork()后,无法确定父、子进程谁将率先访问CPU,多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,会发生进程条件。父进程使用了默认的nice值,子进程以可选命令参数指定的调整 后的nice值运行。原创 2022-09-18 19:14:35 · 673 阅读 · 0 评论 -
进程环境~
如若一个进程调用malloc函数,但却忘 记调用free函数,那么该进程占用的存储空间就会连续增加,这被称为。未声明函数的默认返回值为int,所以使用没有正确函数声明的强制类型转换可能会隐藏系统错误,因为int类型的长度与函数返回类型值的长度不同(本例中是指针)。共享库使得可执行文件中不再需要包含公用的库函数,而只需在所有进程都可引用的存 储区中保存这种库例程的一个副本。的值,而所有标准则称它们的值是不确定的。共享库的另一个优点是可以用库 函数的新版本代替老版本而无需对使用该库的程序重新连接编辑。原创 2022-09-17 19:29:50 · 654 阅读 · 0 评论 -
系统数据数据和信息
由于加密口令,找不到一种算法可以将其转换到明文口令,但可以对口令猜测,将猜测的口令经单向算法换成加密形式,然后与用户的加密口令比较。文件访问权限检查相应被修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附属组ID与文件的组ID进行比较。由于这样做难以获得原始资料,系统将加密口令存放在另一个通常称为阴影口令的文件中,文件中至少包含用户名和加密口令。因为此算法是单向 的,所以不能从加密口令猜测到原来的口令。用户属于组,用户登录时,系统按口令文件记录项中的数值组ID,赋给时间组ID,原创 2022-09-17 10:27:20 · 1845 阅读 · 0 评论 -
标准I/O库
所有I/O函数都是围绕文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。而对于标准I/O 库,它们的操作是围绕进行的。当用标准I/O库打开或创建一个文件时,我们已使一个 流与一个文件相关联。二、标准输入、标准输出和标准错误进程预定义了 3 个流:标准输入、标准输出和标准错误。流引用的文件与和前面提到文件描述符 所引用的相同。通过预定义文件指针加以引用,头文件为。标准I/O库提供缓冲的目的是尽可能减少使用调用的次数,对每个I/O流自动地进行缓冲原创 2022-09-16 17:04:10 · 528 阅读 · 0 评论 -
文件和目录
编写创建文件程序时,如果确保指定的访问权限位已经被激活,必须在进程运行时修改umask值,若任何用户都能读文件,则应将umask设置为0,否则,进程运行时,有效的umask值可能关闭该权限位。目录文件:文件包含了其他文件的名字以及指向与这些文件有关信息的指针。移除了符号链接所指向的文件名,符号链接本身还将继续存在,,尽管无法对其进行解引用操,也将此类链接称为悬空链接。中的所有信息都是与文件的实际内容分开存放的,所以,除了要 记录文件数据修改时间以外,还需要记录状态更改时间,也就是更改i节点中信 息的时间。原创 2022-09-15 21:32:14 · 1084 阅读 · 0 评论 -
文件I/O
文件空洞并不要求在磁盘上占用存储区,具体处理方式与文件系统的实现有关,当定位到超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。该进程有两个不同的打开文件:一个文件从标准输入打开(文件描述符0),另一个从标准输出打开(文件描述符为1)。所有执行I/O操作的系统调用都以文件描述符,一个非负整数指代打开的文件,文件描述符用以表示所有类型的已打开文件。打开该文件的每个进程都获得各自的一个文件表项,但对 一个给定的文件只有一个。原创 2022-09-14 23:04:48 · 495 阅读 · 0 评论