首页 > 代码库 > Unix - "tcp & tcpm"
Unix - "tcp & tcpm"
Brief introduction about "tcp & tcpm" in basic unix.
This is a homework of unix class which is all about copy a file, not the TCP(Transmission Control Protocol).
tcp:
Base on read(), write(), lseek() and open() methods to copy a file under unix enviroment. This is an example:
tcp file1 file2 (./a.out file2 file2)
tcp file1 dir
tcp file1 dir/file2
If target is a file, then copy the source into target file. If target is a directory file1 would copyed into this dir.
tcpm:
Copy a file via mmap() and memcpy() instead of read() and write() to make the same usage like tcp.
How to achive tcp:
Here are 2 cores in this case:
1. copy file1 to file2
2. if argv[2] is a dir, copy file1 into this dir.
1.copy a file is wirtten in APUE at Part3.9.
And make sure before read/write you have make sure the files are opened.
while((read_size = read(fd_src_file, n, BUFFSIEZ)) > 0){ if ((write_size = write(fd_dest_file, n, read_size)) != read_size){ perror("write dest_file fail"); exit(1); } }
2.copy in target directory
Change avg[2] from "/User/.../Desktop" to "/User/.../Desktop/file2".
This method is not the perfect, even a little bit funny. If you have a better idea you can tell me.
if (S_ISDIR(buf.st_mode)){ // change the directory if file copy path is not current dir sprintf(copy_file_name,"%s%s%s",argv[2],"/",argv[1]); printf("change dir to %s\n", copy_file_name); }
CODE:
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> #define BUFFSIEZ 512 int main(int argc, char const *argv[]) { int fd_src_file, fd_dest_file; int read_size, write_size; char n[BUFFSIEZ]; char copy_file_name[50]; struct stat buf; // check input if (argc != 3){ printf("a.out src_file to dest_file...\n"); exit(1); } strcpy(copy_file_name, argv[2]); if (lstat(argv[2], &buf) < 0) { perror("lstat error"); } if ((fd_src_file = open(argv[1],O_RDWR,0774)) < 0) { perror("open src_file fail"); exit(1); } else printf("open file ok.\n"); if (S_ISDIR(buf.st_mode)){ // change the directory if file copy path is not current dir sprintf(copy_file_name,"%s%s%s",argv[2],"/",argv[1]); printf("change dir to %s\n", copy_file_name); } if ((fd_dest_file = open(copy_file_name,O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR,0600)) < 0){ perror("create dest_file fail"); exit(1); } while((read_size = read(fd_src_file, n, BUFFSIEZ)) > 0){ if ((write_size = write(fd_dest_file, n, read_size)) != read_size){ perror("write dest_file fail"); exit(1); } } if (read_size < 0) { fprintf(stderr, "read error\n"); exit(1); } printf("read/write ok\n"); return 0; }
How to achive tcpm:
Search for mmap() and memcpy is the best way to understand how do these method works. Here is a better blog which introduces using mmap() to copy a file.
http://blog.chinaunix.net/uid-20662363-id-1904142.html
At last
Only when I start to write did I understang the patient I have to pay for my blogs. Greet to all those great tech-bloggers!
Unix - "tcp & tcpm"