cp命令的编写——浅谈系统调用
来源:互联网 发布:站内优化和站外优化 编辑:程序博客网 时间:2024/05/22 18:35
摘要:linux中cp命令的实现,通过这个程序,我们需要了解系统调用耗费时间的方面,同时学会系统调用的错误处理机制。
本文来源:http://blog.csdn.net/trochiluses/article/details/11103523
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<fcntl.h>#define BUFFERSIZE 4096#define COPYMODE 644void oops(char *,char *);int main(int argc, char *argv[]){ int in_fd,out_fd,n_chars; char buf[BUFFERSIZE]; if((in_fd=open(argv[1],O_RDONLY))==-1) oops("can't open ",argv[1]); if ((out_fd=creat(argv[2],COPYMODE))==-1) { oops("cannot creat",argv[2]); } while((n_chars=read(in_fd,buf,BUFFERSIZE))>0) { if((write(out_fd,buf,n_chars))!=n_chars) { oops("write error to",argv[2]); } } if(n_chars==-1) oops("read err from",argv[1]); if(close(in_fd)==-1||close(out_fd)==-1) oops("fail to close",""); return 0;}void oops(char *s1,char *s2){ fprintf(stderr,"Error : %s",s1); perror(s2); exit(1);}
注意:
1)关于系统调用
read和write属于初级读写函数,也是系统调用;系统调用需要消耗大量时间。因为代码执行权会从用户转移到内核,执行内核代码是需要时间的。系统调用开销巨大,因为系统调用需要特殊的内存和堆栈环境,这些需要在系统调用之前建立好;系统调用之后又需要恢复这些环境。这种环境切换需要耗费大量时间。最好的方法就是建立缓冲区,一次读取大量数据,避免多次进行系统调用。我们可以用这个思想来改造前一篇中的who。
2)系统调用的错误处理
一般约定,系统调用open,write,lseek在出错时会返回值-1。另外,系统调用都有自己的错误集,以open为例,打开文件不存在,没有读的权限,打开文件太多等等。内核通过全局变量errno来确定错误类型,其中哦功能error.h中规定了一些错误的宏。
a。可以根据errno来分别进行错误处理:
#include<error.h>extern int errno;int sample(){ int fd; fd=open("file",O_RDONLY); if(fd==-1) { printf("can not open file:"); if(error== ENOENT) printf("there is no such file"); if (error==INTR) { printf("interrupted while opening file"); } ... }}
b.显示错误信息:
可以利用perror来通过error来寻找错误信息。
#include<error.h>extern int errno;int sample(){ int fd; fd=open("file",O_RDONLY); if(fd==-1) { perror("can not open file:"); }}
- cp命令的编写——浅谈系统调用
- 系统调用的文件编程实现cp命令
- Shell命令编写——复制命令cp
- 系统调用实现Linux命令 cp
- linux自己编写的 cp 命令
- 强悍的命令 —— cp
- 实现linux cp命令( 系统调用版 )
- 浅谈Linux下mv和cp命令的区别
- liunx命令——cp
- Liunux命令简介—cp
- cp命令基于LinuxC编写的可文件拷贝
- java 调用shell命令cp
- 用c语言程序实现系统的cp命令 在linux下调用syscalls.h头文件
- 一个简单的linux命令——cp
- Linux下如何使cp命令不提示覆盖文件:调用cp的时候加入绝对路径,即 /bin/cp
- Android系统上cp命令的替代方法
- Android系统上cp命令的替代方法
- cp 命令的用法
- koala
- POJ 3648 Wedding 2-SAT 输出任意一个2-sat解
- Fragments
- 八大排序
- Cmd中的环境变量
- cp命令的编写——浅谈系统调用
- 部分android程序错误处理
- 1509. Rails
- CRM上线之路 走上了CRM实施顾问-第30天上班 -第七周
- 结构体和类的区别
- VMware vSphere 5.5的12个更新亮点(1)
- 推荐一本编程进阶书籍- 重构:改善既有代码的设计
- 一个操作系统的实现(10):进程间通信
- C++解析lnk