歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> APUE習題4.6源代碼----實現自己的簡易 cp 命令

APUE習題4.6源代碼----實現自己的簡易 cp 命令

日期:2017/3/1 9:34:51   编辑:Linux編程

原題:

編寫一個類似 cp 的程序,它復制包含空洞的文件,但不將字節0寫到輸出文件中去。

源代碼:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

#define BUF_SIZ 128

int my_cp( const char *file1, const char *file2 )
{
int fd1, fd2;
char buffer[BUF_SIZ];
int res;
int current_position = 0;
int byte_count = 0;

fd1 = open( file1, O_RDWR );
if( -1 == fd1 ) {
perror("open file1 failed");
return -1;
}

fd2 = open( file2, O_RDWR | O_APPEND | O_CREAT | O_TRUNC, 0666 );
if( -1 == fd2 ) {
perror("open file2 failed");
return -1;
}

memset( buffer, '\0', BUF_SIZ );
res = read( fd1, buffer, BUF_SIZ );
if( -1 == res ) {
perror("file1 read error");
return -1;
}

while( 0 != res ) {
byte_count = 0;
for( current_position=0; current_position<BUF_SIZ; current_position++ ) {
if( '\0' != buffer[current_position] ) {
buffer[byte_count] = buffer[current_position];
byte_count++;
}
}

res = write( fd2, buffer, byte_count );
if( -1 == res ) {
perror("file2 write failed");
return -1;
}

memset( buffer, '\0', BUF_SIZ );
res = read( fd1, buffer, BUF_SIZ );
if( -1 == res ) {
perror("file1 read failed");
return -1;
}
}
}

int main(int argc, char *argv[])
{
if( 3 != argc) {
printf("correct usage: ./my_cp file1 file2\n");
exit( EXIT_FAILURE );
}

//產生一個含有空洞的文件 file1
int fd = open( argv[1], O_RDWR | O_CREAT | O_TRUNC, 0666 );
if( -1 == fd ) {
perror("open failed");
exit( EXIT_FAILURE );
}

int res = write( fd, "Hey,man!", strlen("Hey,man!") );
if( -1 == res ) {
perror("file1 write failed");
exit( EXIT_FAILURE );
}

off_t offset = lseek( fd, 10000, SEEK_SET );
if( -1 == offset ) {
perror("lseek failed");
exit( EXIT_FAILURE );
}

res = write( fd, "How are you?", strlen("How are you?") );
if( -1 ==res ) {
perror("file1 write failed");
exit( EXIT_FAILURE );
}

//應用 my_cp 函數拷貝文件
res = my_cp( argv[1], argv[2] );
if( -1 == res ) {
perror("copy failed");
exit( EXIT_FAILURE );
}

exit( EXIT_SUCCESS );
}

運行結果:

[www.linuxidc.com@localhost APUE]$ ./my_cp file1 file2

[www.linuxidc.com@localhost APUE]$ cat file2

Hey,man!How are you?

輸出文件在本例中為file2,大小為 20 Bytes = strlen("Hey,man!") + strlen("How are you?")。測試通過。

相關鏈接

  • 《UNIX環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
  • Unix環境高級編程 源代碼地址 http://www.linuxidc.com/Linux/2011-04/34826.htm

Copyright © Linux教程網 All Rights Reserved