/*拷貝文件內容實例
read系統調用、write系統調用
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);//將數據寫到一個文件中
一、read、write
一旦有了與一個打開文件描述符像連的文件描述符,只要該文件是用O_RDONLY或O_RDWD標志打開的,就可以用read()系統調用從該文件讀取字節
ssize_t read(int fd, void* buf, size_t count);
fd: 要讀取得文件描述符。 buf: 指向內存塊的指針,從文件讀取來的字節放到這個內存塊中。 count: 從該文件讀取到buf中的字節數
返回值:若出錯,返回-1;讀文件結束,返回0;否則返回從該文件復制到規定緩沖區中的字節數。
ssize_t write(int fd, const void * buf ,size_t count);
fd:要寫入文件的描述符。 buf: 指向內存塊的指針。 count: 要寫入文件的字節數
返回值:如果出現錯誤,返回-1;如果寫入成功,則返回寫入到文件的字節數。
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#define ERR_EXIT(m) (perror(m),exit(EXIT_FAILURE))
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) //宏要求一條語句
int main(int argc,char *argv[])// ./0703_5 src dest
{
int infd;
int outfd;
if(argc!=3)
{
fprintf(stderr,"Usage %s src dest\n",argv[0]);
exit(EXIT_FAILURE);
}
if((infd=open(argv[1],O_RDONLY))==-1)
ERR_EXIT("open src error");
if((outfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644))==-1)
ERR_EXIT("open dest error");
char buf[1024];//不一定讀到1024,每次讀后,數據指針都會偏移
ssize_t nread;//頭文件<sys/types.h>
while((nread=read(infd,buf,1024))>0) //讀到文件末尾返回0跳出循環
{
write(outfd,buf,nread);//int fsync(int fd) 。不一定讀到磁盤文件中了,可以用fsync 同步到磁盤中
}
close(infd);
close(outfd);
return 0;
}
