信号处理 一、信号的捕捉和处理 1、signal函数 signal函数用来设置进程在接收到信号时的动作 #include <signal.h> typedef void (*sighandler_t) (int); sighandler_t signal(int signum, sighandler_t handler); signal根据参数signum指定的信号编号来设置该信号的处理函数,当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须时常数SIG_IGN(忽略该信号)或SIG_DFL(对该信号执行默认操作)。handler是一个函数指针,它所指向的函数的类型时sighandler_t,即它所指向的函数有一个int型参数,且返回值的类型为void。 signal函数执行成功时返回以前的信号处理函数指针,当有错误发生时返回SIG_ERR(即 -1)。 2、sigaction函数 sigaction函数可以用来检查或设置进程在接收到信号时的动作 #includ 继续阅读 >>


闫钰晨 16/10/07 18:09:19
Linux信号介绍 一、信号解释 信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式。在linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某进程发生了什么事件,还可以给进程传递数据。 二、信号的来源 硬件方式 1.当用户在终端上按下某些键时,将产生信号。 2.硬件异常产生信号:除数为0,无效的存储访问等。这些事件通常由硬件(如CPU)检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该时间发生时正在运行的程序。 软件方式 1.用户在终端下调kill命令向进程发送任意信号。 2.进程调用kill或sigqueue函数发送信号。 3.当检测到某种软件条件已经具备时发出信号,如由alarm或settimer设置的定时器超时时将生成SIGALRM信号。 三、信号的种类 1、可靠信号与不可靠信号 SIGHUP(1号)至SIGSYS(31号)之间的信号都是继承自UNIX系统,是不可靠信号。Linux系统根据P 继续阅读 >>


闫钰晨 16/10/07 15:01:21
一、私有数据 1.特殊的变量 多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。举例来说,errno它返回标准的出错代码,errno不应该为局部变量,几乎每个函数都应该可以访问它,但它又不能为全局变量,否则在一个线程里输出的很可能是另一个线程的出错信息。这个问题可以通过创建线程的私有数据(Thread-specific Data ,或TSD)来解决。 2.TSD池(关键数据结构数组) 创建一个TSD就相当于将结构体数组中的某一项设置为”in_use”,并将其索引返回给*key,然后设置destructor函数为destr_function。 3.一键多值 线程私有数据采用了一键多值的技术,。访问数据时都是通过键值来访问。操作线程私有函数的主要函数有4个 #include <pthread.h> int pthread_key_creat(pthread_key_t *key, void (*destr func 继续阅读 >>


闫钰晨 16/08/04 11:35:30
一、线程 1.线程是什么 线程是计算机中独立运行的最小单位,运行时占用很少说的系统资源。 2.线程的优点 多线程相对于多进程的优点 [1].多进程的情况下,每个进程都有自己独立的地址空间,而多线程情况下,同一进程内的线程共享进程的地址空间。因此创建一个新的进程时就要耗费时间来为其分配系统资源,而创建一个新的线程花费的时间则要少的多。 [2].在系统调度方面,由于进程地址独立而线程共享地址空间,线程间的切换速度要远远快过进程间的切换速度。 [3].在通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,通信时必须经过操作系统。而同一进程内的多个线程共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。因此,线程间的通信更加方便和省时。 线程还具有如下优点 [4].可以提高应用程序的响应速度。 [5].可以提高多处理器效率。 [6].可以改善程序的结构。 3.线程私有的数据、 虽然线程在进程内部共享地址空间,打开文件描述符等资源,但是线程也有其私有的数据信 继续阅读 >>


闫钰晨 16/08/03 10:30:22
在暑假留校的这两周, 瑞神的linux系统编程系列讲座总共有四个小专题, 在这里我把瑞神讲座中的一些点总结一下 1.静态库和共享库 静态库: 概念: 静态库(以.a后缀标识)是指将所有相关的目标文件打包成为一个单独的文件, 即静态库文件.  静态库可作为链接器的输入,链接器会将程序中使用到的函数的代码从库文件中拷贝到应用程序中, 一旦链接完成, 在执行程序的时候就不需要静态库了. 共享库: 概念: 共享库(以.so后缀标识)是一个目标模块, 在运行时, 可以加载到任意的存储器地址, 并和一个在存储器中的程序链接起来, 这个或称成为动态链接, 是由一个叫做动态链接器的程序来执行的. 静态库和共享库的一些比较 由于每个使用静态库的应用程序都需要拷贝所用函数的代码, 所以静态链接的文件会比较大, 比较耗内存; 而共享库的源码只有一份, 应用程序需要用到库中的函数时, 通过地址就能找到共享库的位置, 并和应用程序链接起来,节省了内存. 2.计算机软件体系结构 计算机最底层的结构是硬件, 硬件上层是操作系统, 操作系 继续阅读 >>


