Unix高级编程
文章平均质量分 68
百云在飘
这个作者很懒,什么都没留下…
展开
-
守护进程之单实例
1.介绍 大多数守护进程在任意时刻都只运行该守护进程的一个副本,也就是说为了正常运行,需要要保证单实例。 文件锁和记录锁机制是一种方法的基础,该方法用来保证一个守护进程只有一个实例在系统中运行。如果每一个守护进程创建一个文件,并且在整个文件上加上一把锁,那就只允许创建一把这样的写锁,所以在此之后试图再创建一把这样的写锁就会失败,以此向后续守护进程的副本指明已经存在一个正在运行的副本原创 2009-02-18 23:41:00 · 2079 阅读 · 0 评论 -
进程通信之协同进程
1. 协同进程当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程(coprocess)。Korn shell提供了协同进程。Bourne shell,Bourne-again shell和C shell没有提供协同进程方式将进程连接起来。 函数popen只提供链接到另一个进程的标准输入或标准输出的一个单向管道,而对于协同进程则它有链接到另一个进程原创 2009-03-14 15:14:00 · 1603 阅读 · 0 评论 -
进程通信之XSI IPC
1. XSI IPC1.1 标识符和键有三种IPC称为XSI IPC,即消息队列,信号量以及共享存储器。每个内核中的IPC结构(消息队列,信号量和共享存储器)都用一个非负整数的标识符(identifier)加以引用。例如,为了对一个消息队列发送消息或取消息,只需知道其队列标识符。当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大值,然后又回原创 2009-03-14 15:21:00 · 1614 阅读 · 0 评论 -
进程通信之共享内存
1. 共享内存1.1. 共享内存共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。共享内存允许两个不相关的进程访问同一个逻辑内存。由于它并没有提供同步机制,所以我们通常需要用其他的机制来同步访问共享的内存。共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存的数据原创 2009-03-15 15:47:00 · 1875 阅读 · 0 评论 -
进程通信之管道(续)
1.3. popen和pclose函数标准I/O库提供了两个函数popen和pclose。这两个函数实现的操作是:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止。#include FILE * popen(const char *cmdstring, const char *type);Int pclose(FILE *原创 2009-03-14 15:05:00 · 805 阅读 · 0 评论 -
线程
1. 线程概念典型的UNIX进程可以看成只有一个控制线程:一个线程在同一时刻只做一件事情。每个线程在进行事件处理时可以采用同步编程模式,同步编程模式比异步编程模式简单得多。在只有一个控制线程的情况下,单个进程需要完成多个任务时,实际上需要把这些任务串行化;有了多个控制线程,相互独立的任务的处理可以交叉进行,只需要为每个任务分配一个单独的线程,当然只有在处理不相互依赖的情况下,两个任务的执行才可原创 2009-04-26 23:30:00 · 788 阅读 · 0 评论 -
线程同步
1. 线程同步当一个线程修改变量时,其他线程在读取这个变量的值时就可能看到不一致的数据。在变量修改时间多于一个存储器访问周期的处理器结构中,当存储器读与存储器写这两个操作交叉进行,这种潜在的不一致就会出现。所以,当两个线程或多个线程试图对在同一时间修改或读取同一变量时,就需要同步。例如增量操作,它可以分成三步:1) 从内存单元读入寄存器2) 在寄存器中进行变量值的增加3) 把新的值原创 2009-04-26 23:36:00 · 1099 阅读 · 0 评论 -
线程控制之一
1. 线程限制与其它的系统限制一样,这些线程限制也是通过sysconf函数进行查询的。当某些操作系统实现没有定义相应的sysconf符号(_SC_)时,表示为"未定义符号";如果操作系统实现的限制是不确定的,表示为"没有确定的限制",但这并不意味是无限制的;"不支持"表明操作系统实现定义了相应的sysconf限制符号,但是sysconf函数无法识别这个符号。 2. 线程属性在调用p原创 2009-05-02 22:40:00 · 711 阅读 · 0 评论 -
线程控制之二
3. 同步属性3.1. 互斥量属性int pthread_mutexattr_init (pthread_mutexattr_t * attr);int pthread_mutexattr_destroy (pthread_mutexattr_t *attr);函数pthread_mutexattr_init用默认的互斥量初始化pthread_mutexattr_t结构。值得注意的原创 2009-05-02 22:49:00 · 1153 阅读 · 0 评论 -
Unix记录锁使用总结
1. 原理说明在Unix系统中,记录锁的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区。即其锁定的是文件的一个区域或整个文件。记录锁有两种类型:共享读锁,独占写锁。基本规则是:多个进程在一个给定的字节上可以有一把共享的读锁,但在一个给定字节上的写锁只能有一个进程独用。即:如果在一个给定的字节上已经有一把读或多把读锁,则不能在该字节上再加写锁;如果在一原创 2009-12-13 17:27:00 · 1735 阅读 · 0 评论 -
select, poll和epoll的区别
select()系统调用提供一个机制来实现同步多元I/O: #include sys/time.h> #include sys/types.h> #include unistd.h>原创 2010-03-22 20:16:00 · 600 阅读 · 0 评论 -
sysconf、pathconf和fpathconf
1. 限制 Unix系统实现定义了很多幻数和常量,这些在不同程度上依从POSIX,也遵从POSIX.1标准。这就有助于软件的可移植性。 以下两种类型的限制是必须的: 1) 编译时限制(例如,短整型的最大值是什么?) 2) 运行时限制(例如,文件名可以有多少个字符?) 编译时限制可在头文件中定义,程序在编译时可以包含头文件。但是,运行时限制则要求进程调用一个函数以获取此种限制值。 为了解决此类问题: 1) 编译时限制(例如,短整型的最大值是什么?) 2) 不与文件或目录相关联的运行时限制(sy原创 2010-09-11 02:01:00 · 1902 阅读 · 0 评论 -
Linux环境进程间通信(五): 共享内存(上)(mmap)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。转载 2010-09-11 02:17:00 · 1050 阅读 · 1 评论 -
getrlimit与setrlimit函数
每一个进程都有自己的一组资源限制,而getrlimit和setrlimit这2个API来取得和设置资源。getrlimit用来取得setrlimit用来设置 这二个参数都需要一个要控制的资源 比如控制CPU、内存、文件描述符个数等等的控制。转载 2010-12-03 07:48:00 · 843 阅读 · 0 评论 -
内存调试技巧 C 语言最大难点揭秘
本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划。但好消息是,它们并不怎么神秘。转载 2011-03-16 15:03:00 · 834 阅读 · 0 评论 -
如何在linux下检测内存泄漏
本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨。其中包括 C++ 中的 new 和 delete 的基本原理,内存检测子系统的实现原理和具体方法,以及内存泄漏检测的高级话题。作为内存检测子系统实现的一部分,提供了一个具有更好的使用特性的互斥体(Mutex)类。转载 2011-03-16 14:50:00 · 649 阅读 · 0 评论 -
进程通信之管道
1. 管道1.1管道管道是UNIX系统IPC的最古老的形式。有下面两种局限性:1). 历史上,它们是半双工的(即数据只能在一个方向上流动)。现在,某些系统支持全双工管道,但是为了最佳的可移植性,决不预先假定系统提供此特性2). 它们只能在具有公共祖先的进程间使用。通常,一个管道由一个进程创建,然后进程调用fork,此后父、子进程间就有可应用该管道。FIFO没有第二种局限性,套接原创 2009-03-14 14:53:00 · 925 阅读 · 0 评论 -
进程通信之信号量
1. 信号量1.1. 信号量信号量(semaphore)是一个计数器,用户多进程对共享数据对象的访问,也就是用户管理对资源的访问。为了获得共享资源,进程需要执行下列操作。1). 测试控制该资源的信号量;2). 若此信号量的值为正,则进程可以使用该资源。进程将信号量减一,表示它使用了一个资源单位。3). 若此信号量的值为0,则进程进入休眠状态,直至信号量值大于0。进程被原创 2009-03-15 12:22:00 · 1862 阅读 · 0 评论 -
守护进程之编程规则
1. 概述 守护进程也称精灵进程(daemon)是生成器较长的一种进程。因为他们没有控制终端,所以说它们是在后台运行的。 我们可以ps命令来查看系统中各个进程的状态。 #ps -auxj 选项-a显示有其它用户所拥有的进程的状态。-x显示没有控制终端的进程状态。-u以用户的格式来显示进程的状态。-j显示与有关的信息:会话ID、进程ID、控制终端以及原创 2009-02-17 23:13:00 · 610 阅读 · 0 评论 -
守护进程之重读配置文件
1. 介绍 如果守护进程有一配置文件,那么当该守护进程启动时,它读该文件,但是一旦启动后守护进程一般不会再去查看它。当系统管理员更改了配置文件,我们需要通知守护进程守护进程重读该文件。因为守护进程不与终端相结合,或者是无控制终端的会话首进程,或者是孤儿进程组的成员,所以守护进程并不期望接受SIGHUP信号。所以,我们可以利用SIGHUP信号实现配置文件重读。2. 源程序#i原创 2009-02-21 18:10:00 · 2378 阅读 · 0 评论 -
进程环境
1.main函数C程序总是从main函数开始执行,原型是int main(int argc, char *argv[]);当内核执行C程序时(使用一个exec函数),在调用main函数前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址(这是连接编译器设置的,而连接编译器则由C编译器(CC)调用。启动例程从内核取得命令行参数和环境变量值),然后执行main。启动例原创 2009-02-22 20:37:00 · 780 阅读 · 0 评论 -
进程控制之fork函数
1.fork函数 #inlcude pid_t fork(void); 由fork创建的新进程被称为子进程(child process)。fork函数被调用一次,返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。子进程是父进程的副本。父、子进程并不共享存储空间部分(数据空间,堆和栈)。父、子进程共享正文段。 一般来说,在fork之后原创 2009-02-25 22:55:00 · 1139 阅读 · 0 评论 -
进程控制之exit和waitpid(wait)函数
1. exit函数我们知道,进程有五种正常终止:1). 从main函数执行return语句,如同调用exit一样。2). 调用exit。此函数有ISO C定义,其操作包括调用各中终止处理程序,然后关闭所有标准I/O流等。因为ISO C并不处理文件描述符,多进程以及作业控制,所以这一定义对UNIX系统是不完整的。3). 调用_exit或_Exit。ISO C定义_Exit,其目的原创 2009-02-26 22:52:00 · 2881 阅读 · 1 评论 -
进程控制之进程标识符
每个进程都有一个非负整数表示的唯一进程ID。虽然是唯一的,但是进程ID可以重用(一个进程终止后,其进程ID就可以再次使用)。大多数Unix系统实现延迟重用算法。ID为0的进程通常是调度进程,常常称为交换进程(swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。ID为1通常是init进程,在自举过程结束时由内核调用。此进程负责在自举内核后启动一个UNiX原创 2009-02-25 22:48:00 · 2293 阅读 · 0 评论 -
进程控制之更改用户ID和组ID
1. 更改用户ID和组ID1.1. 设置用户ID和设置组ID与进程相关联的ID有6个或更多,如下:实际用户ID我们实际上是谁实际组ID有效用户ID用于文件访问权限检查有效组ID附加组ID保存的设置用户ID由exec函数保存原创 2009-02-28 20:43:00 · 3050 阅读 · 0 评论 -
进程控制之system函数
1. system函数#include int system(const char *cmd);如果cmd是一个空指针,则仅仅当命令处理程序可用时,system返回非0值。因为system在其实现中调用了fork,exec和waitpid,因此有三种返回值:1). 如果fork失败或者waitpid返回除EINTR之外的出错,则system返回-1,而且errno中设置了错误类原创 2009-02-28 22:09:00 · 1317 阅读 · 0 评论 -
进程控制之exec函数
1. exec函数#include int execl(const char*pathname, const char *arg0, ..., /* (char *) 0*/);int execv(const char*pathname, const char *argv[]);int execle(const char*pathname, const char *arg0, .原创 2009-02-27 23:41:00 · 817 阅读 · 0 评论 -
进程关系之shell执行程序
1. shell执行程序1.1. 登录shell(Bourne shell)首先使用不支持作业控制的Bourne shell。如果我们执行命令:#ps -o pid,ppid,pgid,sid,comm# ps -o pid,ppid,pgid,sid,comm &(后台执行)两种结果都差不多,只是进程ID不一样:PID原创 2009-03-07 11:03:00 · 1803 阅读 · 1 评论 -
进程关系之终端登录
1. 终端登录终端登录要么是本地的要么是远程的。在这两种情况下,登录都要经由内核中的终端设备驱动程序。终端登录至UNIX系统。该过程是类似的,而与所使用的终端无关,终端可以是基于字符的终端、仿真简单的基于字符终端的图形终端,或者是运行窗口系统的图形界面。 1.1. BSD终端登录系统管理员创建名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明了设备名和传递给gett原创 2009-03-07 10:35:00 · 1211 阅读 · 0 评论 -
进程关系之进程组、会话和控制终端
1. 进程组每个进程除了有一个进程ID之外,还有一个进程组。进程组是一个或多个进程的集合。它们与同一作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID。函数getpgrp可以得到进程的进程组ID。pid_t getpgrp(void);每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于进程ID。组长进程可以创建一个进程组,创建该组中的进程,原创 2009-03-07 10:38:00 · 5742 阅读 · 0 评论 -
进程关系之作业控制(孤儿进程组)
1. 作业控制作业控制是BSD在1980年增加的一个特性。一个作业只是几个进程的集合。作业控制要求以下三种形式的支持:1). 支持作业控制的shell(C shell支持,Bourne shell不支持,而Korn shell视情况)。2). 内核中的终端驱动程序必须支持作业控制。3). 内核必须提供对某些作业控制信号的支持。三个特殊字符可使终端驱动程序产生信号:1). 中原创 2009-03-07 10:57:00 · 1474 阅读 · 0 评论 -
进程通信之命名管道(FIFO)
1. FIFOFIFO也被称为命名管道。管道只能由相关进程使用,这些相关进程的共同的祖先进程创建了管道。创建FIFO类似于创建文件。确实,FIFO的路径名存在于文件系统中。#include int mkfifo(const char *pathname, mode_t mode);mkfifo函数中mode参数的规格说明与open函数的mode相同。新FIFO的用户和组的所有权规则原创 2009-03-14 15:17:00 · 1021 阅读 · 0 评论 -
进程通信之消息队列
1. 消息队列1.1消息队列消息队列是消息的链接表,存放着内核中由消息队列标识符标识。消息队列简称队列(queue),其标识符为队列ID(queue ID)。每个队列都有一个msqid_ds结构与其相关联:struct msqid_ds{struct ipc_perm msg_perm; //msgqnum_t msg_qnum; // # of messa原创 2009-03-14 15:32:00 · 1869 阅读 · 0 评论 -
线程本地存储(Windows和Linux)
一、线程本地存储(Windows, Thread Local Storage) TLS 是一个机制,经过它,程序可以拥有全局变量,但处于“每一线程各不相同”的状态。也就是说,进程中的所有线程都可以拥有全局变量,但这些变量其实是特定对某个 线程才有意义,各个线程拥有全局变量的一个副本,各自之间不相影响。就是这么一个意思,比如我定义了一个全局变量 int a=10,那么我在线程1中对a进行操作a=a-1,如果我 没用TLS,那么线程2开始获得的a就是9。而如果采取了TLS,不管线程1中对a原创 2011-05-17 18:48:00 · 4394 阅读 · 0 评论