- 博客(29)
- 资源 (12)
- 收藏
- 关注
原创 Linux/UNIX线程(2)
线程(2)线程同步当多个控制线程共享相同内存时,需要确保每个线程看到一致的数据视图。如果每个线程使用的变量都是其他线程不会读取或修改的,那么就不在一致性问题。当两个或多个线程试图在同一时间修改同一变量时,也需要进行同步。考虑变量递增操作的情况:增量操作通常分三步:1. 从内存单元读入寄存器2. 在寄存器中进行变量值的增加3. 把新的值写回内存单
2014-04-26 19:34:13 771
原创 Linux/UNIX线程(1)
线程(1)本文将介绍如何使用多个控制线程在单个进程环境中执行多个任务。一个进程中的所有线程都可以访问该进程的组成部件(如文件描述符和内存)。线程包含了表示进程内执行环境必须的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以
2014-04-26 14:25:24 926
原创 Linux/UNIX之信号(2)
信号(2)sigaction函数sigaction函数的功能是检查或修改与制定信号相关联的处理动作。此函数取代了signal函数。#include int sigaction(int signum, const structsigaction *act, struct sigaction *oldact);此函数使用下列结构:struct sigaction {
2014-04-25 16:14:28 883
原创 Linux/UNIX之信号(1)
信号(1)信号是软件中断。每个信号都有一个名字,这些名字都以SIG开头(如SIGABRT 夭折信号)。在头文件中,这些信号都被定义成正整数。不存在编号为0的信号,kill函数对信号编号为0有特殊的应用。当某个信号出现时,可以要求内核按照下列三种方式之一进行处理:1. 忽略此信号2. 捕捉信号3. 执行系统默认动作signal函数UNIX
2014-04-25 11:41:25 1139
原创 Linux/UNIX进程关系
进程关系进程组每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常他们与同一作业相关联,可接受来自同一终端的各种信号。#includepid_tgetpgrp(void); /* POSIX.1version */pid_t getpgid(pid_tpid);intsetpgid(pid_t pid, pid
2014-04-24 11:37:01 1291
原创 Linux/UNIX之进程控制(2)
进程控制(2)竞争条件当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序,则我们认为这发生了竞争条件。如果一个父进程希望等待一个子进程终止,则它必须调用一种wait函数。如果一个进程要等待其父进程终止,可使用下列形式循环while(getppid()!= 1) sleep(1);这种形式的循环(成为轮询)的问题是它浪费了CPU时间。
2014-04-23 16:14:01 1000
原创 Linux/UNIX进程控制(1)
进程控制进程标识符每个进程都有肺腑的整形表示唯一的进程ID。按一个进程终止后,其进程ID就可以再次使用了。如下是几个典型进程的ID及其类型和功能。ID 进程名 中文名 类型 作用0 swapper 交换进程 系统进程 它是内核一部分,不执行
2014-04-23 14:34:30 1597
原创 Linux/UNIX之进程环境
进程环境进程终止有8种方式使进程终止,其中5中为正常终止,它们是1) 从main返回2) 调用exit3) 调用_exit或_Exit4) 最后一个线程从其启动例程返回5) 最后一个线程调用pthread_exit异常终止有3中方式6) 调用abort7) 接到一个信号并终止8)
2014-04-22 16:40:55 957
原创 Linux/UNIX系统数据文件和信息
系统数据文件和信息口令文件存储在/etc/passwd中,可用以下函数获取口令文件项。#include #include struct passwd *getpwnam(const char *name);struct passwd *getpwuid(uid_t uid);如果要查看的只是登录名或用户ID,上述两个函数能满足要求,但有些程序要查看整个口令文件。下面三个
2014-04-22 14:36:56 862
原创 Linux/UNIX之标准IO库
标准IO库当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构,它包含了标准I/O库为管理该流所需的所有信息,包括:用于实际I/O的文件描述符、指向用于该缓冲区的指针、缓冲区的长度、当前在缓冲区的字符数以及出错标志等。为引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。对于标准输入、标准输出和标准出错,他们的文件描述符对应STFIN_FI
2014-04-22 11:55:21 1161
原创 Linux/UNIX之文件和目录(2)
文件和目录(2)link、ulink、remove和rename函数#include int link(const char *oldpath, const char*newpath);int unlink(const char *pathname); #include int remove(const char *pathname);int rename(cons
2014-04-19 18:12:55 917
原创 Linux/UNIX之文件和目录(1)
文件和目录(1)stat、fstat和lstat函数#include #include #include int stat(const char *path, struct stat*buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat*buf);一旦给出pa
2014-04-19 18:09:28 838
原创 文件I/O(2)
文件I/O(2)文件共享内核使用三种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。如图1所示。1) 每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:a) 文件描述符标志b) 指向一个文件表项的指针2) 内核为所有打开文
2014-04-18 15:55:42 952
原创 文件I/O(1)
文件I/O(1)文件描述符对内核而言,所以打开的文件都通过文件描述符引用。每个进程都有一些与之关联的文件描述符。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read和write。一般有三个以及打开的文件描述符,他们是:0:标准输入
2014-04-18 11:28:26 771
原创 shell程序设计(3)
shell程序设计(3)shell语法函数要定义一个shell函数,我们只需要简单地写出它的名字,然后是一对空括号,再把有关的语句放在一对花括号中,如下所示:function_name(){ statements} 实验:简单的函数#!/bin/bashfoo(){ echo“Function foo is executi
2014-04-17 20:22:34 929
原创 shell程序设计(2)
shell程序设计(2)Shell的语法变量在shell里,使用变量之前通常并不需要实现为他们做出声明。默认情况下,所以变量都被看做字符串来存储,即使它们被赋值为数值也是如此。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。Linux大小写敏感。在shell中,我们可以通过在变量名前加一个$符号来访问它的内容。无论何时想获取变量的内容,我们都需要在
2014-04-17 19:00:02 1319
原创 shell程序设计(1)
shell程序设计(1)管道和重定向重定向重定向输出chen123@ubuntu:~/C++$ ls -l >lsoutput.txt这条命令把ls命令的输出保存到文件lsoutput.txt中。文件描述符0代表一个程序的标准输入,文件描述符1代表标准输出,文件描述符2代表标准错误输出。在上面的例子中,通过>操作符把标准输出重定向到一个文件。默认情况下,如果该文件已经存在,
2014-04-17 15:34:14 1150
原创 UNIX/linux入门
UNIX/linux入门UNIX哲学:简单性、集中性、可重用组件、过滤器、开放的文件格式和灵活性。Linux程序设计linux程序linux一个用程序表现为两种特殊的文件:可执行文件和脚本文件。可执行文件是计算机可以直接运行的程序。脚本文件是一组指令的集合,这些指令将由另一个程序(即解释器)来执行。搜索路径由系统管理员配置,通常包含一些存储系统程序的标准路径,其中包括:
2014-04-17 11:46:30 985
原创 APUE源代码使用方法
apue源代码使用方法1. 下载源代码,并解压去http://www.apuebook.com/下载源代码wget http://www.apuebook.com/src.tar.gz -P /usr/local/src 解压源代码到指定的路径:/root/bin,由参数-C指定,解压会在指定目录生成apue.2e的目录tar zxvf /usr/local/src/src.tar.g
2014-04-16 17:43:26 905
原创 STL算法之sort
STL算法之sortSTL算的中的sort接受两个RandomAcceddIterators(随机存取迭代器)。STL的所有关系型容器都拥有自动排序功能(底层采用RB-tree),所有不需要用到sort算法。至于序列式容器stack,queue和priority-queue都有特别的出入口,不允许用户对元素排序。剩下的vector、deque和list,前两者的迭代器满足要求适合用sort算法
2014-04-16 11:32:54 764
原创 STL算法之copy
STL算法之copycopy使用必须包含头文件由于copy进行的是复制操作,而复制操作不外乎assignment operator和copy constructor(copy算法用的是前者),但是某些元素型别用于的是trivial assginment operator,因此,如果能够使用内存直接复制行为(例如C标准函数memmove或memcpy),变能够节省大量时间。为此,SGI
2014-04-15 10:02:07 1313
原创 STL之数值算法
STL之数值算法必须包含头文件#include #include #include #include #include //ostream_iteratorusing namespace std;int main(){ int ia[5] = {1,2,3,4,5}; vector iv(ia, ia+5); cout << accumulate(iv.begin
2014-04-15 09:10:13 838
原创 STL之set和map
STL之set和map setset的特性是,所有元素都会根据元素的键值自动排序,set的键值就是实值,实值就是键值。set不允许两个元素相同。不能通过set的迭代器改变set的元素值,因为set元素值就是其键值,关系到set元素的排列规则。set::iterator被定义为底层RB-TREE的const_iterator。set和list拥有某些相同的性质:当客户端对它进行元素新增操
2014-04-15 08:36:51 905
原创 STL之priority_queue源码剖析
STL之priority_queue源码剖析heap在探讨priority_queue之前,我们必须先分析heap。heap并不归属于STL容器,他是个幕后英雄,扮演priorityqueue的助手。顾名思义,priority queue允许用户以任何次序将任何元素推入容器,但取出时一定是从优先权最高的元素开始取。Binary max heap证据有这样的特性,适合作为priority_q
2014-04-02 21:07:37 2407 1
原创 STL之deque源码剖析
STL之deque源码剖析deque概述deque是一种那个双向开口的连续线性空间,其头尾端做元素的插入和删除效率比vector效率高很多。Deque和vector的最大差异,一在于deque允许常数时间内对头尾端进行元素插入或移除操作,二在于deque没有所谓容量概念,因为它是动态地分段连续空间组合而成,随时可以增加一段新的空间并链接起来。deque提供的迭代器也是RandomAcc
2014-04-02 19:38:39 1193
原创 前缀、中缀、后缀表达式转换详解
前缀、中缀、后缀表达式转换详解昨天参加了ebay实习生笔试题,其中一道题目给定了前缀表达式,让我们求转换成中缀表达式时辅助栈的做多情况下容乃几个元素以及中缀表达式的值。当时没有做出来,会后后网上查了些资料,发现很少有文章将前缀、中缀和后缀表达式之间的转化覆盖了,所以写下这篇文章希望能够将前缀、中缀和后缀表达式之间的转化讲解清楚。一般而言,我们最常遇到的是将中缀表达式转化为后缀表达式,既然这
2014-04-02 15:06:43 29264 10
原创 STL之list源码剖析
STL之list源码剖析相较于vector,使用list的好处是每次插入或删除一个元素,就配置或释放一个元素的空间。list的节点:templatestruct __list_node{ typedefvoid* void_pointer; void_pointerprev; //型别为void*。其实可设为__list_node*
2014-04-01 17:01:28 871
原创 STL之Vector源码剖析
STL之Vector源码剖析vevtor与array非常相似,两者唯一差别在于空间运用的灵活性。array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector的实现技术关键在于其对大小的控制以及重新配置时数据移动效率。一旦vector旧有空间满载,如果客户端每新增一个元素,vector内部知识扩充一个元素的空间,实为
2014-04-01 11:10:47 915
深入理解Nginx(Nginx模块开发与架构解析).pdf
2014-07-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人