1.重写 ls 指令,用到了dirent.h 头文件,一个目录有关的头文件,可以用 man查看
有 2 个结构体 DIR 与 struct dirent,目录结构体与当前目录下文件/目录结构体
代码如下
#include <dirent.h>
#include <stdio.h>
typedef struct dirent dirct;
int
main(int argc,char *argv[])
{
DIR *pdir;
dirct *pfile;
char i;
if (argc <2)
{
printf("Usage zengls dir ...\n");
return 1;
}
for(i=1;i<argc;i++)
{
printf("This the list of %s\n",argv[i]);
if ((pdir= opendir(argv[i])) == NULL)
{ printf("can't open file %s",argv[i]);
continue;
}
while((pfile=readdir(pdir))!=NULL)
{
printf("%s\n",pfile->d_name);
}
close(pdir);
}
return 0;
}
2,输入输出初探
stdio.h中有一系列的IO操作函数。getc(),putc(),fgets(),fputs(),fscanf,fprintf等文件操作函数。scanf,printf,getchar,putchar,gets,puts等输入输出流控制,其本质是前者输入输出文件为stdin或stdout(定义在stdio.h内),其中getc是宏实现。
类似于linux中的IO操作函数read,write,open,lseek,close。其中若要读取输入输出用STDOUT_FILENO,STDIN_FILENO。
3. 进程的控制有三种 fork,exec(6种),waitpid。获取程序ID为getpid
4. 出错处理。error.h
函数出错返回errno变量。int型数字,利用strerror转换为字符串(返回指针),再利用perror将字符串与errorno的值输出到标准错误流上,格式为《字符串: (errorno转化的相应错误信息。》
如errorno=EACCES;perror();printf("%s",strerror);
可以利用perror将上一个函数产生的错误打出。如
p=open("xxx","w");if(p == NULL) perror("FILE");
5. 获取用户ID组ID getuid() getgid()。
6. 系统调用与库函数
系统调用是UNIX提供的访问内核的接口,标准库函数或非标准库函数一般是调用的系统调用来实现,当然也可以不调用系统调用。
比如时间。系统调用只提供一个返回距离1970年的秒,至于库函数如何调用他将其变为我们容易识别的显示,则由用户态来处理,内核态只返回此数值。
一个应用进程可以调用库函数,或者系统调用,而库函数则多会调用系统调用。
差别:系统调用一般提供的是内核的最小化接口,如sbrk,而库函数一般比较复杂的功能如malloc。
一般进程系统调用直接被应用程序直接使用。如fork exec wait。