APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构

从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境。内核的接口被称为系统调用。公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用。shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口

从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等)

1.3  shell

shell是一个命令行解释器,它读取用户输入,然后执行命令。用户通常用终端(交互式shell),有时则通过文件(shell script)向shell进行输入

UNIX系统常见shell:

名称                 路径

        Boune shell:       /bin/sh

        Bourne-again shell:  /bin/bash

        C shell:        /bin/csh

        Korn shell:      /bin/ksh

        TENEX C shell:    /bin/tcsh  

C shell其控制流类似于C语言,它支持Bourne shell没有的某些特色功能,例如作业控制、历史记忆机制以及命令行编辑等

Korn shell它与Bourne shell向上兼容,并具有使C shell广泛得到应用的一些特色功能,包括作业控制以及命令行编辑

Bourne-again shell是GNUshell,所有linux都提供这种shell,它被设计成遵循POSIX的,同时也保留了与Bourne shell的兼容性。它支持C shell和Korn shell两者的特色功能

TENEX C shell 是C shell的加强版本。它从TENEX操作系统借鉴了很多特色,例如命令完备。TENEX C shell在C shell的基础上增加了很多特征,常被用来替换C shell

注:linux默认shell是Bourne-again shell.事实上,/bin/sh将链接到/bin/bash.FreeBSD 和Mac OS X的默认用户shell是TENEX C shell,但是因为使用C shell编程语言极其困难,所以它们使用Bourne shell编写用于管理方面的shell脚本

1.4文件和目录

1.文件系统

UNIX文件系统是目录和文件组成的一种层次结构,目录的起点称为根(root),其名字是一个字符/。文件属性是指文件类型(是普通文件还是目录)、文件大小、文件所有者、文件权限以及文件最后的修改时间等。

2.文件名

目录中的各个名字称为文件名。不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个。

创建新目录时会自动创建两个文件名:.(当前目录),..(父目录)

3.路径名

以斜线开头的路径名称称为绝对路径名,否则称为相对路径名

实例:1-1 列出一个目录中的所有文件

 1 #include"apue.h"
 2 #include<dirent.h>
 3 int main(int argc,char *argv[])    //argc表示参数个数;argv表示参数内容
 4 {
 5     DIR *dp;
 6     struct dirent *dirp;      
 7     if(argc!=2)
 8     err_quit("usage:ls directory_name");
 9     if((dp=opendir(argv[1]))==NULL)  //opendir函数返回指向DIR结构的指针
10     err_sys("can‘t open%s",argv[1]);
11     while((dirp=readdir(dp))!=NULL)  //readdir返回一个指向dirent结构的指针
12     printf("%s\n",dirp->d_name);
13     closedir(dp);
14    exit(0);
15 }

这段代码类似于ls命令,不过这段代码只打印一个目录中各个文件的名字,不显示其他信息

编译方法:$ cc xxx.c  编译

$ ./a.out  运行   

