Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35891
  • 博文数量: 17
  • 博客积分: 608
  • 博客等级: 中士
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-07 00:56
文章分类
文章存档

2012年(17)

我的朋友

分类: 虚拟化

2012-07-09 16:20:02


    
用户应用程序和内核之间的联系,一般是通过它和内核的中间层 —— 标准 C 库来实现,而标准 C 库函数本身,则是建立在内核提供的系统调用基础之上。通过标准 C 库,以及内核体系无关部分与体系相关部分的接口,用户应用程序和部分内核都成为可移植的。 内核通过系统调用来使得运行
在它上面的应用程序可用。

标准C库、系统调用都各有几百个函数。APO系统调用为10多个函数,虚拟汇编指令也是20多条。类库(math、转换、常用函数)也就几十条。尽管我想兼容C语言,但系统差别还是太大,最终,用户只能用A汇编语言来写应用程序了;好在,风格上差异不大。由于硬件CPU架构差别很大,我只能采用虚拟汇编指令(为与函数区分用红色标识)。虚拟汇编指令在APO架构里是单周期指令,支持千核并行,流模式,多媒体模式;以后会陆续介绍。

1、fopen(打开外部文件节点的系统调用),这只是初步规划,详情另文讨论。
相关函数:mov,fclose,link,unlink
表头文件:#include
定义函数:
BU16
fopen( BU16 pathname[],BU16 flags,BU16 mode ,BU32 argv[ ],BU32 envp[ ] );
函数说明:参数pathname指向欲打开的文件路径及文件名字符串。第4个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。 

等效LINUX系统调用或C库函数:

fopen(打开文件)
execl(执行文件)
execlp(从PATH环境变量中查找文件并执行)
execv(执行文件)
execve(执行文件)
execvp(执行文件)
freopen(打开文件)
opendir(打开目录)
setprotoent(打开网络协议的数据文件)
setservent(打开主机网络服务的数据文件)
system(执行shell
命令)
#define __NR_open             5  //
打开文件
#define __NR_execve           11 //
运行可执行文件
#define __NR_fork             2  //  创建一个新进程


2、fclose(关闭外部文件节点的系统调用)。
相关函数:mov,fopen,link,unlink
表头文件:#include
定义函数:BU16 close( BU16 jdfd );
函数说明:当使用完文件后若已不再需要则可使用fclose()关闭该文件,会让数据写回磁盘,并释放该文件所占用的资源。参数fd为先前由open()或creat()所返回的文件节点描述符。
返回值:若文件顺利关闭则返回0,发生错误时返回-1。
错误代码:EBADF 参数fd 非有效的文件描述词或该文件已关闭。
附加说明:虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。

等效LINUX系统调用或C库函数:

close(关闭文件)
fclose(关闭文件)
closedir(关闭目录)
pclose(关闭管道I/O)
shutdown(终止socket 通信)
endservent(结束网络服务数据的读取)

#define __NR_close      6  // 关闭文件描述字
#define __NR_exit       1  //  中止进程,退出。


3、creat(建立外部文件节点的系统调用)。
相关函数:mov,fopen,fopen, link,unlink
表头文件:#include
定义函数:BU16 creat( BU16 pathname[], BU16 newpath[], BU16 mode );
函数说明:参数pathname指向欲建立的文件路径字符串。creat()相当于使用下列的调用方式调用open():open(BU16 pathname[],(O_CREAT|O_WRONLY|O_TRUNC));
错误代码关于参数mode 请参考open()函数。
返回值:creat()会返回新的文件节点描述符,若有错误发生则会返回-1,并把错误代码设给errno。

等效LINUX系统调用或C库函数:
creat(建立文件)
mkstemp(建立唯一的临时文件)
mktemp(产生唯一的临时文件名)
vfork(建立一个新的进程)
link(建立文件连接)
symlink(建立文件符号连接)
mkfifo(建立具名管道)
pipe(建立管道)
connect(建立socket 连线)
popen(建立管道I/O)

#define __NR_fork       2  //  创建一个新进程

#define __NR_creat      8  // 创建新文件

#define __NR_mknod     14  // 创建索引节

#define __NR_link      9   // 创建链接

#define __NR_mount     21  // 安装文件系统

4、remove(删除外部文件节点的系统调用)。
相关函数:mov,fopen,fopen, creat, link,unlink
表头文件:#include
定义函数:BU16 remove ( BU16 pathname[] );
函数说明:remove()会删除参数pathname 指定的文件。
返回值: 成功则返回0,失败则返回-1,错误原因存于errno

等效LINUX系统调用或C库函数:

rmdir(删除目录)。
remove(删除文件)
unlink(删除文件)
#define __NR_umount        22 // 卸下文件系统
#define __NR_unlink        10 // 删除链接


待续。。。。

阅读(627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~