最近在别人的建议下开始写博客了,正好最近正在接触linux编程,就写下此文来记录以下自己的linux编程之旅,也希望能带给需要的人一点帮助。
为了能好好深入unix编程,我买了一本《unix环境高级编程》这本被业内人士高度赞誉的神书,现在看来感觉还是挺好的,可能还是因为自己的基础不怎么好,看有些地方还是
比较难理解,但自己就算硬着头皮也会把相关的知识搞懂的,先
给自己赞一个
。
可能大多数人开始接触linux编程都是先从文件操作开始吧,那我就用一个自己实现的复制文件函数来强化一下最基础的几个文件操作函数,open,read,write,close
open函数 int open(const char *path,int oflag,...)
read函数 ssize_t read(int fd,void *buf,size_t nbytes)
write函数 ssize_t write(int fd,const void *buf,size_t nbytes)
close函数 int close(int fd) //这个函数很多时候不用显式地去调用,因为linux系统默认在进程结束的时候会自动关闭这个进程打开的文件描述符
#include <stdio.h> //标准io
#include <fcntl.h> //定义了大量常量
#include <unistd.h> //linux系统头文件,相当于windows中的<windows.h>
#include <string.h>
#define BUF 1024 //每次读取的字节数
void copy(char *file_src,char * file_dest){
//首先定义两个文件操作符
int desc_src = -1,desc_dest = -1;
desc_src = open(file_src,O_RDONLY); //以只读方式打开文件
if(desc_src<0){
printf("open %s error\n",file_src);
return ;
}
desc_dest = open(file_dest,O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU ); //如果文件不存在的话新建文件
if(desc_dest<0){
printf("open %s error:%s\n",file_dest,strerror(desc_dest));
return ;
}
//开始从源文件中读,并向目标文件中写
int number = -1;
char buffer[BUF];
ssize_t write_number = -1;
while((number = read(desc_src,buffer,BUF))>0){
if((write_number = write(desc_dest,buffer,number))==-1){
printf("error occured when writing %s to %s",buffer,file_dest);
return ;
}
}
if(number<0){
printf("read %s error",file_src);
}
printf("copy success");
// close(desc_src);
// close(desc_dest); //这两句也可以没有,因为linux默认在进程结束的时候会释放它打开的文件描述符
}
程序很简单,我就大概地解释一下几个我认为需要注意的地方
(1)desc_dest = open(file_dest,O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU ); 这里用到了open函数的第三个参数,也就是mode_t,因为我们是想让一个文件不存在的时候自动创建这个文件,所以就要靠mode_t这个参数来指定所创建文件的权限了,这里指定的是用户可读,用户可写,用户可执行(这些常量都在/usr/include/fcntl.h中定义)
(2)ssize_t是区别于size_t的一种类型,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。更详细内容请看这位朋友的文章 http://blog.csdn.net/lalor/article/details/7426184
(3)strerror(int)是将错误的int变量转化成我们易于理解的字符串,在string.h中定义
测试的时候就很简单了,copy(源文件路径,目标文件路径);
要是在命令行运行的话可以再把参数加到main函数的args中去,这样就实现了我们自己的复制文件的命令了,类似于简单的
cp 源文件 目标文件
好,就这么多了,鉴于本人也是刚刚接触linux编程,还是个新手,好多地方还是不太理解,希望大家可以给指正错误,本人一定虚心接受。