(可能很多初学者在编译这段代码时会出现找不到apue.h,这里我发个配置apue.h头文件的链接 http://www.linuxidc.com/Linux/2013-01/77686.htm)

1.5输入与输出

1.文件描述符

文件描述符通常是一个小的非负整数,内核用它标识一个特定进程访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。在读写文件时,就可以使用它。

3.不用缓冲的I/O

函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符

程序清单1_2 将标准输入复制到标准输出

 1 #include"apue.h"
 2 #define BUFFSIZE 4096
 3 int main(void)
 4 {
 5     int n;
 6     char buf[BUFFSIZE];
 7     while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
 8         if(write(STDOUT_FILENO,buf,n)!=n)
 9             err_sys("write error");
10         if(n<0)
11         err_sys("read error");
12     exit(0);
13 }

4.标准I/O

标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口。使用标准I/O函数可以无需担心如何选取最佳的缓冲区大小,例如1_2中BUFFSIZE常量的大小。使用标准I/O函数的另一个优点是简化了对输入行的处理。例如,fgets函数读一完整的行,而read函数读指定字节数。(printf函数便是标准I/O函数)

实例:1_3 用标准I/O将标准输入复制到标准输出

 1 #include"apue.h"
 2 int main()
 3 {
 4     int c;
 5     while((c=getc(stdin))!=EOF)
 6         if(putc(c,stdout)==EOF)
 7         err_sys("output error");
 8     if(ferror(stdin))
 9     err_sys("input error");
10     exit(0);
11 }

附:无缓冲I/O操作和标准I/O操作的区别 http://blog.csdn.net/cowbane/article/details/6630298

1.6程序和进程

1.程序是存放在磁盘上,处于某个目录中的一个可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行

2.进程和进程ID

程序的执行实例被称为进程。UNIX系统确保每个进程都有一个惟一的数字标识符,称为进程ID,进程ID总是一非负整数

实例:1_4 打印进程ID

1 #include"apue.h"
2 int main()
3 {
4     printf("hello world from process ID %d\n",getpid());
5     exit(0);
6 }

此程序运行时,它调用函数getpid得到其进程ID

3.进程控制

有三个用于进程控制的主要函数:fork,exec和waitpid

实例: 1_5 从标准输入读命令并执行(类shell程序)

 1 #include"apue.h"
 2 #include<sys/wait.h>
 3 4
 5 int main(void)
 6 {
 7     char buf[MAXLINE];
 8     pid_t pid;
 9     int status;

13     printf("%% ");
14     while(fgets(buf,MAXLINE,stdin)!=NULL){
15     if(buf[strlen(buf)-1]==‘\n‘)
16     buf[strlen(buf)-1]=0;             //用null替换换行符
17     if((pid=fork())<0){            //fork向父进程返回新子进程的进程ID(非负),对子进程则返回0;所以说它被调用一次,返回两次
18     err_sys("fork error");
19     }
20     else if(pid==0){
21     execlp(buf,buf,(char *)0);    //execlp执行从标准输入读入的命令。fork和跟随其后的exec两者的组合是某些操作系统所称的产生(spawn)一个新进程
22     err_ret("couldn‘t execute:%s",buf);
23     exit(127);
24     }
25     if((pid=waitpid(pid,&status,0))<0)    //waitpid函数返回子进程的终止状态
26     err_sys("waitpid error");
27     printf("%% ");
28     }
29     exit(0);
30 }

该程序的主要限制是不能向所执行的命令传递参数,例如不能指定要列表的目录名,只能对工作目录执行ls命令

4.线程和线程ID

在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及进程相关的属性。线程ID只在它所属进程内起作用。一个进程中的线程ID在另一个进程中并无意义。

1.7出错处理

当unix函数出错时,常常返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。例如,open函数如成功执行则返回一个非负文件描述符,如出错则返回-1。

实例:1_6 示例strerror和perror两个出错函数的使用方法

1 #include"apue.h"
2 #include<errno.h>
3 int main(int argc,char *argv[])
4 {
5     fprintf(stderr,"EACCES: %s\n",strerror(EACCES));
6     errno=ENOENT;
7     perror(argv[0]);
8     exit(0);
9 }

1.8用户标识

用户ID 和组ID

示例:1_7 打印用户ID和组ID

1 #include"apue.h"
2 int main()
3 {
4     printf("uid=%d,gid= %d,\n",getuid(),getgid());
5     exit(0);
6 }

1.9信号

信号是通知进程已发生某种情况的一种技术。

进程处理信号有三种选择:a.忽略该信号

            b.按系统默认方式处理。对于除以0的情况,系统默认是终止该进程

            c.提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号。使用这种方式,我们只要提供自编的函数就将能知道什么时候产生了信号,并按所希望             的方式处理它

实例:1_8 从标准输入读命令并执行(比1_5多了信号处理)

 1 #include"apue.h"
 2 #include<sys/wait.h>
 3 static void sig_int(int);
 4
 5 int main(void)
 6 {
 7     char buf[MAXLINE];
 8     pid_t pid;
 9     int status;
10     if(signal(SIGINT,sig_int)==SIG_ERR)
11     err_sys("signal error");
12
13     printf("%% ");
14     while(fgets(buf,MAXLINE,stdin)!=NULL){
15     if(buf[strlen(buf)-1]==‘\n‘)
16     buf[strlen(buf)-1]=0;
17     if((pid=fork())<0){
18     err_sys("fork error");
19     }
20     else if(pid==0){
21     execlp(buf,buf,(char *)0);
22     err_ret("couldn‘t execute:%s",buf);
23     exit(127);
24     }
25     if((pid=waitpid(pid,&status,0))<0)
26     err_sys("waitpid error");
27     printf("%% ");
28     }
29     exit(0);
30 }
31     void sig_int(int signo)
32     {
33         printf("interrupt\n%%");
34     }

1.10时间值

UNIX系统使用三个进程时间值:时钟时间,用户cpu时间,系统cpu时间

时钟时间又称为墙上时钟时间(wall clock time)。它是进程运行的时间总量,其值与系统中跟同时运行的进程数有关。

用户CPU时间是执行用户指令所用的时间。

系统cpu时间是为该进程执行内核程序所经历的时间

例如:每当一个进程执行一个系统服务时,如read或write,则在内核内执行该服务所花费的时间就计入该进程的系统cpu时间。用户cpu时间和系统cpu时间之和常被称为cpu时间

取得任意进程的时钟时间,用户时间,和系统时间:$cd /usr/include;time -p grep _POSIX_SOURCE */*.h > /dev/null

APUE学习笔记:第一章 UNUX基础知识

时间: 2024-10-18 14:07:21

APUE学习笔记:第一章 UNUX基础知识的相关文章

Web程序设计笔记-第一章:基础知识

1,Web服务器 (1)Web服务器操作 Web浏览器通过向服务器发送URL来与Web服务器进行通信.URL可以指定两种不同资源中的一种:某个文件或者某个程序. Web客户机和Web服务器之间所有的通信都使用标准的Web协议HTTP. (2)服务器的一般特性 Web服务器的文件结构有两种目录:文档根目录和服务器根目录.文档根目录用户可以直接访问到,服务器根目录只允许管理员访问. 2,超文本传输协议HTTP HTTP包含包含两个阶段:请求阶段和响应阶段.用户代理和Web服务器之间的每次HTTP通信

汇编入门学习笔记 (一)—— 基础知识、寄存器

疯狂的暑假学习之  汇编入门学习笔记 (一) 参考:<汇编语言> 王爽  第一,二章 一.基础知识 1. 用汇编语言编写程序的工作过程 汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示 汇编指令---------------->  编译器  ---------------->机器码----------------> 计算机执行 mov ax, bx                                                          100

加壳学习笔记(一)-基础知识

1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空

《solidity学习笔记》chapter 2-solidity基础知识

映射 映射本质上是存储和查找数据所用的键-值对. mapping (uint => string) intToStr; 地址 以太坊区块链由 account (账户)组成,你可以把它想象成银行账户.一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银行帐户可以电汇资金到其他银行帐户一样.每个帐户都有一个"地址",你可以把它想象成银行账号.这是账户唯一的标识符. mapping (address => uint )publi

第一章 计算机基础知识

第一章 计算机基础知识 第一部分 概述 1.1946年2月15日,第一台计算机 ENIAC 2.物理原件(电子原件) 第一代:电子管.第二代:晶体管.第三代:中小规模集成电路.第四代:超大规模集成电路.第五代:超导材料.第六代:人工智能.#考试考到第四代. 3.计算机的分类 巨型机,大型机,中型机,小型机,微型机 现在的巨型机也是存在的 4.微处理器(CPU.中央处理器)由控制器.寄存器.运算器组成 第二部分 微机系统的组成 CPU>内存>外存 #速度 CPU和内存之间有一个CACHE,叫做高

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的

APUE第一章 UNIX基础知识

前语:本人是半路出家做程序员,实际上应付平时工作中的业务还可以,但是基础知识实在薄弱,当然也跟中国计算机教育有关系,平时跟同事聊天,实际上就算是科班出身,对于计算机本身的了解也知之甚少,因此在毕业两周年到来的时候,给自己确定了以后的技术学习方向,同时也决定了将基础部分补充起来,特来CSDN开这个专题,去学习程序员圣经般著作-<UNIX高级环境编程>,这本书也是被某个同事经常提起,书本比较厚,但是不能操之过急,但是也不要指望一次性就能学完学透,没事回来看看,总有收获,自勉之. 一.UNIX体系结

数据库系统概论学习笔记-第一章绪论

数据库系统概论-第一章绪论 写在前面:寒假来临,除却走亲戚和同学聚餐,王者荣耀等游戏上分花销一点时间之外,自认为要花一点时间学习数据库和Android,以此来为下学期和共建项目打下一丢丢的基础.为了鞭策自己,定了一个小目标( 一个亿),每个两至三天我会发表一篇数据库或Android学习笔记.还是那句话你的才华撑不住你的野心时,那就静下来学习吧 . 数据库系统概述 数据库常用的术语和基本概念 数据库基本概念 数据(Data) 数据是数据库中存储的基本对象,可以对数据做如下定义:描述事物的符号记录称

K&amp;R 学习笔记 第一章

今天开始学习C语言,为了之后的游戏开发学习做好基础,其实在大一的时候学校有C语言的课程,学的马马虎虎,教学也比较浅显,感觉并不能学习到C语言的精髓.在经过多人推荐下,入手了K&R ,看了第一章之后,才发现的确值得这么多人称赞. 其实大多数书的第一章都是差不多的,以Hello World 引出本书学习的知识体系的顺序,有趣的是之后的练习,也是要花一番功夫的. 1.4 提到了幻数,所谓幻数,就是在程序中直接使用的数字.C语言的传统方式是使用#define行来对付幻数.C语言预处理程序是一个强有力的工