对于一个从C#转向Linux/unix系统开发的菜鸟,中间无数次的焦头烂额只有自己心理明白,所幸我没有在大风大浪中凋零破碎,依然坚挺着我的学习之路。
Unix操作系统结构:
UNIX ,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson、DennisRitchie和DouglasMcIlroy于1969年在AT&T的贝尔实验室开发。
严格意义上讲,可将操作系统定义为一种软件,可以直接控制硬件资源,提供程序运行环境,我们可以称之为内核。内核的接口可以称为系统调用,公用函数库建立在系统调用之上,应用软件既可以使用公用函数库也可以使用系统调用。shell是一种特殊的应用程序,它为运行其他应用程序提供接口。
广义上讲,操作系统也包括内核和其他的一些软件。
文件系统和目录
文件系统:
Unix文件系统是目录和文件组成的一种层次结构,目录的起点称为根(root) 使用./符号表示,目录(directory)是一个包含许多目录项的文件,逻辑上讲,可以认为i每一个目录都包含一个文件名,同时还包括文件的属性信息。文件的属性是指文件类型,文件大小,文件所有者,文件权限 以及文件最后修改时间。
文件名:目录中各个名字称为文件名,斜线和空操作符不能出现在文件名中,在创建新的目录时候,系统会自动创建2个文件名 .和..
路径名:一个或多个以斜线分割的文件名序列构成路径名,以斜线开头的称为绝对路径,否则称为相对路径
18 #include <dirent.h> 19 int main(int argc,char** argv) 20 { 21 DIR *dp; 22 struct dirent *dirp; 23 if(argc != 2) 24 { 25 err_quit("usage:is directory_name"); 26 } 27 if(dp = opendir(argv[1] == NULL) 28 err_sys("can`t open %s ",argv[1]); 29 while((dirp = readdir(dp))!= NULL) 30 printf("%s\n",dirp->d_namlen); 31 32 closedir(dp); 33 exit(0); 34 }
工作目录:
Unix下每一个进程都有一个工作目录,或者可以称为当前工作目录,所有的相对路径都是从工作目录开始的。
输入和输出
标准输入,标准输出和标准出错,所有的shell都会为每一个新运行的进程打开三个文件描述,大多数shell都提供一种方式,使其中任何一个或者三个,例如:ls -> file.list 执行命令后,标准输出重新定向到file.list中
不用缓存的IO
函数open,read,write,lseek以及close提供不用缓存的I/O,这些都使用文件描述
#define BUFFSIZE 4096 22 23 int main(void) 24 { 25 int n; 26 char buf[BUFFSIZE]; 27 while(n = read(STDOUT_FILENO,buf,BUFFSIZE) >0) 28 { 29 if(write(STDIN_FILENO,buf,n) != n) 30 { 31 err_sys("write err\n"); 32 } 33 if(n < 0) 34 { 35 err_sys("read_err\n"); 36 } 37 exit(0);
标准I/O
标准I/O函数体on个一种对不用缓冲的额函数的带缓冲的接口,使用标准I/O函数可以无需担心如何选取最佳的缓冲区大小,使用标准I/O函数的另外一个优点是简化了对输入行的处理,如Fgets函数读取完整的一行,而read函数读取指定的字节,标准I/O函数库提供了使我们能够控制该库所使用的缓冲风格函数。
18 #include <stdio.h> 19 int main(void) 20 { 21 int c; 22 while(c =getc(stdin) != EOF) 23 { 24 if(putc(c,stdout) == EOF) 25 err_sys("output error"); 26 if(ferror(stdin)) 27 err_sys("input error"); 28 eixt(0); 29 } 30 }
函数getc一次读取一个字符,然后函数putc将此字符标准输出