1.文件系统
U N I X 文件系统是目录和文件的一种层次安排,目录的起点称为根 ( r o o t ),其名字是一个字符 /。
目录( directory)是一个包含目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性是:文件类型,文件长度,文件所有者,文件的许可权(例如,其他用户能否能访问该文件),文件最后的修改时间等。 stat和fstat函数返回一个包含所有文件属性的信息结构。不能出现在文件名中的字符只有两个,斜线 (/)和空操作符( null)。
下面的程序是ls(1)的主要实现部分:
1 #include<sys/types.h>
2 #include<dirent.h>
3
4 int main(int argc,char **argv[])
5 {
6 DIR* dp;
7 struct dirent* dirp;
8
9 if(argc != 2)
10 {
11 printf("the directory is need!!");
12 exit(1);
13 }
14
15 if((dp = opendir(argv[1])) == null)
16 {
17 perror("can't open directory!");
18 exit(1);
19 }
20
21 while((dirp = readdir(dp)) != null)
22 printf("%s \n",dirp->d_name);
23
24 closedir(dp);
25
26 return 0;
27 }
2 #include<dirent.h>
3
4 int main(int argc,char **argv[])
5 {
6 DIR* dp;
7 struct dirent* dirp;
8
9 if(argc != 2)
10 {
11 printf("the directory is need!!");
12 exit(1);
13 }
14
15 if((dp = opendir(argv[1])) == null)
16 {
17 perror("can't open directory!");
18 exit(1);
19 }
20
21 while((dirp = readdir(dp)) != null)
22 printf("%s \n",dirp->d_name);
23
24 closedir(dp);
25
26 return 0;
27 }
2.不带缓冲的IO和带缓冲I/O
函数 open、read 、write、lseek以及close提供了不用缓存的I/O 。这些函数都用文件描述符进行工作,在之后我会详细介绍。相对的带缓冲的I/O就是fgetc,putc之类的,之后也会详细地介绍。
3.进程控制
有三种进行进程控制的函数,分别是fork,exec,waitpid(exec有六种变体,其实就是参数的不同),一般fork完之后子进程就会调用exec来运行新的程序,然后用waitpid来等待子进程结束并获取信息,也可以用来清理僵尸进程。如下程序演示了使用方法:
1 #include <sys/types.h>
2 #include <sys/wait.h>
3 int main(int argc,char **argv[])
4 {
5 char buf[MAXLINE];
6 pid_t pid;
7 int status;
8
9 printf("%%%");
10 while(fgets(buf,MAXLINE,stdin) != null)
11 {
12 buf[strlen(buf) - 1] = 0;
13 if((pid = fork()) < 0)
14 perror("fork error");
15 else if(pid == 0) //child
16 {
17 execlp(buf,buf,(char*)0);
18 perror("couldn't execute new program!");
19 exit(127);
20 }
21
22 if((pid = waitpid(pid,&status,0)) < 0)
23 perror("waitpid error!!");
24 printf("%%%");
25 }
26 return 0;
27 }
2 #include <sys/wait.h>
3 int main(int argc,char **argv[])
4 {
5 char buf[MAXLINE];
6 pid_t pid;
7 int status;
8
9 printf("%%%");
10 while(fgets(buf,MAXLINE,stdin) != null)
11 {
12 buf[strlen(buf) - 1] = 0;
13 if((pid = fork()) < 0)
14 perror("fork error");
15 else if(pid == 0) //child
16 {
17 execlp(buf,buf,(char*)0);
18 perror("couldn't execute new program!");
19 exit(127);
20 }
21
22 if((pid = waitpid(pid,&status,0)) < 0)
23 perror("waitpid error!!");
24 printf("%%%");
25 }
26 return 0;
27 }
4.出错处理
当UNIX函数出错时,往常返回一个负值,而且整型变量 errno通常设置为具有特定信息的一个值。例如,open函数如成功执行则返回一个非负文件描述符,如出错则返回- 1。在open出错时,有大约 15种不同的 errno值(文件不存在,许可权问题等 )。某些函数并不返回负值而是使用另一种约定。例如,返回一个指向对象的指针的大多数函数,在出错时,将返回一个null指针。 对于errno应当知道两条规则。第一条规则是:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。第二条是:任一函数都不会将errno值设置为 0,在<errno.h>中定义的所有常数都不为 0。
C标准定义了两个函数来打印出错信息: strerror(int errornum)(将errornum映射为一个出错信息字符串); perror(const char *msg);(在msg之后输出error对应的出错信息)
5.信号
信号是通知进程已经发生某种条件的技术。进程如何处理信号一般有3种:1忽略。2按照默认方式处理。3自己定义处理函数,利用signal函数就可以自己改变信号的处理方式,他接收两个参数,第一个是具体的信号类型,第二个就是自己定义的函数名。
暂时就说这么多,上面说的都比较片面,以后会一一详细介绍。