MadPlay项目中设计的知识点

一、wait和waitpid区别:
1.在一个子进程终止前,wait使调用者阻塞
2.waitpid有一个选择项,可以使调用者不阻塞
3waitpid可以等待指定的一个子进程,wait等待所有的子进程,返回任意一个终止的子进程状态。
子进程在运行中有暂停信号,如果想要显示暂停信号的信号码不能使用wait()要用waitpid()

4、waitpid的返回值比wait稍微复杂一些,一共有3种情况:

(1) 当正常返回的时候,waitpid返回收集到的子进程的进程ID;

(2)如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

(3)如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

二、SIGNAL信号:子进程结束时, 父进程会收到这个信号。 

signal(参数一,参数二)

  • 参数一:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。
  • 参数二:我们处理的方式(是系统默认还是忽略还是捕获)。可以写一个handdle函数来处理我们捕获的信号。
  • SIGING:忽略信号

三、Linux下DIR,dirent,stat等结构体详解

1、DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息,

函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针 ,

而该指针由以下几个函数使用:

  1. struct dirent *readdir(DIR *dp);   
  2. void rewinddir(DIR *dp);   
  3. int closedir(DIR *dp);   
  4. long telldir(DIR *dp);    
  5. void seekdir(DIR *dp,long loc);  

2、dirent结构体

首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针 ,

从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

  1. {   
  2.   long d_ino; /* inode number 索引节点号 */  
  3.      
  4.     off_t d_off; /* offset to this dirent 在目录文件中的偏移 */  
  5.      
  6.     unsigned short d_reclen; /* length of this d_name 文件名长 */  
  7.      
  8.     unsigned char d_type; /* the type of d_name 文件类型 */  
  9.      
  10.     char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */  
  11. }  

3、获取某目录下(比如a目下)b文件的详细信息

首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。

接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。

然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

猜你喜欢

转载自blog.csdn.net/linuxwln/article/details/81147485