Linux环境系统编
Sandeldeng
这个作者很懒,什么都没留下…
展开
-
linux系统编程之文件与I/O(一):文件的打开关闭
一、文件描述符 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体)。 一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(转载 2016-10-22 23:00:44 · 465 阅读 · 0 评论 -
linux系统编程之信号(五):实时信号与sigqueue函数
一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:int sigqueue(pid_t pid, int sig, const union sigval value); 参数: sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union转载 2016-10-23 15:17:00 · 345 阅读 · 0 评论 -
linux系统编程之信号(六):竞态条件与sigsuspend函数
一、利用pause和alarm函数实现sleep函数#include <unistd.h>int pause(void);pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR转载 2016-10-23 15:22:04 · 411 阅读 · 0 评论 -
linux系统编程之管道(一):匿名管道和pipe函数
一、进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如下图所示。 二、管道是一种最基本的IPC机制,由pipe函数创建:#转载 2016-10-23 15:37:32 · 365 阅读 · 0 评论 -
linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
一、当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 示例程序如下:/************************************************************************* > File N转载 2016-10-23 15:51:16 · 479 阅读 · 0 评论 -
linux系统编程之管道(三):命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的。如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道。FIFO和UNIX Dom转载 2016-10-23 16:05:15 · 827 阅读 · 0 评论 -
linux系统编程之基础必备(一):计算机体系结构一点基础知识
下面这张图来自《深入理解计算机系统》: IO桥部分一般还分为北桥和南桥,北桥当然是靠上的了。 •CPU –主频: CPU的时钟频率,内核工作的时钟频率 –外频: 系统总线的工作频率 –倍频: CPU外频与主频相差的倍数 –前端总线: 将CPU连接到北桥芯片的总线 –总线频率: 与外频相同或者是外频的倍数 –总线数据带宽: (总线频率 * 数据位宽)/ 8无论是在CPU转载 2016-10-23 16:25:03 · 604 阅读 · 0 评论 -
linux系统编程之基础必备(二):C 标准IO 库函数与Unbuffered IO函数
先来看看C标准I/O库函数是如何用系统调用实现的。 fopen(3) 调用open(2)打开指定的文件,返回一个文件描述符(就是一个int 类型的编号),分配一 个FILE 结构体, 通常里面包含了: 文件fd 缓冲区指针 缓冲区长度 当前缓冲区读取长度 出错标志 返回这 个FILE 结构体的地址。 fgetc(3) 通过传入的FILE 参数找到该文件的描述符、I/O缓冲区和当前转载 2016-10-23 16:29:34 · 413 阅读 · 0 评论 -
linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识
每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process Control Block)。task_struct中有一个指针(struct files_struct *files; )指向files_struct结构体,称为文件 描述符表,其中每个表项包含一个转载 2016-10-23 16:42:50 · 488 阅读 · 0 评论 -
linux系统编程之基础必备(五):Linux进程地址空间和虚拟内存
一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比较,以确定是否有权限访问。每个特权级都有自己的程序栈,当程序从一个特权级切换到另一个特权级上执转载 2016-10-23 18:18:46 · 601 阅读 · 0 评论 -
linux系统编程之基础必备(六):可重入函数、线程安全、volatile
一、 POSIX 中对可重入和线程安全这两个概念的定义:Reentrant Function:A function whose effect, when called by two or more threads,is guaranteed to be as if the threads each executed the function one after another in an undef转载 2016-10-23 19:02:50 · 382 阅读 · 0 评论 -
linux系统编程之基础必备(四):C 标准库IO缓冲区和内核缓冲区的区别
1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘、显示器、串口、磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开、读、写和关闭,使用的函数接口是相同的。用户程序调用C标准I/O库函数读写普通文件或设备,而这些库函数要通过系统调用把读写请求传给内核 ,最终由内核驱动磁盘转载 2016-10-23 16:52:57 · 1902 阅读 · 0 评论 -
linux系统编程之信号(四):信号的捕捉与sigaction函数
一、内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SIGQUIT信号的处理函数sighandler。 2. 当前正在执行main函数,这时发生中断或异常切换到内核态。 3. 在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递转载 2016-10-23 14:58:34 · 627 阅读 · 0 评论 -
linux系统编程之信号(三):信号的阻塞与未决
一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号,SIGKILL 和 SIGSTOP 不能被阻塞。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。转载 2016-10-23 14:21:41 · 378 阅读 · 0 评论 -
linux系统编程之信号(二):一些信号发送函数和不同精度的睡眠
一、kill, raise, killpg 函数int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int sig); kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的信号,其中kill 函数的pid 参数取值不同表示不同含义,具体可man 一下。raise函数可以转载 2016-10-23 13:50:50 · 525 阅读 · 0 评论 -
linux系统编程之文件与I/O(二):文件的读取写入
一、read系统调用 一旦有了与一个打开文件描述相关连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型:ssize_t read(int fd, void *buf, size_t count);参数: fd :想要读的文件的文件描述符 buf : 指向内存块的指针,从文件中读取来的字节放到这个内存块中 count转载 2016-10-22 23:11:12 · 652 阅读 · 0 评论 -
linux系统编程之文件与I/O(三):目录的操作
一、目录的访问 功能说明:打开一个目录 原型:DIR* opendir(char *pathname); 返回值: 打开成功,返回一个目录指针 打开失败,则返回NULL功能说明:访问指定目录中下一个连接的细节 原型:struct dirent* readdir(DIR *dirptr); 返回值: 返回一个指向dirent结构的指针,它包含指定目录中下一个连接的细节; 没有转载 2016-10-22 23:31:17 · 554 阅读 · 0 评论 -
linux系统编程之文件与I/O(四):文件的属性
一、读取文件元数据int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);stat() stats the file pointed to by path and fills in buf. lst转载 2016-10-22 23:40:47 · 415 阅读 · 0 评论 -
linux系统编程之文件与I/O(五):文件的内核结构file和dup实现重定向
一、打开文件内核数据结构 1、一个进程打开两个文件 文件状态标志:读、写、追加、同步、非阻塞等2、一个进程两次打开同一文件 3、两个进程打开同一文件 /************************************************************************* > File Name: file_share.c > Author:转载 2016-10-22 23:57:01 · 347 阅读 · 0 评论 -
linux系统编程之文件与I/O(六):fcntl 函数与文件锁
一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性int fcntl(int fd, int cmd, ... /* arg */ );cmd的取值可以如下: 复制文件描述符 F_DUPFD (long)设置/获取文件描述符标志 F_GETFD (void) F_SETFD (long)设置/获取文件状态标志 F_GETFL (void) F_SETFL (long)获取转载 2016-10-23 00:10:03 · 303 阅读 · 0 评论 -
linux系统编程之进程(一):进程基本概述
一、什么是进程 从用户的角度来看进程是程序的一次执行过程。 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。 进程是资源分配的最小单位。 每一个进程都有自己独立的地址空间与执行状态。 像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。二、进程数据结构 进程的静态描述:由三部分组成:PCB、有关程序段和该程序段对其进行操转载 2016-10-23 00:20:00 · 359 阅读 · 0 评论 -
linux系统编程之进程(二):fork函数相关总结
fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。系统中同时运行着很多进程,这些进程都是从最初只有一个进程开始一个一个复制出来的。在Shell下输入命令可以运行一个程序,是因为Shell进程在读取用户输入的命令之后会调用fork复制出一个新的Shell进程,然后新的Shell进程调用exec执行新转载 2016-10-23 09:49:29 · 381 阅读 · 0 评论 -
linux系统编程之进程(三):exec系列函数和system函数
一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建 了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。二、exec关联函数组 包含头文件<unistd.h>功能用exec函数可以把当前进程替换为一个新进程转载 2016-10-23 10:13:29 · 2625 阅读 · 0 评论 -
linux系统编程之进程(四):wait/waitpid函数与僵尸进程、fork 2 times
一、僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。A child that terminates, but has not been waited for becomes a “zom转载 2016-10-23 10:40:22 · 511 阅读 · 0 评论 -
linux系统编程之进程(五):终端、作业控制与守护进程
一、终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读转载 2016-10-23 11:35:10 · 1435 阅读 · 0 评论 -
linux系统编程之信号(一):信号基本概述
一、为了理解信号,先从我们最熟悉的场景说起: 1. 用户输入命令,在Shell下启动一个前台进程。 2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。 3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。 4. 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号转载 2016-10-23 12:17:56 · 444 阅读 · 0 评论 -
linux系统编程之基础必备(七):read/write函数与(非)阻塞I/O的概念
一、read/write 函数 read函数从打开的设备或文件中读取数据。#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的转载 2016-10-23 19:47:30 · 469 阅读 · 0 评论