Unix的一些基础知识

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.不带缓冲的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 }

 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函数就可以自己改变信号的处理方式,他接收两个参数,第一个是具体的信号类型,第二个就是自己定义的函数名。

暂时就说这么多,上面说的都比较片面,以后会一一详细介绍。


原文地址:https://www.cnblogs.com/juncent/p/1992145.html