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!

时间: 2025-01-08 18:07:07

Unix - "tcp & tcpm"的相关文章

IOCP扩展方法AcceptEx, DisconnectEx, GetAcceptExSockaddr用法示例

这篇文章记录了我刚接触IOCP模型时的理解,对于初学者,应该算不错的调试程序,仅有一个400多行代码的dpr文件,可以直接用WriteLn输出信息,前提是会用delphi建立Console Application,当然你也可以很容易的就改成了C控制台程序或是其它语言.附加代码中有详细的注释,如果你已有IOCP经验,那么请不用在此浪费时间,这个示例不适合你.示例仅展示了IOCP中AcceptEx, DisconnectEx, GetAcceptExSockaddr等的用法.在文章最后有推荐的两个连

libuv在cocos2d-x中的使用

libuv经过Node.js的实践和应用,已经证明非常之成熟,本来之前项目用的是这个:clsocket https://github.com/DFHack/clsocket  当初选它的主要原因是它支持Windows.Linux.Mac OSX(我猜测的),但致命的缺点就是仅支持阻塞的TCP,这样就会导致一个问题,在连接游戏服务器.聊天服务器的时候游戏主界面会直接被卡死,等连接成功后才能恢复正常.而LuaSocket之前游戏也替换过,发现的问题主要是依赖lua的循环检测是否有新的数据(定时器),

用程序算法做人生选择

[原文链接] 每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的 offer,去腾讯还是去豆瓣,去外企还是去国内的企业,去创业还是去考研,来北京还是回老家,该不该去创新工场?该不该去 thoughtworks?……等等,等等.今年从 7 月份到现在,我收到并回复了 60 多封这样的邮件.我更多帮他们整理思路,帮他们明白自己最想要的是什么.(注:我以后不再回复类似的邮件了). 我深深地发现,对于我国这样从小被父母和老师安排各种事情长大的人,当有一天,父母和老师都跟不上的

How to find out which process is listening upon a port

When we covered port scanning a short while ago we discovered how to tell which ports had processes listening upon them, via port scanning. What we didn't do was learn how to tell which processes were associated with each open port. Often you'll know

[转载] - 所谓踏实,并不是踏踏实实追求你的目标,而是踏踏实实把你够得着看得见的就在身边的东西干好

每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的 offer,去腾讯还是去豆瓣,去外企还是去国内的企业,去创业还是去考研,来北京还是回老家,该不该去创新工场?该不该去 thoughtworks?……等等,等等.今年从 7 月份到现在,我收到并回复了 60 多封这样的邮件.我更多帮他们整理思路,帮他们明白自己最想要的是什么.(注:我以后不再回复类似的邮件了). 我深深地发现,对于我国这样从小被父母和老师安排各种事情长大的人,当有一天,父母和老师都跟不上的时候,我们几乎

docker系列3--dockerd配置文件

dockerd启动配置 docker通信方式选择 docker默认以sock文件方式提供接口,要开放tcp接口远程调用,需要修改配置文件: The Docker daemon can listen for Docker Engine API requests via three different types of Socket: unix, tcp, and fd.参考:https://docs.docker.com/engine/reference/commandline/dockerd/

UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select 加阻塞式 I/O 版本. 非阻塞式 I/O 版本.fork 版本.线程化版本.它们都由同一个 main 函数调用来实现同一个功能,即回射程序客户端. 它从标准输入读入一行文本,写到服务器上,读取服务器对该行的回射,并把回射行写到标准输出上. 其中,非阻塞式 I/O 版本是所有版本中执行速度最快的,

UNIX网络编程卷1 回射服务器程序 TCP服务器程序设计范式 四个版本

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 这是一个简单的回射服务器程序.它将客户发送的数据读入缓冲区并回射其中内容 下面我会介绍同一个使用 TCP 协议的回射服务器程序的几个不同版本,分别是 fork 版本.select 版本.poll 版本.多线程版本 fork 版本:为每一个客户连接派生(fork) 一个子进程用来处理客户请求 /** * TCP/IPv4 协议相关 * **/ #include "unp.h" in

Unix网络编程之基本TCP套接字编程(上)

TCP客户/服务器实例 服务器程序 #include "unp.h" int main(int argc, char **argv) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); //1 bzero(&servaddr, sizeof(servad