祝一迪 16/07/30 08:32:14
一、执行新程序 使用fork或vfork创建子进程以后,子进程调用exec函数来执行另外一个函数。 exec函数族 #include<unistd.h> int execve(const char *path, char *const argv[], char *const envp[]); int execv(const char *path, char *const envp[]); int execle(const char *path, const char *arg, ...); int execl(const char *path, const char *arg, ...); int exevp(const char *file, char *const argv[]); int execlp(const char *file, const char *arg, ...); 用来替换进程映像的程序 exec函数实现程序 先编译第一个程序,生成可执行文件:gcc -o processimage proces 继续阅读 >>


闫钰晨 16/07/28 16:10:45
一、创建进程 1.创建进程: (1)操作系统创建:它们之间是平等的,一般不存在资源继承关系。 (2)父进程创建:它和父进程存在隶属关系,通常称为子进程。子进程又可创建进程,这样形成一个进程家族。子进程可以继承父进程几乎所有的资源。 子进程继承父进程的很多属性,主要包括:用户ID,组ID,当前工作目录,根目录,打开的文件,创建文件时使用的屏蔽字,信号屏蔽字,上下文环境,共享的存储段,资源限制等。 ps: 系统进程:在系统启动时,操作系统会创建一些进程,它们承担着管理和分配系统资源的任务。 2.fork函数 (1)创建进程的实现 #include<sys/types.h> #include<unistd.h> pid_t fork(void); 成功调用fork函数后,当前进程实际上已经分裂成两个进程,一个是原来的父进程,一个是刚创建的子进程。 当进程创建成功,fork函数有两个返回值,一个是父进程调用fork函数后的返回值,该返回值是刚创建的子进程的ID,另一个是子进程中fork 继续阅读 >>


闫钰晨 16/07/28 10:42:45
一、linux 进程 1、进程概念 百度 2、进程标识 进程ID:每个进程都通过惟一的进程ID标识, 进程ID是一个非负数。 每个进程除了进程ID外还有一些其他标识信息,都可通过相应的函数获得。 3、Linux进程的结构 Linux中一个进程由3部分组成:代码段、数据段、堆栈段 4、Linux进程状态 (1)R 运行状态 (2)S可中断等待状态 (3)D不可中断等待状态 (4)Z僵死状态 (5)T停止状态 二、进程的内存映像 命令行参数和环境量 ——————– 高地址 栈 堆 未被初始化数据段 数据段 代码段——————————————-低地址 栈:存放局部变量,函数参数 堆:动态分配内存 未初始化数据段:bss段,未初始化的变量 数据段:全局变量,静态变量,静态局部变量 代码段: 包含了进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自 继续阅读 >>


闫钰晨 16/07/27 22:09:00
在计算机学科学习初期,基础是一项不可忽视的重要问题。在这个时期养成良好的学习习惯、对计算机方面的知识建立正确的宏观认识,在今后的学习中可以受益颇久。在这里,挑写几个讲座中提到的经典的问题写出来。 一、内核编码规范 代码缩进:在写代码时最好手打缩进空格,使用tab缩进在不同的电脑上/不同的编辑器中都可能有不同的效果,因而养成手打空格缩进是很有必要的。 两种命名方法: ①匈牙利命名法(多用于微软):标识符含义_标识符名 ②驼峰命名法:每个单词首字母大写 多文件,增强模块化:在写项目代码时进行模块化测试可以有效减小工作量。 二、系统代码调用 用户态函数 : 库函数 : 系统调用 : 内核函数 :kernel 三、获取源码 glibc 命令源码 系统调用及内核源码 四、源码分析工具 ctags: ①在源码目录中执行命令: [linux@zhen catalog]$ctags -R ②vim打开源码,在光标位置使用组合键ctrl+]即可进入 函数/结构体 定义位置;组 继续阅读 >>


寇梦真 16/07/22 10:11:07
一、目录的创建和删除 1.创建 mkdir #include<sys/stat.h> #include<sys/types.h> int mkdir(const char *pathname, mode_t mode); 执行成功返回0,错误返回-1 2.删除 rmdir #include<unistd.h> int rmdir(const char *pathname); 执行成功返回0,错误返回-1 rmdir只能删除指定的空目录 二、获取当前目录 getcwd #include<unistd.h> char *getcwd(char *buf, size_t size); 执行成功将结果复制到参数buf所指的内存空间,或是返回自动配置的字符串指针,失败返回NULL 参数 getcwd会将当前的工作目录绝对路径复制到参数buf所指的内存空间,size为buf的空间大小。 三、设置工作目录 chdir #include<unistd.h& 继续阅读 >>


闫钰晨 16/07/21 14:43:42