当前位置:文档之家› Linux操作系统下c语言编程入门unix操作系统下同样适用

Linux操作系统下c语言编程入门unix操作系统下同样适用

Linux操作系统下c语言编程入门unix操作系统下同样适用
Linux操作系统下c语言编程入门unix操作系统下同样适用

linux操作系统下c语言编程入门

适用>

linux操作系统下c语言编程入门

整理编写:007xiong

原文:Hoyt等

(一)目录介绍

1)Linux程序设计入门--基础知识

2)Linux程序设计入门--进程介绍

3)Linux程序设计入门--文件操作

4)Linux程序设计入门--时间概念

5)Linux程序设计入门--信号处理

6)Linux程序设计入门--消息管理

7)Linux程序设计入门--线程操作

8)Linux程序设计入门--网络编程

9)Linux下C开发工具介绍

(二)具体内容

1)Linux程序设计入门--基础知识

Linux下C语言编程基础知识

前言:

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将

会学到以下内容:

源程序编译

Makefile的编写

程序库的链接

程序的调试

头文件和系统求助

----------------------------------------------------------------------------

----

1.源程序的编译

在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们

以一个实例来说明如何使用gcc编译器.

假设我们有下面一个非常简单的源程序(hello.c):

int main(int argc,char **argv)

{

printf("Hello Linux\n");

}

要编译这个程序,我们只要在命令行下执行:

gcc -o hello hello.c

gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.

gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而

不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.

知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.

2.Makefile的编写

假设我们有下面这样的一个程序,源代码如下:

/* main.c */

#include "mytool1.h"

#include "mytool2.h"

int main(int argc,char **argv)

{

mytool1_print("hello");

mytool2_print("hello");

}

/* mytool1.h */

#ifndef _MYTOOL_1_H

#define _MYTOOL_1_H

void mytool1_print(char *print_str);

#endif

/* mytool1.c */

#include "mytool1.h"

void mytool1_print(char *print_str)

{

printf("This is mytool1 print %s\n",print_str);

}

/* mytool2.h */

#ifndef _MYTOOL_2_H

#define _MYTOOL_2_H

void mytool2_print(char *print_str);

#endif

/* mytool2.c */

#include "mytool2.h"

void mytool2_print(char *print_str)

{

printf("This is mytool2 print %s\n",print_str);

}

当然由于这个程序是很短的我们可以这样来编译

gcc -c main.c

gcc -c mytool1.c

gcc -c mytool2.c

gcc -o main main.o mytool1.o mytool2.o

这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一

天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程

序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?

为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:

# 这是上面那个程序的Makefile文件

main:main.o mytool1.o mytool2.o

gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

gcc -c main.c

mytool1.o:mytool1.c mytool1.h

gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

gcc -c mytool2.c

有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理

都不想去理的.

下面我们学习Makefile是如何编写的.

在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:

target: components

TAB rule

第一行表示的是依赖关系.第二行是规则.

比如说我们上面的那个Makefile文件的第二行

main:main.o mytool1.o mytool2.o

表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o

当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上

面那个Makefile第三行所说的一样要执行gcc -o main main.o mytool1.o mytool2.o

注意规则一行中的TAB表示那里是一个TAB键

Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.

如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:

# 这是简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

mytool1.o:mytool1.c mytool1.h

gcc -c $<

mytool2.o:mytool2.c mytool2.h

gcc -c $<

经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则

..c.o:

gcc -c $<

这个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c 这样Makefile还可以变为:

# 这是再一次简化后的Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

..c.o:

gcc -c $<

好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.

3.程序库的链接

试着编译下面这个程序

/* temp.c */

#include

int main(int argc,char **argv)

{

double value;

printf("Value:%f\n",value);

}

这个程序相当简单,但是当我们用gcc -o temp temp.c 编译时会出现下面所示的错误.

