APUE-UNIX高级环境编程

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值