对于一个从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 409622 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将此字符标准输出