/tmp/cc33Kydu.o: In function `main':

/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'

collect2: ld returned 1 exit status

出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入-lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许

有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的-L选项指定路径.比如说我们有一个库在/home/hoyt/mylib下,这样我们编译的时候还要加上-L/h ome/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面

的库,我们可以不指定路径.

还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libp

thread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只

好用nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在s

in文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在libm-2.1.2.so库里面,我用-lm选项就可以了(去掉前面的lib和后面的版本标志,就剩

下m了所以是-lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!

4.程序的调试

我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我

们想不到的错误,这个时候我们就要对我们的程序进行调试了.

最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入-g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情

,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有

必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试

一试找出自己喜欢的一个用.

5.头文件和系统求助

有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数

在那个头文件进行了说明.这个时候我们可以求助系统.

比如说我们想知道fread这个函数的确切形式,我们只要执行man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函

数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是w rite这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明

我们要用man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常

用的是3表示函数是C的库函数.

记住不管什么时候,man都是我们的最好助手.

------------------------------------------------------------------------

好了,这一章就讲这么多了,有了这些知识我们就可以进入激动人心的Linux下的C程序探险活动.

2)Linux程序设计入门--进程介绍

Linux下进程的创建

前言:

这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到:

进程的概念

进程的身份

进程的创建

守护进程的创建

----------------------------------------------------------------------------

----

1。进程的概念

Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命

令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面,都有程序和进程

的概念.那么什么是程序,什么是进程呢? 通俗的讲程序是一个包含可以执行代码的文件

,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文

件的具体实现. 一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环

下去,而产生子孙进程. 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内

存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只

有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的

身份证)以便识别. 为了充分的利用资源,系统还对进程区分了不同的状态.将进程分为新

建,运行,阻塞,就绪和完成五个状态. 新建表示进程正在被创建,运行是进程正在运行,阻

塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示

进程已经结束了系统正在回收资源. 关于进程五个状态的详细解说我们可以看《操作系

统》上面有详细的解说。

2。进程的标志

上面我们知道了进程都有一个ID,那么我们怎么得到进程的ID呢?系统调用getpid可

以得到进程的ID,而getppid可以得到父进程(创建调用该函数进程的进程)的ID.

#include

pid_t getpid(void);

pid_t getppid(void);

进程是为程序服务的,而程序是为了用户服务的.系统为了找到进程的用户名,还为进程和

用户建立联系.这个用户称为进程的所有者.相应的每一个用户也有一个用户ID.通过系统

调用getuid可以得到进程的所有者的ID.由于进程要用到一些资源,而Linux对系统资源是

进行保护的,为了获取一定资源进程还有一个有效用户ID.这个ID和系统的资源使用有关

,涉及到进程的权限. 通过系统调用geteuid我们可以得到进程的有效用户ID. 和用户ID

相对应进程还有一个组ID和有效组ID系统调用getgid和getegid可以分别得到组ID和有效组ID

#include

#include

uid_t getuid(void);

uid_t geteuid(void);

gid_t getgid(void);

git_t getegid(void);

有时候我们还会对用户的其他信息感兴趣(登录名等等),这个时候我们可以调用getpwui

d来得到.

struct passwd {

char *pw_name; /* 登录名称*/

char *pw_passwd; /* 登录口令*/

uid_t pw_uid; /* 用户ID */

gid_t pw_gid; /* 用户组ID */

char *pw_gecos; /* 用户的真名*/

char *pw_dir; /* 用户的目录*/

char *pw_shell; /* 用户的SHELL */

};

#include

#include

struct passwd *getpwuid(uid_t uid);

下面我们学习一个实例来实践一下上面我们所学习的几个函数:

#include

#include

#include

#include

int main(int argc,char **argv)

{

pid_t my_pid,parent_pid;

uid_t my_uid,my_euid;

gid_t my_gid,my_egid;

struct passwd *my_info;

my_pid=getpid();

parent_pid=getppid();

my_uid=getuid();

my_euid=geteuid();

my_gid=getgid();

my_egid=getegid();

my_info=getpwuid(my_uid);

printf("Process ID:%ld\n",my_pid);

printf("Parent ID:%ld\n",parent_pid);

printf("User ID:%ld\n",my_uid);

printf("Effective User ID:%ld\n",my_euid);

printf("Group ID:%ld\n",my_gid);

printf("Effective Group ID:%ld\n",my_egid):

if(my_info)

{

printf("My Login Name:%s\n" ,my_info->pw_name);

printf("My Password :%s\n" ,my_info->pw_passwd);

printf("My User ID :%ld\n",my_info->pw_uid);

printf("My Group ID :%ld\n",my_info->pw_gid);

printf("My Real Name:%s\n" ,my_info->pw_gecos);

printf("My Home Dir :%s\n", my_info->pw_dir);

printf("My Work Shell:%s\n", my_info->pw_shell);

}

}

3。进程的创建

创建一个进程的系统调用很简单.我们只要调用fork函数就可以了.

#include

pid_t fork();

当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只

有他的进程ID和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样.当然创建

两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪fork的返回值. 当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则f ork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我

们就是根据这个返回值来区分父子进程的. 父进程为什么要创建子进程呢?前面我们已经

说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时

进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从

fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直

到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用.

#include

#include

pid_t wait(int *stat_loc);

pid_t waitpid(pid_t pid,int *stat_loc,int options);

wait系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果

没有父进程没有子进程或者他的子进程已经结束了wait回立即返回.成功时(因一个子进

程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的

退出状态.子进程调用exit,_exit 或者是return来设置这个值. 为了得到这个值Linux定

义了几个宏来测试这个返回值.

WIFEXITED:判断子进程退出值是非0

WEXITSTATUS:判断子进程的退出值(当子进程退出时非0).

WIFSIGNALED:子进程由于有没有获得的信号而退出.

WTERMSIG:子进程没有获得的信号号(在WIFSIGNALED为真时才有意义).

waitpid等待指定的子进程直到子进程返回.如果pid为正值则等待指定的进程(pid).如果

为0则等待任何一个组ID和调用者的组ID相同的进程.为-1时等同于wait调用.小于-1时等待任何一个组ID等于pid绝对值的进程. stat_loc和wait的意义一样. options可以决定

父进程的状态.可以取两个值WNOHANG:父进程立即返回当没有子进程存在时. WUNTACHE D:当子进程结束时waitpid返回,但是子进程的退出状态不可得到.

父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系

统调用exec族调用.exec族调用有着5个函数.

#include

int execl(const char *path,const char *arg,...);

int execlp(const char *file,const char *arg,...);

int execle(const char *path,const char *arg,...);

int execv(const char *path,char *const argv[]);

int execvp(const char *file,char *const argv[]):

exec族调用可以执行给定程序.关于exec族调用的详细解说可以参考系统手册(man exec l). 下面我们来学习一个实例.注意编译的时候要加-lm以便连接数学函数库.

#include

#include

#include

#include

#include

#include

void main(void)

{

pid_t child;

int status;

printf("This will demostrate how to get child status\n");

if((child=fork())==-1)

{

printf("Fork Error :%s\n",strerror(errno));

exit(1);

}

else if(child==0)

{

int i;

printf("I am the child:%ld\n",getpid());

for(i=0;i<1000000;i++) sin(i);

i=5;

printf("I exit with %d\n",i);

exit(i);

}

while(((child=wait(&status))==-1)&(errno==EINTR));

if(child==-1)

printf("Wait Error:%s\n",strerror(errno));

else if(!status)

printf("Child %ld terminated normally return status is zero\n",

child);

else if(WIFEXITED(status))

printf("Child %ld terminated normally return status is %d\n",

child,WEXITSTATUS(status));

else if(WIFSIGNALED(status))

printf("Child %ld terminated due to signal %d znot caught\n",

child,WTERMSIG(status));

}

strerror函数会返回一个指定的错误号的错误信息的字符串.

4。守护进程的创建

如果你在DOS时代编写过程序,那么你也许知道在DOS下为了编写一个常驻内存的程序我们要编写多少代码了.相反如果在Linux下编写一个"常驻内存"的程序却是很容易的.我

们只要几行代码就可以做到. 实际上由于Linux是多任务操作系统,我们就是不编写代码

也可以把一个程序放到后台去执行的.我们只要在命令后面加上&符号SHELL就会把我们的程序放到后台去运行的. 这里我们"开发"一个后台检查邮件的程序.这个程序每个一个指

定的时间回去检查我们的邮箱,如果发现我们有邮件了,会不断的报警(通过机箱上的小喇

叭来发出声音). 后面有这个函数的加强版本加强版本

后台进程的创建思想: 首先父进程创建一个子进程.然后子进程杀死父进程(是不是很无情?). 信号处理所有的工作由子进程来处理.

#include

#include

#include

#include

#include

#include

#include

/* Linux 的默任个人的邮箱地址是/var/spool/mail/用户的登录名*/

#define MAIL "/var/spool/mail/hoyt"

/* 睡眠10秒钟*/

#define SLEEP_TIME 10

main(void)

{

pid_t child;

if((child=fork())==-1)

{

printf("Fork Error:%s\n",strerror(errno));

exit(1);

}

else if(child>0)

while(1);

if(kill(getppid(),SIGTERM)==-1)

{

printf("Kill Parent Error:%s\n",strerror(errno));

exit(1);

}

{

int mailfd;

while(1)

{

if((mailfd=open(MAIL,O_RDONLY))!=-1)

{

fprintf(stderr,"%s","\007");

close(mailfd);

}

sleep(SLEEP_TIME);

}

}

}

你可以在默认的路径下创建你的邮箱文件,然后测试一下这个程序.当然这个程序还有很多地方要改善的.我们后面会对这个小程序改善的,再看我的改善之前你可以尝试自己改善一下.比如让用户指定邮相的路径和睡眠时间等等.相信自己可以做到的.动手吧,勇敢的探险者.

好了进程一节的内容我们就先学到这里了.进程是一个非常重要的概念,许多的程序都会用子进程.创建一个子进程是每一个程序员的基本要求!

3)Linux程序设计入门--文件操作

Linux下文件的操作

前言:

我们在这一节将要讨论linux下文件操作的各个函数.

文件的创建和读写

文件的各个属性

目录文件的操作

管道文件

----------------------------------------------------------------------------

----

1。文件的创建和读写

我假设你已经知道了标准级的文件操作的各个函数(fopen,fread,fwrite等等).当然

如果你不清楚的话也不要着急.我们讨论的系统级的文件操作实际上是为标准级文件操作

服务的.

当我们需要打开一个文件进行读写操作的时候,我们可以使用系统调用函数open.使用完

成以后我们调用另外一个close函数进行关闭操作.

#include

#include

#include

#include

int open(const char *pathname,int flags);

int open(const char *pathname,int flags,mode_t mode);

int close(int fd);

open函数有两个形式.其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面).flags可以去下面的一个值或者是几个值的组合.

O_RDONLY:以只读的方式打开文件.

O_WRONLY:以只写的方式打开文件.

O_RDWR:以读写的方式打开文件.

O_APPEND:以追加的方式打开文件.

O_CREAT:创建一个文件.

O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误.

O_NOBLOCK:以非阻塞的方式打开一个文件.

O_TRUNC:如果文件已经存在,则删除文件的内容.

前面三个标志只能使用任意的一个.如果使用了O_CREATE标志,那么我们要使用open的第二种形式.还要指定mode标志,用来表示文件的访问权限.mode可以是以下情况的组合.

-----------------------------------------------------------------

S_IRUSR 用户可以读S_IWUSR 用户可以写

S_IXUSR 用户可以执行S_IRWXU 用户可以读写执行

-----------------------------------------------------------------

S_IRGRP 组可以读S_IWGRP 组可以写

S_IXGRP 组可以执行S_IRWXG 组可以读写执行

-----------------------------------------------------------------

S_IROTH 其他人可以读S_IWOTH 其他人可以写

S_IXOTH 其他人可以执行S_IRWXO 其他人可以读写执行

-----------------------------------------------------------------

S_ISUID 设置用户执行ID S_ISGID 设置组的执行ID

-----------------------------------------------------------------

我们也可以用数字来代表各个位的标志.Linux总共用5个数字来表示文件的各种权限. 00000.第一位表示设置用户ID.第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,最后一位表示其他人的权限.

每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和..

比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件.设置用户ID位那么我们可以使用的模式是--1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省)

5(1+4)即10705:

open("temp",O_CREAT,10705);

如果我们打开文件成功,open会返回一个文件描述符.我们以后对文件的所有操作就可以对这个文件描述符进行操作了.

当我们操作完成以后,我们要关闭文件了,只要调用close就可以了,其中fd是我们要关闭的文件描述符.

文件打开了以后,我们就要对文件进行读写了.我们可以调用函数read和write进行文件的读写.

#include

ssize_t read(int fd, void *buffer,size_t count);

ssize_t write(int fd, const void *buffer,size_t count);

fd是我们要进行读写操作的文件描述符,buffer是我们要写入文件内容或读出文件内容的内存地址.count是我们要读写的字节数.

对于普通的文件read从指定的文件(fd)中读取count字节到buffer缓冲区中(记住我们必须提供一个足够大的缓冲区),同时返回count.

如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count.如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR.当程序读到了文件结尾的时候,read会返回0.

write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数.

下面我们学习一个实例,这个实例用来拷贝文件.

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024

int main(int argc,char **argv)

{

int from_fd,to_fd;

int bytes_read,bytes_write;

char buffer[BUFFER_SIZE];

char *ptr;

if(argc!=3)

fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);

exit(1);

}

/* 打开源文件*/

if((from_fd=open(argv[1],O_RDONLY))==-1)

{

fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));

exit(1);

}

/* 创建目的文件*/

if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) {

fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));

exit(1);

}

/* 以下代码是一个经典的拷贝文件的代码*/

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

{

/* 一个致命的错误发生了*/

if((bytes_read==-1)&&(errno!=EINTR)) break;

else if(bytes_read>0)

{

ptr=buffer;

while(bytes_write=write(to_fd,ptr,bytes_read))

{

/* 一个致命错误发生了*/

if((bytes_write==-1)&&(errno!=EINTR))break;

/* 写完了所有读的字节*/

else if(bytes_write==bytes_read) break;

/* 只写了一部分,继续写*/

else if(bytes_write>0)

{

ptr+=bytes_write;

bytes_read-=bytes_write;

}

}

/* 写的时候发生的致命错误*/

if(bytes_write==-1)break;

}

}

close(from_fd);

close(to_fd);

exit(0);

2。文件的各个属性

文件具有各种各样的属性,除了我们上面所知道的文件权限以外,文件还有创建时间

,大小等等属性.

有时侯我们要判断文件是否可以进行某种操作(读,写等等).这个时候我们可以使用acce

ss函数.

#include

int access(const char *pathname,int mode);

pathname:是文件名称,mode是我们要判断的属性.可以取以下值或者是他们的组合.

R_OK文件可以读,W_OK文件可以写,X_OK文件可以执行,F_OK文件存在.当我们测试成功时,函数返回0,否则如果有一个条件不符时,返回-1.

如果我们要获得文件的其他属性,我们可以使用函数stat或者fstat.

#include

#include

int stat(const char *file_name,struct stat *buf);

int fstat(int filedes,struct stat *buf);

struct stat {

dev_t st_dev; /* 设备*/

ino_t st_ino; /* 节点*/

mode_t st_mode; /* 模式*/

nlink_t st_nlink; /* 硬连接*/

uid_t st_uid; /* 用户ID */

gid_t st_gid; /* 组ID */

dev_t st_rdev; /* 设备类型*/

off_t st_off; /* 文件字节数*/

unsigned long st_blksize; /* 块大小*/

unsigned long st_blocks; /* 块数*/

time_t st_atime; /* 最后一次访问时间*/

time_t st_mtime; /* 最后一次修改时间*/

time_t st_ctime; /* 最后一次改变时间(指属性) */

};

stat用来判断没有打开的文件,而fstat用来判断打开的文件.我们使用最多的属性是st_ mode.通过着属性我们可以判断给定的文件是一个普通文件还是一个目录,连接等等.可以

使用下面几个宏来判断.

S_ISLNK(st_mode):是否是一个连接.S_ISREG是否是一个常规文件.S_ISDIR是否是一个目

录S_ISCHR是否是一个字符设备.S_ISBLK是否是一个块设备S_ISFIFO是否是一个FIFO文件.S_ISSOCK是否是一个SOCKET文件. 我们会在下面说明如何使用这几个宏的.

3。目录文件的操作

在我们编写程序的时候,有时候会要得到我们当前的工作路径。C库函数提供了get

cwd来解决这个问题。

#include

char *getcwd(char *buffer,size_t size);

我们提供一个size大小的buffer,getcwd会把我们当前的路径考到buffer中.如果buffer 太小,函数会返回-1和一个错误号.

Linux提供了大量的目录操作函数,我们学习几个比较简单和常用的函数.

#include

#include

#include

#include

#include

int mkdir(const char *path,mode_t mode);

DIR *opendir(const char *path);

struct dirent *readdir(DIR *dir);

void rewinddir(DIR *dir);

off_t telldir(DIR *dir);

void seekdir(DIR *dir,off_t off);

int closedir(DIR *dir);

struct dirent {

long d_ino;

off_t d_off;

unsigned short d_reclen;

char d_name[NAME_MAX+1]; /* 文件名称*/

mkdir很容易就是我们创建一个目录,opendir打开一个目录为以后读做准备.readdir读一个打开的目录.rewinddir是用来重读目录的和我们学的rewind函数一样.closedir是关闭一个目录.telldir和seekdir类似与ftee和fseek函数.

下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间.

#include

#include

#include

#include

#include

#include

#include

static int get_file_size_time(const char *filename)

{

struct stat statbuf;

if(stat(filename,&statbuf)==-1)

{

printf("Get stat on %s Error:%s\n",

filename,strerror(errno));

return(-1);

}

if(S_ISDIR(statbuf.st_mode))return(1);

if(S_ISREG(statbuf.st_mode))

printf("%s size:%ld bytes\tmodified at %s",

filename,statbuf.st_size,ctime(&statbuf.st_mtime));

return(0);

}

int main(int argc,char **argv)

{

DIR *dirp;

struct dirent *direntp;

int stats;

if(argc!=2)

{

printf("Usage:%s filename\n\a",argv[0]);

exit(1);

}

if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))exit(1);

if((dirp=opendir(argv[1]))==NULL)

{

printf("Open Directory %s Error:%s\n",

argv[1],strerror(errno));

exit(1);

}

while((direntp=readdir(dirp))!=NULL)

if(get_file_size_time(direntp-

closedir(dirp);

exit(1);

}

4。管道文件

Linux提供了许多的过滤和重定向程序,比如more cat

等等.还提供了< > | <<等等重定向操作符.在这些过滤和重定向程序当中,都用到了管道这种特殊的文件.系统调用pipe可以创建一个管道.

#include

int pipe(int fildes[2]);

pipe调用可以创建一个管道(通信缓冲区).当调用成功时,我们可以访问文件描述符fild es[0],fildes[1].其中fildes[0]是用来读的文件描述符,而fildes[1]是用来写的文件描

述符.

在实际使用中我们是通过创建一个子进程,然后一个进程写,一个进程读来使用的.

关于进程通信的详细情况请查看进程通信

#include

#include

#include

#include

#include

#include

#define BUFFER 255

int main(int argc,char **argv)

{

char buffer[BUFFER+1];

int fd[2];

if(argc!=2)

{

fprintf(stderr,"Usage:%s string\n\a",argv[0]);

exit(1);

}

if(pipe(fd)!=0)

{

fprintf(stderr,"Pipe Error:%s\n\a",strerror(errno));

exit(1);

}

if(fork()==0)

{

close(fd[0]);

printf("Child[%d] Write to pipe\n\a",getpid());

snprintf(buffer,BUFFER,"%s",argv[1]);

write(fd[1],buffer,strlen(buffer));

printf("Child[%d] Quit\n\a",getpid());

exit(0);

}

else

{

close(fd[1]);

printf("Parent[%d] Read from pipe\n\a",getpid());

memset(buffer,'\0',BUFFER+1);

read(fd[0],buffer,BUFFER);

printf("Parent[%d] Read:%s\n",getpid(),buffer);

exit(1);

}

}

为了实现重定向操作,我们需要调用另外一个函数dup2.

#include

int dup2(int oldfd,int newfd);

dup2将用oldfd文件描述符来代替newfd文件描述符,同时关闭newfd文件描述符.也就是说,

所有向newfd操作都转到oldfd上面.下面我们学习一个例子,这个例子将标准输出重定向

到一个文件.

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024

int main(int argc,char **argv)

{

int fd;

char buffer[BUFFER_SIZE];

if(argc!=2)

{

fprintf(stderr,"Usage:%s outfilename\n\a",argv[0]);

exit(1);

}

if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1) {

fprintf(stderr,"Open %s Error:%s\n\a",argv[1],strerror(errno));

exit(1);

}

if(dup2(fd,STDOUT_FILENO)==-1)

{

fprintf(stderr,"Redirect Standard Out Error:%s\n\a",strerror(errno));

exit(1);

}

fprintf(stderr,"Now,please input string");

fprintf(stderr,"(To quit use CTRL+D)\n");

while(1)

{

fgets(buffer,BUFFER_SIZE,stdin);

if(feof(stdin))break;

write(STDOUT_FILENO,buffer,strlen(buffer));

}

exit(0);

}

好了,文件一章我们就暂时先讨论到这里,学习好了文件的操作我们其实已经可以写出一些比较有用的程序了.我们可以编写一个实现例如dir,mkdir,cp,mv等等常用的文件操作命令了.

想不想自己写几个试一试呢?

4)程序设计入门--时间概念

前言:Linux下的时间概念

这一章我们学习Linux的时间表示和计算函数

时间的表示

时间的测量

计时器的使用

1。时间表示在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令

的输出结果.这个时候我们可以使用下面两个函数

#include

time_t time(time_t *tloc);

char *ctime(const time_t *clock);

time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中.不过这个函数的返回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串

.. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2000 这个字符串

的长度是固定的为26

2。时间的测量有时候我们要计算程序执行的时间.比如我们要对算法进行时间分析

..这个时候可以使用下面这个函数.

#include

int gettimeofday(struct timeval *tv,struct timezone *tz);

strut timeval {

long tv_sec; /* 秒数*/

long tv_usec; /* 微秒数*/

};

gettimeofday将时间保存在结构tv之中.tz一般我们使用NULL来代替.

#include

#include

#include

void function()

{

unsigned int i,j;

double y;

for(i=0;i<1000;i++)

for(j=0;j<1000;j++)

y=sin((double)i);

}

main()

{

struct timeval tpstart,tpend;

float timeuse;

gettimeofday(&tpstart,NULL);

function();

gettimeofday(&tpend,NULL);

timeuse=1000000*(https://www.doczj.com/doc/da3795070.html,_https://www.doczj.com/doc/da3795070.html,_sec)+

https://www.doczj.com/doc/da3795070.html,_https://www.doczj.com/doc/da3795070.html,_usec;

timeuse/=1000000;

printf("Used Time:%f\n",timeuse);

exit(0);

}

这个程序输出函数的执行时间,我们可以使用这个来进行系统性能的测试,或者是函数算

法的效率分析.在我机器上的一个输出结果是: Used Time:0.556070

3。计时器的使用Linux操作系统为每一个进程提供了3个内部间隔计时器.

ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号.

ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号.

ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生SIGPROF信号.

具体的操作函数是:

#include

int getitimer(int which,struct itimerval *value);

int setitimer(int which,struct itimerval *newval,

struct itimerval *oldval);

struct itimerval {

struct timeval it_interval;

struct timeval it_value;

}

getitimer函数得到间隔计时器的时间值.保存在value中setitimer函数设置间隔计时器的时间值为newval.并将旧值保存在oldval中. which表示使用三个计时器中的哪一个. itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后设置为it_interval值.

#include

#include

#include

#include

#include

#define PROMPT "时间已经过去了两秒钟\n\a"

char *prompt=PROMPT;

unsigned int len;

void prompt_info(int signo)

{

write(STDERR_FILENO,prompt,len);

}

void init_sigaction(void)

{

struct sigaction act;

act.sa_handler=prompt_info;

act.sa_flags=0;

sigemptyset(&act.sa_mask);

sigaction(SIGPROF,&act,NULL);

}

操作系统安装心得

操作系统安装心得 操作系统是最重要的计算机系统软件,发展极为迅速。目前,比较流行的操作系统有Windows、UNIX、以及Linux几大类。 1、Windows操作系统 Windows是目前使用最为广泛、普遍的操作系统。Windows系统,客观的来说,windows系统下的应用软件是最丰富的。windows软件的安装一般来说是很简单的,按照提示一步一步的往下进行就是了,难点是找到适合的软件,现在网上有绿色版,破解版,免注册版等等很多。Windows的优点:图形界面良好,拥有良好的集成开发环境,操作简单。缺点是:不是免费的软件,采用二进制代码,不易修改操作系统本身,漏洞比较多。微软的Windows在主机服务器里流行,是因为它支持大量功能以及友好的用户界面。不像以往的系统写DOS命令来执行任务,Windows是通过图形化的点击来完成。那些需要ASP (Active Server Pages)技术或MS SQL Server数据库应用的一般需要Windows。我一直用的都是Win7系统,直接用系统盘安装的,按照提示操作,很轻松地就安装好了。Win7有五个设计重点:1)针对笔记本电脑的特有设计;2)基于应用的设计;3)用户的个性化;4)视听娱乐的优化;5)用户易用性的新引擎。使用了这么长时间的Win7系统,最大的感觉是界面非常的清晰漂亮,虽说兼容性没有XP好,但我还是相对的喜欢它。可以说Windows具有一个全新的、时髦的用户界面外观和许多的新功能,但是它仍然保留Windows的感觉。归纳

Win7的特点如下:1更易用(如快速最大化,窗口半屏显示,跳跃刘表······);2更快速,更简单,更安全;3更好的成本,更好的链接;4迄今为止最华丽但节能的Windows,拥有绚丽透明的窗口(窗口的界面十分美观,支持更多、更丰富的缩略图动画效果。);5支持非微软的音频格式,网络音乐、蓝牙音频;6拥有多功能任务栏,丰富的桌面小工具。Win7的缺点:兼容性不好,要求配置高,有些机器运行不了······Windows性能优越,操作简单,对硬件的需求合理,界面简洁,大部分的应用程序都是兼容的,价格适中,受到很多个人用户的青睐,发展趋势很好。 2、Linux操作系统 Linux的兴起可以说是interne创造的一个奇迹。这是一个稳定可靠、功能完善、安全的操作系统。我是在网上下载了一个ubunto 解压后安装就成功了,操作十分简单,就像是安装一个软件那么容易。也许是习惯了使用Windows的系统,初次使用Linux时感觉好奇怪,使用很不方便,原先安装在Windows上的应用软件都使用不了,打开完全就是二进制的代码,只能从先下载一些应用软件。该系统具有六大特性:启动速度极快,拥有社交网站和IM工具在系统中,整合了网络通讯录、邮件功能、在线音乐商店、云存储,其邮件客户端Evolution可以从MS Exchange Server上直接收取邮件。系统采用五个桌面分区,使得用户可以同时处理更多的任务,使得任务更加有序与增强用户使用的方便性。Linux系统的安全性高,在使用过程中

UNIX和Linux操作系统概述

第1章UNIX和Linux操作系统概述 练习题和解答 1.在UNIX大家族的以下分支中,哪两个分支对成就UNIX的辉煌起到了至关重要的作用? A.MIT B.GNU C.BSD D.POSIT E.BESYS F.System V 【解答】这一题是测试你对UNIX的简要发展史以及对UNIX发展影响巨大的两个分支的熟悉程度。根据本章1.2节有关UNIX的简要发展史的介绍——对UNIX操作系统的发展贡献最大的是它的两个分支——加州大学Berkeley分校的BSD和AT&T公司的System V,可以断定答案C和F是正确的。 答案:C和F 2.为什么Linux操作系统总是在一个被称为Linux Standard Base(LSB)的通用标准下开发和颁布? A.防止互用性(interoperability) B.防止服从POSIX标准 C.确保应用一级的多样性 D.确保不同发布之间的兼容性 【解答】这一题是测试你对UNIX和Linux设计思想和实现的理解程度。虽然在本章中并没有直接讨论过本题的答案,但是根据本章1.2节~1.6节的介绍我们可以断定只有答案D是正确的,因为其他几个答案都与UNIX和Linux设计理念相违背。 这里需要解释的是POSIX是IEEE标准,其全名是Portable Open Systems Interface(可移植开放系统接口/界面)。 答案:D 补充练习题和解答 3.UNIX被称为有史以来最稳定的操作系统,请问在以下所列的原则中有哪两个对这种稳定性起到了比较大的作用?

A.容易修改终端用户程序 B.所有程序的配置数据都以二进制文件存储 C.整个策略的决策都是由内核做出的 D.UNIX操作系统中的每一件东西或者是一个文件或者是一个进程【解答】这一题是测试你对UNIX设计理念的理解程度。根据本章1.3节有关UNIX 设计理念的解释——所有的操作系统配置数据都存储在正文文件中,可以断定答案B是错误的。 根据本章1.3节有关UNIX设计原则的介绍——“每一个操作系统命令或应用程序都很小,而且只完成单一的功能。UNIX操作系统提供了许多小的应用程序,每个应用程序都能够很好地执行单一的功能。当需要一个新功能时,UNIX的通用原则是为此创建一个单独的程序而不是扩展一个已经存在的应用程序的功能。”,可以断定答案C是错误的。 利用排除法可以断定,答案A和D是正确的。 答案:A和D 4.由自由软件基金会(Free Software Foundation,FSF)发起的GNU项目的目标就是创建一个自由的UNIX克隆。根据你的理解,以下哪个陈述适用于FSF的“自由”这一术语? A.在获得软件的同时源代码将免费提供 B.软件是全部免费的而仅仅收取修复软件故障的费用 C.软件是以可运行(可安装)形式免费自由分发的 D.软件是自由分发的但是并没有提供再分发这个软件的自由 【解答】这一题是测试你对GNU项目与自由软件的熟悉程度。根据本章1.4节有关GNU项目与自由软件的介绍——“你有修改该程序满足自己需求的自由(为使该自由实际上可实施,你必须可接触源代码,因为没有源代码的情况下,在一个程序中做修改是非常困难的)。”,可以断定答案A是正确的。 根据本章1.4节有关GNU项目与自由软件的介绍——“自由软件(Free Software)这一术语有时被错误地理解,其实它与价格无关。”,所以答案B和C肯定是错误的。 根据本章1.4节有关GNU项目与自由软件的介绍——“你有权利发布该程序修改过的版本,从而让其他人得益于你的改进。”,可以断定答案D是错误的。 答案:A 5.多用户可以共享一个UNIX计算机,这使得利用一个用户的空闲时间来服务其他用户成为可能。操作系统的这一特性被称为什么? A.数据共享 B.时间共享 C.一次性初始化 D.轻量级的内核线程

UNIX操作系统常用命令使用方法

UNIX系统及BSJ2200系统培训 第一章SUN系统介绍 第一节SUN的发展史 (一)硬件体系 81--89 Sun1/2/3 CISC Motrala 680x0系列 89--94 Sun4/60 sparc1 Risc sparc 65 sparc1+ 70 sparc2 Server : Sun/290/670/690 93--96 Sparc10/20 SuperSparc Server : 1000/2000 96--97 Ultra1(140/170/170E/200E) UltraSparc SBUS体系结构,UPA接口 Ultra2 Server : E150,E3000 98--99 Ultra5 ,Ultra10 PCI体系结构(IDE外设) Ultra30,Ultra60 Server : E250,E450,E3500 2000-至今BLADE 150/2000/2500 (二)软件体系 Solaris 1.x SunOS 4.1.3+OpenWindow 1.x BSD Solaris 2.x System V 32bit 2.5.1 SunOS 5.5.1 +OpenWindows 2.6 SunOS5.6+CDE1.2 Solaris 2.7(7) 64 bit Solaris 2.8(8) for sparc平台/intel x86平台 Solaris 2.9(9) for sparc平台/intel x86平台 第二节SUN系统的安装 以SUN Ultra5(9.1G)硬盘Solaris2.7为例,步骤如下: 1、在OK提示下输入:boot cdrom 2、出现“Select Language and local”时,选择“Continue”按钮。 3、出现“The Solaris installation program”时,选择“Continue”按钮。 4、出现“Identify this system”时,选择“Continue”按钮。 5、出现“Hostname”时,先输入机器名后,再选择“continue”按钮。 6、出现“Network connectively”时,先选择“Yes”,再选择“Continue”。 7、出现“IP Address”时,输入IP后,选择“Continue”。 8、出现“Confirm Infirmation”时,选择“Continue”。 9、出现“Name service”时,先选择“None”后,再选择“Continue”。 10、出现“Confirm Infirmation”时,选择“Continue”。 11、出现“Subnets”时,先输入“NO”,再输入“Continue”。 12、出现“Time Zone Geographic region”时,输入“Set”。 13、出现“Geographic region”时,选“Asia Eastern HongKong”。

从硬盘安装Linux操作系统的方法步骤(精)

从硬盘安装Linux操作系统的方法步骤来源: ChinaUnix博客日期:2007.04.22 18:30(共有0条评论我要评论从硬盘安装Linux操作系统,首先要准备安装包,Linux操作系统的安装包通常是一个或多个ISO镜像文件(一般通过网络下载就可以得到;其次,要通过某种手段启动镜像文件中的系统安装程序;接下来,按照安装程序的提示信息进行安装就可以了。安装过程中,需要指定Linux操作系统的安装位置,这主要涉及硬盘分区的一些知识。综合来看,学习Linux操作系统的安装,关键要学会两点:第一、如何为Linux操作系统准备硬盘空间?第二、如何启动ISO镜像文件中的安装程序。硬盘分区通常,在使用硬盘时,都要进行分区。如果把未分区的硬盘比做一张大白纸,那么分区后的硬盘就相当于这张大白纸被画上了几个大方框。一块硬盘被分成多个分区之后,各分区之间是相对独立的,每个分区都可以有自己的文件格式,例如 FAT16、FAT32、NTFS等等。Linux 操作系统需要的硬盘分区要安装一个操作系统,一般来讲都要为它准备专门的分区。专门,意味着不能与其他操作系统合用一个分区,也意味着不要与用户自己的数据文件合用一个分区,前者是因为不同的操作系统可能需要不同格式的磁盘分区,后者则更多地出于用户数据安全和系统维护方便的考虑。从最低配置角度讲,Linux 操作系统需要一个EXT2或EXT3格式的硬盘分区作为根分区,大小在2~5G就可以。另外还需要一个SWAP 格式的交换分区,大小与内存有关:如果内存在256M以下,交换分区的大小应该是内存的两倍;如果内存在256M以上,交换分区的大小等于内存大小即可。Linux 硬盘分区管理工具在安装Linux 操作系统时,如果选择了手工的分区方式,将启动硬盘分区工具Disk Druid。这个程序是安装程序自带的。下面讨论一下该软件的使用。Linux下硬盘分区的标识在Linux 下用hda、hdb 等来标识不同的硬盘;用hda1、hda2、hda5、hda6 来标识不同的分区。其中,字母a 代表第一块硬盘,b代表第二块硬盘,依次类推。而数字1 代表一块硬盘的第一个分区、2 代表第二个分区,依次类推。1到4 对应的是主分区(Primary Partition)或扩展分区(Extension Partition。从5开始,对应的都是硬盘的逻辑分区(Logical Partition)。一块硬盘即使只有一个主分区,逻辑分区也是从5开始编号的,这点应特别注意。系统上有一块硬盘,名字为/dev/hda,它上面有一个NTFS 格式的主分区hda1 以及

windows操作系统与Unix操作系统的优缺点

windows操作系统与Unix操作系统的优缺点 windows: 优点:图形界面良好,拥有良好的集成开发环境,操作简单。 缺点:不是免费的软件,采用二进制代码,不易修改操作系统本身。漏洞比较多。和linux和unix系统相比,网络功能相对较差,源码不开放。不利于操作系统的开发。 UNIX 优点:UNIX 如此的成功,这大大超出了它的创造者最初的设想。UNIX 成功的一个主要原因是它最初的发行发式。由于法令(consent decree)的限制,AT&T 不得不以极少的费用出售UNIX许可证和源代码。世界各地的人们都可以索取和运行该系统。由于附带源代码,用户可以分析它,更改它,告诉其他人自己所做的修改。然后AT&T 再将开多修改加入到新发行中。 在伯克利的工作更带动了这一趋势。总而言之,UNIX 在一种极为开放的过程〔或者说没有过程〕中不断发展。各国、各大洲的学术界、厂商、以及疯狂的黑客们都为UNIX 的发展做出了贡献。既便在UNIX 商业化之后.许多厂商也认识到开放系统的价值,将它们的成果公布于众,制定了许多像NFS 这样的开放规范。 最初的UNIX 设计非常精湛,井为后来版本和分支奠定了成功的基础。它的一个最大的长处就是始终贯彻“越小越完美”的思想[ Allm 87],用一个小的内核提供一组必要功能的最小集。系统有许多小的实用工具完成简单的数据处理。用户可以通过管道机制以及可编程的shell 等工具将这些实用工具以各种方式组合起来,形成功能更强大的工具。 UNIX 的文件系统是这种小巧,简单方式的一个典型代表。与当时使用诸如索引顺序访问方式(ISAM),层次顺序访问方式(HSAM)等复杂文件访问方式的操作系统不同,UNIX 将文件看成是一个字节流。应用它可以在文件上建立任何数据结构,实用自己的访问方式访问文件,不需要文件系统的干预。 大多数系统应用都使用文本数据。例如,比较重要的系统数据库/etc/passwd , /etc/fstab,以及/etc/ttys 都是普通的文本文件。尽管使用二进制的有结构的方法组织信 息会更有效,使用一般的文本可以让用户不必使用特殊的工具就可以访问和处理这些文件。文本是一件友好的,通用的,高度可移植的数据形式,可以用许多实用工具进行处理。 UNIX 另一个很突出的特点就是它简单而统一的I/O 设备接口。UNIX 将所有的设备都用文件表示,用户可以使用与处理文件相同的命令和系统调用集访问设备。开发者写程序完成I/O操作时不必考虑这个操作是对文件的,还是对用户终端,打印机,或其他设备进行的。这一特性与shell 中的I/O 重定向一起提供了一个简单而强大的I/O 接口。 促使UNIX 成功和流行的一个关键因素是它的可移植性。内核的大部分都是用C 语言写的。这就使其在移植到新机器时相对容易了许多。它先是用于 PDP-11,后来移植到 V AX-11 及其他许多机器、许多厂商都是开发出自己的新机器,然后简单将 UNIX 移植到它的上面,而不必重写一个新的操作系统。 缺点: 事物总有相反的两个方面。在赞誉UNIX 优点的同时,也不能忽略了它的缺点。对UNIX 进行如此客观回顾的人中就有这样一个人,他不是别人,正是DennisRitchie 本人。在1987 年 1 月 USENIX 会议中的一次 UNIX 回顾会晤中,RitChie 分析了许多 UNIX 的缺点[ Ritc87] 。下面我们对其进行简述。 尽管UNIX 最初是一个简单的系统。它已不再是这样了。例如,AT&T 为了高效地对数据进行缓冲和将程序移植到非UNIX 系统上,为UNIX 系统增加了标准1/O 库。这个库相对其

unix操作系统

Unix操作系统浅析 摘要:本文较详细的介绍了什么是UNIX操作系统,以及UNIX操作系统的发展历史,UNIX系统的基本结构,UNIX操作系统的优势,UNIX操作系统和LINUX操作系统的区别和联系。 关键字:UNIX,LINUX 一、引言 UNIX ,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统。UNIX操作系统最早由Ken Thompson、D ennis Ritchie和Douglas McIlroy于1969年在AT&T的贝尔实验室开发。经过长期的发展和完善,目前已成长为一种主流的操作系统技术和基于这种技术的产品大家族。由于UNIX具有技术成熟、结构简练、可靠性高、可移植性好、可操作性强、网络和数据库功能强、伸缩性突出和开放性好等特色,可满足各行各业的实际需要,特别能满足企业重要业务的需要,已经成为主要的工作站平台和重要的企业操作平台。它主要安装在巨型计算机、大型机上作为网络操作系统使用,也可用于个人计算机和嵌入式系统。曾经是服务器操作系统的首选,占据最大市场份额,但最近在跟WINDOWS SERVER以及Linux的竞争中有所失利。 二、UNIX历史 初创期Unix的诞生和Multics(Multiplexed Information and Computi ng System)是有一定渊源的。Multics是由麻省理工学院,AT&T贝尔实验室和通用电气合作进行的操作系统项目,被设计运行在GE-645大型主机上,但是由于整个目标过于庞大,糅合了太多的特性,Multics虽然发布了一些产品,但是性能都很低,最终以失败而告终。AT&T最终撤出了投入Multics项目的资源,其中一个开发者,Ken Thompson则继续为GE-645开发软件,并最终编写了一个太空旅行游戏。经过实际运行后,他发现游戏速度很慢而且耗费昂贵——每次运行会花费75美元。在Dennis Ritchie的帮助下,Thompson用PDP-7的汇编语言重写了这个游戏,并使其在DEC PDP-7上运行起来。这次经历加上Multics 项目的经验,促使Thompson开始了一个DEC PDP-7上的新操作系统项目。Thom pson和Ritchie领导一组开发者,开发了一个新的多任务操作系统。这个系统包括命令解释器和一些实用程序,这个项目被称为UNICS(Uniplexed Informat ion and Computing System),因为它可以支持同时的多用户操作。后来这个名字被改为UNIX。发展期最初的Unix是用汇编语言编写的,一些应用是由叫做B语言的解释型语言和汇编语言混合编写的。B语言在进行系统编程时不够强大,所以Thompson和Ritchie对其进行了改造,并与1971年共同发明了C语言。1973 年Thompson和Ritchie用C语言重写了Unix。在当时,为了实现最高效

第一章:UNIX操作系统简介

第一章:UNIX操作系统简介 学习目标 学完这一章,你能做到以下事情: 描述UNIX系统的基本组成和基本功能 1.1 什么是操作系统? 操作系统是一种特殊的用于控制计算机(硬件)的程序(软件)。 操作系统在资源使用者和资源之间充当中间人的角色。为众多的消耗者协调分配有限的系统资源。系统资源包括,CPU,内存,磁盘,和打印机。举个例子,一个用户(也可以是程序)将一个文件存盘,操作系统就会开始工作:管理磁盘空间的分配,将要保存的信息由内存写到磁盘等。 当用户要运行一个程序时,操作系统必须先将程序载入内存,当程序执行时,操作系统会让程序使用CPU。在一个分时系统中,通常会有多个程序在同一时刻试图使用CPU。 操作系统控制应用程序有序地使用CPU ,就好象一个交通警察在一个复杂的十字路口指挥交通。十字路口就象是CPU;每一条在路口交汇的支路好比一个程序,在同一时间,只有一条路的车可以通过这个路口,而交通警察的作用就是指挥让哪一条路的车通过路口,直到让所有路口的车辆都能通过路口。 UNIX操作系统的历史 UNIX操作系统1969年在贝尔实验室诞生。Ken Thompson在Rudd Canaday, ,Doug Mcllroy,Joe Ossana,and Dennis Ritchie,的协助下,写出一个小的分时系统,开始得到关注,在许诺为实验室的管理人员提供一个文档准备工具后,UNIX先驱们可以使用到一台更大的计算机,从而得以继续他们的开发工作。 在七十年代的中期,一些大学得到使用UNIX的许可,并很快在学院之间得到广泛流行,其主要的原因是: 小巧:最早的UNIX系统只占用512K字节的磁盘空间,其中系统内核使用16K,用户程序使用8K,文件使用64K。 灵活:源代码是可利用的,UNIX是用高级语言写成,提高了操作系统的可移植性。 便宜:大学能以一盘磁带的价格得到一个UNIX系统的使用许可。早期的UNIX系统提供了强大的性能,使其能在许多昂贵的计算机上运行。 以上优点在当时掩盖了系统的不足: 没有技术支持:AT&T在当时大部分的资源和都用在MUTICS上,没有兴趣 开发UNIX系统。 Bug的修补:由于没有技术支持,bug的修补也得不到保证。 很少的,或者根本没有说明文档:用户有问题经常只能是去看源代码。 当UNIX传播到位于California的Berkeley大学的时候,Berkeley大学的使用者们创建了自己的UNIX版本,在得到国防部得支持后,他们开发出了许多新的特性。但是,作为一个研究机构,Berkeley大学提供的版本和A T&T的版本一样,也没有技术支持。 当A T&T意识到这种操作系统的潜力后就开始将UNIX商业化,为了加强产品性能,他们在AT&T的不同部门进行UNIX系统开发,并且开始在系统中结合Berkeley开发出的成果。UNIX最终的成功可以归结为: 一个灵活的、包含多种工具的用户界面与操作环境。 模块化的系统设计可以很容易地加入新的工具。 支持多进程,多用户并发的能力。

Linux操作系统发展及其特点概述

Linux操作系统发展及其特点概述 Unix操作系统的诞生 Linux 操作系统是UNIX 操作系统的一个克隆版本。UNIX 操作系统是美国贝尔实验室的Ken.Thompson和Dennis Ritchie于1969年夏在DEC PDP-7 小型计算机上开发的一个分时操作系统。当时Ken Thompson 为了能在闲置不用的PDP-7 计算机上运行他非常喜欢的星际旅行(Space travel)游戏,在1969 年夏天乘他夫人回家乡加利福尼亚渡假期间,在一个月内开发出了Unix 操作系统的原型。当时使用的是BCPL 语言(基本组合编程语言),后经Dennis Ritchie 于1972 年用移植性很强的C 语言进行了改写,使得UNIX 系统在大专院校得到了推广。 Linux 操作系统的诞生与发展 Linux 是芬兰赫尔辛基大学高才生Linus Benedict Torvalds在1991年4月编写出来的。Linux内核的创建是由芬兰赫尔辛基的Linus Torvalds个人努力完成的。1991年底,Linus Torvalds首次在Internet上发布T基于Intel386体系结构Linux源代码,许多大专院校的学生和科研机构的研究人员纷纷把它作为学习和研究的对象。他们不断改进Linux版本,不断地为Linux增加新的功能Linux逐渐成为一个基本稳定、可靠、功能比较完善的操作系统,由于Linux操作系统从产生直至现在的发展一直在Internet这个摇篮中,伴随着网络概念的不断膨胀,“网络一代”的迅速崛起,它急速地发展着。 Linux诞生后的几个月里,Torvalds在不断地听取试用者的反馈的同时,仍然潜心于不断地改进程序,使其功能更强大、性能更稳定。到了1991年底,已经陆续推出了0.02版、0.03版、0.1版、0.11版。也许由于Torvalds从小深受其祖父(一名统计学教授,Torvalds少年时代学习的电脑启蒙者)和信仰共产主义的父亲的影响,加上本身淡泊金钱的个性,所以尽管当时Torvalds已欠了大约五千美元的学生货款,但在开始发布源代码时,他就制定了这样的版权规则: (1)任何人可以免费使用该操作系统,但不得将其作为商品出售; (2)任何人可以对该操作系统进行修改,但必须将其修改以源代码的形式公开;(3)如果不同意以上规定,任何人无权对其进行复制或从事任何行为。 软件按其分发方式可以划分为三种模式,即商业软件(Commercial Software)、共享软件(Share Software)和自由软件(Free Software)。商业软件的代表是美国微软公司(Microsoft)的Windows操作系统,用户必须先购买商业软件许可证才能使用软件,并且不能得到软件的源代码,也不能对软件进行任何逆向工程以得到源代码,即使软件存在缺陷用户也无权对软件进行任何修改或改进,否则将被认为侵犯版权。共享软件在分发时,用户可以先试用后付费,通常不提供软件源代码,如果超过试用期没有购买而仍使用,将被认为侵犯版权,目前许多通过网络分发销售的软件都采用这种方式,著名的软件有代理服务器软件WinGate。 自由软件在分发时必须向用户公开源代码,通常用户可以通过某种途径(如网络下载)免费得到其分发版,但用户如果付费的话将得到完善的服务和文档。自由软件的出现给人们带来很多的好处。首先,免费的软件可给用户节省相当一笔费用。其次,源代码公开和可自由修改吸引了众多的开发者参与软件的查错与改

UnixLinux操作系统“课程教学大纲

Unix/Linux操作系统“课程教学大纲 32学时 2学分 一、课程的性质与目的 Linux作为一个日渐流行的多用户、多任务操作系统,有着开放、稳定、安全、费用低廉等许多其它操作系统无可比拟的优势,具有越来越广泛的应用前景。在网络技术迅速发展的今天,网络操作系统是网络中的核心技术,所以本课程是计算机科学与技术专业学生的一门必修专业课。 本课程的目的在于讲授Linux操作系统的基础和应用知识,使学生掌握Linux系统的安装、配置、管理维护、主要网络应用等技能,对Linux系统有一个全面的了解,奠定在Linux系统上作进一步开发的基础,以摆脱作为操作系统简单使用者的禁锢,为日后的发展铺平道路。 二、课程的基本要求 (一)基本知识要求: 1.了解Linux操作系统的历史、发展、现状、主要特性与用途; 2.理解网络操作系统的基本概念,理解用户管理、系统管理和网络系统管理基本概念; 3.理解文件系统作用与分类,理解文件与目录的基本概念,熟悉系统目录结构; 4.理解作业与进程概念及其区别,理解内核的概念,理解进程管理与作业控制的意义; 5.了解Shell、Shell的分类与Shell程序设计; 6.理解系统配置文件的作用; 7.理解系统的启动过程。 (二)能力要求: 1.熟练掌握Linux系统的启动、登入、登出和系统的关闭;

2.掌握Linux系统的安装、卸载与简单的故障修复; 3.熟练掌握文件和目录的移动、复制、删除和改名命令的使用; 4.熟练掌握文件和目录的属性操作,关键字查找(grep),和文件查找(find)的命令; 5.掌握创建文件系统、管理文件系统的方法和文件系统管理的常用命令; 6.熟练掌握Linux系统的网络配置,能够使用系统配置文件来配置、调试网络; 7.熟练掌握进程的启动、进程的查看和进程的调度命令; 8.熟悉一种Shell,掌握简单的Shell编程方法; 9. 会使用Linux 的系统控制命令、网络操作命令; 10.掌握Linux软件的安装方法、了解日志系统; 11. 掌握www、ftp、samba、nfs、等服务器的简单配置,熟悉基本管理命令和方法。 三、课程的主要内容 第一部分用户基础 第一章Linux操作系统简介 Linux发展史、Linux吉祥物、Linux一词的发音、发展现状与前景、Linux 的主要特点、Linux主要应用、主要发行版本。 第二章Linux系统的安装与基本配置 系统安装注意事项、系统安装过程、系统引导方法、使用VMWare虚拟机。 第三章Linux系统基本操作 系统的进入与退出、X Window的启动与退出、帮助信息的获取。 第四章X Window的配置与使用 X Window系统概述、X Window的配置、窗口管理器的选择。

操作系统unix

UNIX 选择 B42X0001 在UNIX中,可用ls命令察看文件属性,一个文件file1的属性为"RW_R_ _ R _ _", 如果对文件赋予本用户读写执行权限,组内用户和其它用户读写权限,则使用( b )命令。 A、chmod g+rw , o+r file1 B、chmod 755 file1 C、chmod g+rwx file1 D、chmod 775 file1 B42X0002 UNIX中要察看icd用户的信息,可用的命令是:( ) A、ping icd B、finger icd C、write icd D、mesg icd B42X0003 SCO UNIXWARE1系统管理工具软件是: ( c ) A、admin B、scoadmin C、smit D、scoadmsh B42X0004 将cd-rom mount成一个文件系统的命令是: (b ) A、mount -F HS -ro /dev/cd0 /cdrom B、mount -f NFS -ro /dev/cd0 /cdrom C、mount -r /dev/cd0 /cdrom D、mount -f /dev/cd0 /cdrom B42X0005 在定位UNIX系统硬件故障时,可通过查询( b )文件来了解系统硬件信息。 A、/etc/system B、/var/adm/messages C、/etc/default D、/var/system B42X0006 允许超级用户root以telnet方式注册,修改配置文件如下( a ) A、/etc/hosts B、/etc/netmasks C、/etc/default/login D、/home/stp/.cshrc B42X0007 关于UNIX进程,下列描述错误的是:(d ) A、 sleep 5:创建一个sleep进程、不做任何动作,延时下一个进程的启动时间5秒 B、 ps -ef :显示正在运行的所有进程。 C、 kill -9 444:杀死进程号为 444 的进程

操作系统安装与重装

第1章 系统安装与重装的准备工作 1.2 安装于重装操作系统的常规流程 分区和格式化硬盘→设置BIOS→安装操作系统→安装驱动程序→安装应用软件 制作系统启动盘→备份重要数据→重装操作系统→安装驱动程序与软件→恢复数据 1.3选择适合的操作系统及安装方式 1.3.1 常用操作系统简介 1 Window操作系统 Windows操作系统采用图形化操作界面,具有良好的网络和多媒体功能,支持多用户多任务,支持多种硬件设备没事目前使用最为广泛的操作系统之一。 Windows操作系统是由美国Microsoft公司开发的,具有多个版本。Windows 98:在Windows95基础上开发的,它将当时最新的多媒体奇数、网络技术和Internet奇数结合在一起,具有良好的兼容性。Windows 2000:是一个纯32位的操作系统,它集成了Windows9X的优点,并进行了很多改进,比Windows9X系列具有更好的安全女性和稳定性。 Windows XP:是目前的主流操作系统,该系统结合了以前所有Windows 系列操作系统的优点,将华丽的界面、强大的多媒体功能以及网络应用结合在一起,带给用户全新的感官享受。 Windows Server 2003:服务器操作系统,它在外观上与Windows 2000区别不大。不过主要就是面向服务器。 Windows Vista:2006年11月推出,具有更好的安全性。但对电脑硬件的配置要求比较高,如果配置较低,运行起来非常缓慢甚至根本无法安装。 2 其他操作系统 UNIX:具有较强的稳定性和可靠性,常用于提供各种Internet服务的电

脑。目前运行在个人电脑上的UNIX类操作系统大多为BSD UNIS,Solaris x86和SCO UNIX等。 Linux:是一种可以免费使用的自由传播的操作系统,是一个多用户、多任务、支持多线程和多CPU的网络操作系统,性能相当稳定。Linux有很多版本,较流行的有Red Hat Linux,Debian Linux和Red Flag Linux等,目前在手机等移动通信设备中应用较多。 Mac OS:专门用于Apple公司品牌机的操作系统,它具有独特的奇数原理且操作简单,将UNIX的高度可靠性和Apple电脑的易用性结合到了一起。而且Mac OS开放源代码,高级用户可根据需要定制个性化的系统。 BeOS:是一种个人电脑操作系统,其开发者称BeOS是为未来多媒体应用程序而设计的。它的特点是不仅外观图形化,就连内核也图形化,它是真正意义上的图形化操作系统,并能与Windows及Mac OS操作系统并存。 1.3.2 选择操作系统的安装方式 全新安装:全新安装是指安装操作系统前,硬盘中未安装过任何操作系统,如在新买的硬盘上全新安装操作系统。如果硬盘中已安装过操作系统,在安装前先将系统盘格式化,然后再安装操作系统,此方式也称为全新安装。全新安装操作系统后,必须重新设置系统并安装所需的应用程序。 升级安装:升级安装是指将已经存在的操作系统从低版本升级到高版本。采用此安装方式升级系统后,可以直接使用原来的操作系统中安装的应用程序,而不必重新进行安装。 覆盖安装:覆盖安装是指在已经存在操作系统的情况下,将当前版本操作系统重新安装到相同位置的安装方式。覆盖安装会保留当前操作系统的设置和已安装的驱动程序与应用程序,只是将系统文件重新复制一次并替换原来的文件。这种安装方式可以修复一些系统错误,因此又称为修复安装。 1.4 基本BIOS设置 1.4.1 认识BIOS BIOS(Basic Input Output System)是电脑中基本输入/输出程序、系统信息设置程序、系统启动自检程序以及一些控制基本输入、输出设置的

Unix操作系统发展演化史树状图-超详细超大

UNICS september 1969UNIX Time-Sharing System First Edition (V1) november 3, 1971 UNIX Time-Sharing System Second Edition (V2) june 12, 1972 Open Systems february 27, 2011 UNIX Time-Sharing System Third Edition (V3) february 1973 1972 19691971 19701973

UNIX Time-Sharing System Fourth Edition (V4) november 1973 MERT 1974 1974 1976 1975 19741977

UNIX Time-Sharing System Seventh Edition Modified 1980 19781979Note 1 :an arrow indicates an inheritance like a compatibility, it is not only a matter of source code. Note 2 :this diagram shows complete systems and [micro]kernels like Mach, Linux, the Hurd... This is because sometimes kernel versions are more appropriate to see the evolution of the system.

Unix操作系统介绍

UNIX操作系统简介 UNIX发展过程 UNIX系统是美国麻省理工学院(MIT)在1965年开发的分时操作系统 Multics(Multiplexed Information and Computing Service System)的基础上不断演 变而来的,它原是MIT和贝尔实验室等为美国国防部研制的。贝尔实验室的系统程序设计人员汤普逊(Thompson)和里奇(Ritchie)于1969年在 PDP—7计算机上成功地开发了16位微机操作系统。该系统继承了 Multics系统的树形结构、Shel1命令语言和面向过程的结构化设计方法,以及采用高级语言编写操作系统等特点,同时,又摈弃了它的许多不足之处。为了表示它与 Multics 既继承又 背叛的关系,该系统命名为UNIX,UNIX中的 UNI正好与 Multi相对照,表示UNIX系统不像 Multics系统那样庞大和复杂,而 X则是 cs的谐音。 由于当时美国政府禁止AT&T经营计算机业务,所以在整个七十年代,UNIX 没能作为商品进入市场,而主要是提供给学校和科研机构等非赢利单位使用。 1972年, UNIX系统开始移植到 PDP-l l系列机上运行,在1979年,贝尔实验 室又将其移植到类似于 IBM370的32位机上运行,并公布了得到西部电气公司正式承认的 UNIX第七版。在1980年又公布了为 VAX-l l/780计算机编写的操作系统 UNIX32V。在此基础上,加里福尼亚大学伯克利分校同年发表了 VAX-l l型机用的 BSD4.0和 BSD4.1版本。1982年,贝尔实验室又相继公布了 UNIX systems III的3.0、4.0和5.0等版本。它们是对 UNIX32V的改进,但却不同于BSD4.0和 BSD4.1版本。从此, UNIX系统走上了以 AT&T和伯克利分校二者为主的开发道路。例如,1983年 AT&T推出了 UNIX systems V和几种微处理机上的 UNIX操作系统。而伯克利分校公布了 BSD4.2版本。在1986年,UNIX systems V又发展为它的改进版 Res2.1和Res3.0,而 BSD4.2又升级为BSD4.3。 在这种背景下,美国 IEEE组织成立了 POSIX委员会专门进行UNIX的标准化方面的工作。此外,在1988年以 AT&T和 Sun Micro system等公司为代表的UI(UNIX International)和以 DEC、 IBM等公司为代表的 OSF(Open Software Foundation)组织也开始了这种标准化工作。它们对 UNIX的开发工作虽不一样,但它们定义出了 UNIX的统一标准,即可以运行UNIX应用软件的操作系统就是 UNIX。从而统一UNIX系统的关键就变成是否能提供一个标准的用户界面,而不在于其系统内部是如何实现的了。 UNIX的特点 UNIX系统之所以得到如此广泛地应用,是与其特点分不开的。其主要特点表现在:

操作系统UNIX系统及答案

UNIX系统练习题 (一)单项选择题 1.由于UNIX与系统的绝大部分程序都用c语言写成,所以它具有( )的特点。A有效简洁B.易移植c.可扩充D.开放性 2.使命令的执行结果不在屏幕上显示,而是写到另一个文件中去,这种功能称为A.脱机输出B.管道c联机输出D.输出重定向 3.能把第一条命令的输出作为第二条命令的输入的功能是由( )机制实现的。A链接B.批处理c.管道D.输出重定向 4.由父进程执行系统调用fork创建一个子进程,这个子进程的初始状态为( )。A.创建状态B.睡眠状态c.就绪状态D.僵死状态 5.UNIX System v系统中,存储管理主要采用( )。A.对换技术B.页式虚拟存储c段式存储管理D段页式虚拟存储 6.UNIX系统中在磁盘上开辟对换区作为内存的逻辑扩充,在管理对换空间时采用了( )。A.空闲区表B.位示图c.块表D.映射图 7.特别文件是指与( )有关的文件。A.文本B.图像c.外围设备D二进制代码 8 UNIX对磁盘中索引节点区进行管理时,把索引节点区空闲块的块号放至( )。A.引导块B.超级块c.索引节点区D.文件存储区 9 UNIX系统中把设备也当作文件看待,所有设备文件都放在( )目录中。A./bin B./lib C./dev d./usr 10.在块设备管理时,由( )为设备驱动程序提供信息. A空闲缓冲区队列B.设备缓冲区队列c.设备开关表D.设备I/O请求队列 (二)填空题

1.UNIX是一个交互式的______操作系统,采用以全局变量为中心的______结构。2.UNIX 的系统结构可分成______和______两部分。3.内核层是UNIX系统的核心,它实现存储管理、______ 、设备管理和______等功能,并为外壳层提供系统调用。4 外壳层由______、高级语言的编译和解释程序、______和系统库组成。5.UNIX系统提供两种程序运行环境,即______和______。6.在UNIX系统中______在核心态运行。______在用户态运行。7.UNIX系统具有短小精悍、简洁有效、______可扩充和______等特点。8.UNIX的______就是其内核提供的系统调用,它是内核为外壳的______提供的服务界面。9.______是用户程序请求操作系统为其服务的唯一形式。UNIX规定用户程序用______请求系统服务。10.UNIX的系统调用大致可分为三类:______、______和信号与时间类。11.调用______可给原来的文件再起一个新名字,若再调用______可取消这个新文件名。12.一个进程用______创建一个新进程,原进程称为父进程,新进程称为子进程。13______是用户与UNIX 的接口.它为用户使用系统提供了方便。14.用户要进入UNIX时必须登录,用户可在______提示下键入自己的登录名,并在Password:提示下______。15.用户要退出UNIX时,必须注销,常用______命令,或______。16.UNIX中的shell有两层含义,一是指由shell 命令组成的______,二是指该命令语言的______。17.使用RMDIR可以删除一个目录,这个目录必须是一个______。18.用r m删除一个文件时,实际上仅仅是删除了文件的 ______,如果该文件有其他链接,则文件______。19.若要把file1文件的拼法检查工作转后台执行,可键入______。20.UNIX系统中,把从终端上读入信息称为______,把信息写到终端上称为______ 21.UNIX有一种______功能,允许用户用文件代表标准输入输出设备.实现此功能时常使用“<”、“>”或“______”等特殊符号。22.UNIX系统提供了______机制来实现进程间的信息传递,它的一般形式是______ 23.若要以反排序的方式列出当前目录的文件清单并保存到文件fi1e-s中去,可键入______ 24.用shell命令语

湖南大学_UNIX操作系统课后习题答案

第1章 UNIX操作系统概述 1、什么是操作系统,列出你知道的操作系统? 2、操作系统的主要功能? 3、什么是UNIX? 4、UNIX版本的两大派系? 5、操作系统的哪一部分直接与硬件交互? 6、操作系统的哪一部分执行用户交换? A. Shell B. Kernel 7、UNIX平台上最用的编辑器是? 8、写出两种AIX的图形用户接口的名字? 9、AIX只支持硬盘上的文件系统。(T/F) 10、Shell有哪些功能、UNIX上有哪些常见的Shell? 第1章 UNIX操作系统概述 1、操作系统(Operating System,简称OS)是控制和管理计算机系统内各种硬软件的 平台,用户使用计算机的接口,为用户提供一个使用方便可扩展的工作环境。常见的操作系统:DOS、Windows、Unix、Linux、Mac OS X、Vxworks 2、操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的 集合。主要功能包括:文件管理、进程与处理机管理、设备管理、存储管理、网络管理等,由操作系统内核实现 3、分狭义和广义的概念 狭义的概念 ?UNIX仅指操作系统内核(Kernel) ?内核负责控制并管理计算机资源 ?多个用户可访问 ?负责进程的创建、控制、调度,为进程分配内存和外设 ?提供文件系统的管理功能 广义的概念

?UNIX不仅指系统内核,它是一个应用环境和程序设计环境,提供了丰富的软件开发工具,包括编辑器、编译程序、调试工具、数据库等等 ?为应用程序开发者开发的操作系统 ?提供硬件可移植性,设备独立的文件系统的操作系统 ?功能强大的多任务、多用户的操作系统 4、 1)贝尔实验室版本:第1-7版,System Ⅱ,Ⅲ,Ⅳ,Ⅴ UNIX System V Release 4.2 (SVR4.2)现今的AIX 、SCO UNIX等 2)加州大学伯克利分校计算机系统研究小组(CSRG)的BSD UNIX(Berkeley Software Distributions)较有影响的版本4.3BSD 现今的 FreeBSD、Solaris等工作站上的UNIX 一般属于这一派系 5、Kernel 6、A 7、VI 8、 AIXwindows Common Desktop Environment (CDE) 9、F,AIX支持磁盘文件系统,光盘文件系统,网络文件系统 mount –a mount /etc/filesystems 重启系统 分别装载每个文件系统 10、 SHELL的功能 执行用户命令、命令解释器、程序设计语言、进程控制、可定制、特性: 通配符,变量 常见的SHELL Bourne Shell:是贝尔实验室开发的 Bourne Shell:BASH:是GNU的Bourne Again Shell Bourne Shell:在大部分内容上与Bourne Shell兼容 Bourne Shell:在BSD系统上开发的,语法类似于C语言 第2章 UNIX基本操作命令 1、登录UNIX系统时会以*号显示用户输入的密码。(T/F) 2、退出UNIX系统有哪几种方法? 3、如何修改用户的登录密码? 4、UNIX命令的格式是什么? 5、用哪个快捷键可以中止一条命令的执行?

相关主题
文本预览
相关文档 最新文档