Linux编程
Nestler
这个作者很懒,什么都没留下…
展开
-
【Linux编程】socket编程
套接字是通信端点的抽象。文件描述符用open函数创建,而套接字描述符用socket函数创建。socket函数原型如下:int socket(int domain, int type, int protocol);// 返回值:成功返回套接字描述符,失败返回-1domain域确定通信特性,不同的域表示地址的格式不同,表示域的常数以AF开头,表示地址族(address family)原创 2014-07-06 11:11:50 · 1212 阅读 · 0 评论 -
【Linux编程】XSI IPC
三种IPC被称作XSI IPC,分别是:消息队列信号量共享存储器下面分别介绍三种IPC的用法。1、消息队列消息队列是消息的链接表,具有如下函数接口:msgget:创建一个新队列或打开一个现存的队列。msgsnd:将消息添加到队列尾端。msgrcv:从队列中取消息。我们可以自行定义一个表示消息的结构体,它由类型字段和实际数据组成:struct原创 2014-06-22 20:08:35 · 1242 阅读 · 0 评论 -
【Linux编程】进程标识符与fork函数
ID为0的进程通常是调度进程,常被称为交换进程(swapper),是内核中的系统进程。ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用。一个现有进程可以调用fork函数创建一个新进程(子进程)。fork函数被调用一次,返回两次。子进程返回值为0,父进程返回值为子进程的进程ID。当fork出一个子进程后,子进程便拥有独立的数据段、堆、栈的副本,但原创 2014-05-11 10:43:02 · 1382 阅读 · 0 评论 -
【Linux编程】文件系统的分区、硬链接、软链接
首先从磁盘结构讲起。按结构从小到大区分:扇区,固定512字节磁道柱面,分区时的最小单位,开始柱面到结束柱面为一个分区第一个扇区很重要,它包括:主引导分区MBR(446字节),内含引导加载程序Boot loader。它有如下功能:提供菜单:可选择不同的系统进行加载,多操作系统的基础加载内核文件:直接加载可使用的操作系统内核程序转交其它Boot loader:跳原创 2014-06-06 19:18:18 · 1248 阅读 · 0 评论 -
【Linux编程】wait和waitpid函数
wait和waitpid函数可以用来获得子进程退出的信息,防止子进程成为僵死进程。它们具有如下性质:如果其所有子进程都还在运行,则阻塞。进程终止后成为僵死进程,函数取得终止状态后立即返回。如果调用者没有子进程,则立即出错返回。两个函数都会返回终止子进程的进程ID。因为一个进程(正常或异常)终止时,内核会向其父进程发送一个SIGCHLD信号,所以令信号处理程序调用wait函数,则wa原创 2014-05-11 13:40:52 · 1271 阅读 · 0 评论 -
【Linux编程】竞争条件
当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程进行的顺序时,则我们认为这发生了竞争条件。一个例子是在fork出子进程之后,父、子进程的执行顺序是不确定的,这种不确定决定了后面程序的结果,那么这便产生了一个竞争条件。如果一个进程希望等待一个子进程终止,则它必须调用wait或waitpid函数。如果一个进程要等待其父进程终止,则可使用如下的轮询方式:while (原创 2014-06-10 11:20:10 · 1750 阅读 · 0 评论 -
【Linux编程】signal函数
信号是一种异步的软件中断。信号出现时,可以要求内核以下列三种方式进行处理:忽略此信号。两个信号不能被忽略:SIGKILL和SIGSTOP。这两个信号能够使超级用户终止进程。捕捉信号。例如捕捉到SIGCHLD信号后调用waitpid获得子进程终止状态。执行系统默认动作。大多数信号的系统默认动作是终止进程。选择使用哪一种处理方式时,可使用signal函数进行设置:void (*si原创 2014-05-12 14:33:43 · 1224 阅读 · 0 评论 -
【Linux编程】线程终止
当进程中的某一个线程调用了exit、_Exit、_exit,那么整个进程会终止。同样,一个信号发送到某个线程,而该信号的默认动作是终止,整个进程也会终止。单个进程的终止有三种方法:从程序正常返回。线程自身调用pthread_exit。被同一进程中的其它线程取消。先来看看前两种情况。void pthread_exit(void *rval_ptr); // 退原创 2014-05-13 11:25:15 · 1468 阅读 · 0 评论 -
【Linux编程】C程序的存储空间布局
一个C程序由下面几个部分组成:正文段。存放CPU执行的机器指令。唯一、只读。初始化数据段(即数据段)。已赋值的全局变量。bss段。未初始化的全局变量。程序执行之前,内核将此段中的数据初始化为0或null。栈。连续内存,大小固定(可用ulimit -s命令查看)。堆。链表结构,空间较大。这几个段在存储器中的布局为:低地址→正文段(exec从文件读入)→数据段(exec从文件读入)→b原创 2014-05-11 10:44:15 · 847 阅读 · 0 评论 -
【Linux编程】进程终止和exit函数
内核要执行一个应用程序,唯一的途径是通过系统调用,exec函数,exec又会调用启动程序,启动程序(通常是汇编语言)以类似下面的方式调用main函数:void exit(main(argc, argv));那么在main函数末尾使用exit(0)和使用return 0是等价的。这里有三个正常终止程序的函数:void exit(int status); // 先执行一些清理操作,原创 2014-05-11 10:45:40 · 2430 阅读 · 0 评论 -
【Linux编程】中断的系统调用
如果进程在执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行。该系统调用返回出错,其errno被设置为EINTR。调用这些系统调用的程序要对这些错误的返回进行处理,典型的处理代码如下:原创 2014-05-12 14:32:31 · 825 阅读 · 0 评论 -
【Linux编程】IPC之管道
管道,一种古老的进程间通信形式。一个管道由一个进程创建,然后该进程调用fork,此后父、子进程就可以用管道通信了。函数原型:#include int pipe(int filedes[2]); // 成功返回0,出错返回-1参数filedes返回两个文件描述符。filedes[0]用来输入,filedes[1]用来输出。注意,经过实验,这里的两个描述符并不对应标原创 2014-05-15 16:24:18 · 890 阅读 · 0 评论 -
【Linux编程】非阻塞I/O
系统调用分为低速系统调用和其它系统调用两类。低速系统调用可能会使进程永远阻塞。但与磁盘I/O相关的系统调用不是低速系统调用,因为磁盘I/O操作会在一个可期望的未来成功。非阻塞I/O可以使普通的open、read、write这种系统调用不能完成时出错返回。成为非阻塞I/O的两种方法:open时设置O_NONBLOCK标识。fcntl设置已打开的描述符,追加O_NONBLOCK原创 2014-05-16 15:26:16 · 942 阅读 · 0 评论 -
【Linux编程】线程同步
如果每个线程使用的变量都是其它线程不会读取或修改的,那么就不存在一致性问题。同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题。否则,将会出现不一致性问题。为了解决数据不一致问题,必须引入某些机制使线程间同步。 当变量修改时间多于一个存储器访问周期,同时读、写操作又相互交替时,潜在的不一致性就会出现。如下图所示:此时,线程B读取到的数据是错误的。使用一原创 2014-06-13 12:59:53 · 1157 阅读 · 0 评论 -
【Linux编程】存储映射I/O
存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区的读、写操作就是对文件的读、写操作,从而可以不再使用read、write系统调用。将文件映射到存储区的函数由mmap完成,函数原型如下:#include /* 成功返回映射区起始地址,出错返回MAP_FAILED */void *mmap(void *addr, size_t len, int prot,原创 2014-06-21 11:17:16 · 1385 阅读 · 0 评论 -
TinyFrame性能测试
压力测试。用TinyFrame编写Web服务器,Apache Bench(AB)程序作为客户端。客户端发出请求,服务器响应字符串“test”,以此来测量服务器并发量。测试环境:服务器配置:Pentium(R) Dual-Core CPU E6700 @ 3.2GHz 3.2GHz,2G RAM。客户端配置:Intel(R) Core2 Duo CPU T6670 @原创 2015-03-09 10:21:07 · 1141 阅读 · 0 评论