摘要: 守护进程(daemon process)常用于执行操作系统的日常工作。由于守护进程没有终端,因此,我们说守护进程运行在后台中。建立守护进程时,需要按顺序执行下列操作调用unmask操作,设置文件权限掩码(file mode creation mask)为0。调用fork操作,使父进程退出。调用setsid建立一个新会话。设置当前工作目录为根目录。关闭不必要的文件描述符。设置文件描述符0、1、2至/dev/null。因为守护进程中标准输入输出流以及标准错误输出流被设置为null,无法使用标准IO流对守护进程记录错误信息。如果每一个守护进程将错误信息记录在不同的文件中,会为系统的维护带来不必要的麻 阅读全文
posted @ 2012-09-16 16:17 o0慢节奏0o 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 线程创建与关闭 在Unix操作系统中,一个进程可以同时运行多个线程,线程由线程ID、寄存器值集合、栈、信号掩码(signal mask)、错误标示符(errno)、线程私有数据构成。同一进程中的多个线程共享文本片段、程序全局存储区、堆存储区、栈存储区、文件描述符。 线程的创建可以使用pthread_create函数,其函数原型为#include <pthread.h>int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn) (void *), void *arg); 参数ti 阅读全文
posted @ 2012-09-10 02:39 o0慢节奏0o 阅读(1443) 评论(0) 推荐(0) 编辑
摘要: Unix中每一个信号对应一个信号编号,该编号写在文件<signal.h>中。Unix共有五种方式可以产生信号:由终端发送信号至前台进程组。出现硬件异常,产生异常信号出现软件异常,产生异常信号由kill命令发送相应信号至指定进程当前进程调用kill函数发送指定信号至指定进程 对信号的处理过程分为三种情况忽略该信号捕获信号,并执行相应信号处理程序由系统执行默认信号处理操作需注意的是,SIGSTOP和SIGKILL信号是不可以忽略或捕获的。 使用signal或sigaction函数可以为信号指定其信号处理函数。函数原型如下#include <signal.h>void (*s 阅读全文
posted @ 2012-08-25 15:57 o0慢节奏0o 阅读(1072) 评论(1) 推荐(0) 编辑
摘要: 终端登录 在用户使用终端登录Unix操作系统过程中,操作系统首先进行自引导,由内核创建初始化进程(进程ID为1),初始化进程使操作系统进入多用户状态。初始化进程读取/etc/tty文件中的内容,为每一个终端设备新建一个子进程,并执行getty程序。getty程序为当前终端打开文件描述符0、1、2至终端设备,并初始化环境变量列表,执行login程序,等待用户登录。如图1所示。图1. 终端登录调用login后状态 用户登录成功后,login程序根据所登录的用户对进程环境变量做出调整。login程序调用setgid及setuid系统函数,运行login shell,加载引导文件(.prof... 阅读全文
posted @ 2012-08-16 16:36 o0慢节奏0o 阅读(738) 评论(0) 推荐(0) 编辑
摘要: Unix中解释程序文件第一行格式为#! pahtname [ optional-argument]pathname为解释程序的绝对路径,optional-arugment为解释程序参数。例如,shell脚本第一行大多为#! /bin/sh当使用exec函数执行解释程序文件时,内核识别出该文件为解释程序文件,并将文件内容以命令的方式传递给解释程序。例如下面代码:#include "apue.h"#include <sys/wait.h>int main(void){ pid_t pid; if ((pid = fork()) < 0) { err_sys(& 阅读全文
posted @ 2012-08-10 17:46 o0慢节奏0o 阅读(164) 评论(0) 推荐(0) 编辑
摘要: wait函数和waitpid函数用于捕获子进程停止信号,获取子进程停止状态,并在子进程结束后清除该进程所占用的系统资源。其函数原型为#include <sys/wait.h>pid_t wait(int *statloc); //返回已结束子进程id或-1pid_t waitpid(pid_t pid, int *statloc, int options); //返回已结束子进程id、0或-1 wait函数监听所有子进程,当存在任一子进程停止时,wait函数立即返回。waitpid函数监听子进程受pid参数限制,当pid>0时,pid值为... 阅读全文
posted @ 2012-08-10 17:19 o0慢节奏0o 阅读(733) 评论(0) 推荐(0) 编辑
摘要: 在Unix操作系统中,每一个进程都具有自己唯一的进程标识号(ID)。大多数Unix操作系统会对进程ID进行重用延迟,当进程结束时,调度程序并不会立即将该进程ID重分配给下一个进程,以免正在运行的进程利用旧ID错误调用新建进程。其中ID为0表示调度进程(swapper),负责进程之间的调度关系。用户进程无法与调度进程直接通信,调度进程由内核直接控制。ID为1表示初始化进程(init process),初始化进程在内核引导流程结束时被调用,用于初始化系统环境。初始化文件是/erc/rc*文件、/etc/inittab文件及/etc/init.d目录下的文件。初始化进程从不退出。getpid系列.. 阅读全文
posted @ 2012-08-07 15:09 o0慢节奏0o 阅读(1896) 评论(0) 推荐(0) 编辑
摘要: C程序在进程中分为代码片段(text segment)、初始化数据片段(initialized data segment)、未初始化数据片段(uninitialized data segment)、栈(stack)以及堆(heap)。其内存分布如图1所示图1. C程序运行时内存布局代码片段往往是只读内容,为进程运行提供必要的操作步骤。初始化数据片段包含C代码中明确初始化了的变量值。未初始化数据片段(又称为bss段),包含C代码中未明确初始化的变量,该片段中数据在程序启动时被全部重置为0(按位全部填充为0)。栈用于存储程序运行时的自动局部变量(automatic variables)、函数调用. 阅读全文
posted @ 2012-07-09 15:56 o0慢节奏0o 阅读(427) 评论(1) 推荐(0) 编辑
摘要: 在Unix中有八种方式可以使终止进程:从主函数中返回调用exit函数调用_exit或_Exit函数最后一个线程从启动例程返回最后一个线程调用pthread_exit函数调用abort函数接收到一个信号并终止最后一个线程中响应取消请求1~5被称为正常终止,6~8为异常终止。exit函数被调用时将先执行一些清理工作(可由atexit函数指定),而_exit函数和_Exit函数被调用时将直接返回至内核中(_exit函数由ISO C标准定义,_Exit函数由POSIX.1标准定义)。当main函数自然返回(主函数结束或使用return返回)时,进程将自动调用exit函数进行扫尾工作。atexit函数可 阅读全文
posted @ 2012-07-09 15:25 o0慢节奏0o 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 在Unix中,当我们使用标准IO库来进行文件操作时,我们就对该文件创建了一个文件流。每一个文件流都具有缓冲区,可以用来缓存从文间中读取(写入)的内容,缓冲可以分为三种方式:全缓冲(fully buffered),当缓冲区全部填满时才调用系统函数执行读写操作。行缓冲(line buffered),当缓冲区内读取到换行符,或缓冲区被写满时才调用系统函数执行读写操作。无缓冲(unbuffered),没有缓冲区,每次根据要求调用系统函数进行单个字符的连续读取操作。 可以通过调用fflush函数对指定文件流缓冲区进行强制刷新,调用系统函数执行相应读写操作,并清空缓冲区中内容。setbuf函数和se... 阅读全文
posted @ 2012-06-18 11:54 o0慢节奏0o 阅读(839) 评论(0) 推荐(0) 编辑