UNIX环境高级编程笔记
cabbage2008
这个作者很懒,什么都没留下…
展开
-
第2章 unix标准及实现
SVR4SVR4是UNIX操作系统的一种新的内核标准,是迄今为止内核版本最新的UNIXSVR4并不代表一个具体的UNIX变体,而只是一个内核的标准。SVR4有极高的标准性,那意味着你学好了SVR4可以在所有SVR4内核的操作系统上进行统一的操作(不会产生学习了一个UNIX系统还要学习另外的困惑)SVR4(UNIX System V Release4)是AT&T在1989年首次发行的;S原创 2015-08-24 09:56:32 · 441 阅读 · 0 评论 -
第21章 与网络打印机通信
Linux下设置网络打印机一、在服务器端1管理平台上http://127.0.0.1:6311.1 Administration->SERVER->Basic Server Setting勾选√Show printers shared by other systems(这一句是说,显示在其它电脑下的共享打印机,不需要可以不勾)√Share published printers connected to this system(这一句是说共享你的打印机)√Allow printing from原创 2015-10-17 15:59:35 · 644 阅读 · 0 评论 -
第20章 数据库函数库
MySQL数据库函数1. 初始化一个连接句柄 MYSQL *mysql_init(MYSQL *); 正确:返回一个指向新分配的链接句柄结构的指针 错误:NULL 注:该函数的传入参数通常为NULL即可。原创 2015-10-11 18:01:06 · 353 阅读 · 0 评论 -
第12章 线程控制
1线程的优点:统一进程下的线程共享同一进程空间,所以节约资源,主要包括以下三面:创建块、系统调度线程间切换快、通信快原创 2015-09-19 15:37:48 · 396 阅读 · 0 评论 -
第11章 线程
线程标识就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID只有在它所属的进程上下文中才有意义。进程ID 用pid_t数据类型表示线程ID用pthread_t数据类型来表示#include<pthread.h>int pthread_equal(pthread_t tid1,pthread_t tid2)返回值:若相等,返回非0数值;否则,返回0线程可以通过调用pthread_self函数获得自身的线程ID#include<pthr原创 2015-09-05 14:01:40 · 387 阅读 · 0 评论 -
第13章 守护进程
守护进程(daemon) 是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。编程规则1)创建子进程,父进程退出这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进原创 2015-09-19 15:45:15 · 615 阅读 · 0 评论 -
第十七章 高级进程间通信
17.1 引言 前面两章讨论了UNIX系统提供的各种IPC,包括管道和套接字。本章介绍两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)。17.2 基于STREAMS的管道17.3 UNIX域套接字 UNIX域套接字用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;他们并不执行协议处理,不需要添加或删除网络报头,原创 2015-10-11 17:18:39 · 385 阅读 · 0 评论 -
第19章 伪终端
伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ttyp3)。而ttyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这原创 2015-10-11 17:59:42 · 507 阅读 · 2 评论 -
第15章 进程间通信
进程通信(interProcess Communication ,IPC)管道是unix系统IPC的最古老形式,所有Unix系统都提供此种通信机制管道局限性:一般为半双工 管道只能在具有公共祖先的两个进程之间使用管道通过调用pipe函数创建的。#include<unistd.h>原创 2015-09-23 09:15:01 · 422 阅读 · 0 评论 -
第16章 网络IPC:套接字
进程通信(interProcess Communication ,IPC)套接字描述符套接字是通信端点的抽象。#include<sys/socket.h>int socket(int domain, int type, int protocol);返回值:若成功,返回文件(套接字)描述符;若出错,返回 -1参数domain(域)确定通信的特性,包括地址格式。参数type确定套接字的类型,进一步确定通信特征。参数protocol通常是0,表示为给定的域和套接字选择默认协议。原创 2015-10-11 17:01:05 · 454 阅读 · 0 评论 -
第18章 终端I/O
在我们设置定时任务的时候经常会使用标准输出和标准错误输出。这个在Linux是一个非常重要的概念,而且这个很有用。程序应该有数据库的来源端、数据的目的端,以及报告问题的地方,它们被称为标准输入、标准输出以及标准错误输出。原创 2015-10-11 17:58:13 · 406 阅读 · 0 评论 -
第9章 进程关系
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。我们在这里讲解进程组和会话,以便以更加丰富的方式了管理进程。原创 2015-09-04 21:30:29 · 389 阅读 · 0 评论 -
第8章 进程控制
进程标识进程ID为0的一般为调度进程,常常被称为交换进程(swapper)#include<unistd.h>pid_t getpid(void); 返回值:调用进程的进程IDpid_t getppid(void); 返回值:调用进程的父进程IDuid_t getuid(void); 返回值:调用进程的实际用户IDuid_t geteuid(void); 返回值:调用进程的有效用户IDgid_t getgid(void); 返回值:调用进程的实际组IDgid_t getegid(voi原创 2015-09-04 17:53:06 · 470 阅读 · 0 评论 -
第8章(1) 进程控制 -fork函数
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。我们来看一个例子:转载 2015-09-04 18:07:48 · 504 阅读 · 0 评论 -
第0章 前言知识
UNIX应用广泛苹果MAC OS X和ios 使用开源类unix操作系统Darwin谷歌的Android 使用linux作为操作系统内核操作系统的区别Linux和Windows的区别 和Linux一样,Windows系列是完全的多任务操作系统。它们支持同样的用户接口、网络和安全性。但是,Linux和Windows的真正区别搜索在于,Linux事实上是Unix的一种版本,而且来自Unix的贡献非常巨大。是什么使得Unix如此重要?不仅在于对多用户机器来说,Unix是最流行的操作系统,而且在于它是免费原创 2015-08-21 17:26:49 · 690 阅读 · 0 评论 -
第1章 unix基础知识
操作系统共性服务:执行新程序、打开文件、读文件、分配存储区以及获得当前时间等。口令文件 /etc/passwd 可以查看登陆名样例:root:x:0:0:root:/root:/bin/bash文件以冒号分隔,有七项内容,分别为:登录名、加密口令、数字用户id、数字组id、其实目录以及shell程序shell是一个命令行解释器,它读取用户输入(可以是终端输入,也可以是shell脚本),然后执行命令斜线和空字符不可以出现在文件名中:斜线用来指示路径 空字符用来终止路径unix编译程序: 如当原创 2015-08-21 18:16:00 · 457 阅读 · 0 评论 -
第3章 文件I/O
引言unix系统中的大多数文件I/O 只需要用到5个函数:open、read、write、lseek以及close文件描述符用于描述文件打开或者创建之后返回的一个非负整数,可以理解为文件的id特殊用途的标号: 0:标准输入、1:标准输出 、 2:标准错误早期系统一般一个进程最多打开16个文件,现在增加到63个,而有些如mac等可以增加到无限函数open和openat调用open或openat函数可以打开或创建一个文件#include <fcntl.h> int open(const原创 2015-08-24 14:53:15 · 646 阅读 · 1 评论 -
第4章 文件和目录
文件类型(1)普通文件(regular file)。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于UNIX内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。一个值得注意的例外是二进制可执行文件。为了执行程序,内核必须理解其格式。所有二进制可执行文件都遵循一种标准化的格式,这种格式使内核能够确定程序文本和数据的加载位置。(2)目录文件(directory file)。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有原创 2015-08-25 15:52:48 · 609 阅读 · 0 评论 -
第5章 标准I/O库
流的定向决定了所读、写的字符是单字节还是多字节的。(如ASCII字符集是单字节的,国际字符集是多字节的)#include<stdio.h>#include<wchar.h>int fwide(FILE *fp, int mode)宽定向返回正值,字节定向返回负值,未定向返回0fwide并不改变已定向的流方向三个标准I/O流通过预定义文件指针stdin、stdout和stderr加以引用。缓冲标准I/O库提供缓冲的目的是尽可能减少使用read和write调用次数。UNIX里面关于标准IO的几种原创 2015-08-26 19:51:58 · 564 阅读 · 0 评论 -
第6章 系统数据文件和信息
口令文件用户:基础密码文件:/etc/passwd密码文件:/etc/shadow组:基础密码文件:/etc/group密码文件:/etc/gshadow/etc/passwd内容:用户名、X(表示密码存于/etc/shadow)、UID、GID、个人信息、家目录、默认shell查看个人信息:finger 用户名修改个人信息:chfn 用户名修改默认shell:chsh 用户名(修改范围:/etc/shells)root可以直接用vi修改/etc/passwd/etc/shadow原创 2015-08-27 20:03:36 · 437 阅读 · 0 评论 -
第8章(2) 进程控制 -函数wait和waitpid
#include <sys/types.h> /* 提供类型pid_t的定义 */#include <sys/wait.h>pid_t wait(int *status)进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。参数status用来保存被收集进程退出时的一些状态,它是一个指向i转载 2015-09-04 20:48:34 · 353 阅读 · 0 评论 -
第10章 信号
每个信号都有一个名字。这些名字都以3个字符SIG开头。例如,SIGABRT是夭折信号,当进程调用abort函数时产生这种信号。SIGALRM是闹钟信号,由alarm函数设置的定时器超时后将产生此信号。在头文件<signal.h>中,信号名都被定义为正整数常量(信号编号)不存在编号为0的信号。kill函数对信号编号0有特殊的应用。Signal DescriptionSIGABRT 由调用abort函数产生,进程非正常退出SIGALRM 用alarm函数设置的 timer超时或s原创 2015-09-05 13:46:19 · 408 阅读 · 0 评论 -
第7章 进程环境
main函数C程序总是从main函数开始执行。main函数的原型是:int mian(int argc, char *argv[]);其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组进程终止有8种方式使进程终止,其中5种为正常终止,它们是:1)从main返回2) 调用exit3)调用_exit或者_Exit4)最后一个线程从其启动历程返回5) 从最后一个线程调用pthread_exit异常终止有3种方式,它们是:6)调用abort7)接到一个信号8)最后原创 2015-08-28 09:31:31 · 505 阅读 · 0 评论 -
第14章 高级I/O
非阻塞I/O调用I/O可能会使进程永远阻塞。 1)文件不存在 读操作阻塞2) 数据不能被相同文件类型立即接受 (如无空间、网络流控制等) 写操作阻塞3)打开某些文件类型阻塞4)对已经加上强制性记录锁的文件进行读写5)某些ioctl操作6)某些进程间通信函数原创 2015-09-21 19:36:41 · 434 阅读 · 0 评论