Linux下cp命令的实现

Linux下cp命令的实现(c语言)

学习计算机的小伙伴都应该知道Linux的cp命令,要是不了解大家可以查一下man手册,下面教大家用c语言怎么实现。



实现cp命令所用到的函数

open()打开和创建文件

open是多种语言、环境的一种函数,LINUX中open函数作用:打开和创建文件。PB程序语言中open功能:打开窗口。

打开和创建文件

int  open(constchar*pathname,int  flags);

pathname 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp);
flags 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl.h)通过逻辑位或逻辑构成。

O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式


if((fd_in = open(argv[1], O_RDONLY)) == -1) {
        perror(argv[1]);
        exit(1);
    }
creat()创建一个文件并以只写的方式打开
int creat(const char * pathname, mode_t mode);
函数功能:

创建一个文件并以只写的方式打开。如果原来该文件存在,会将这个文件的长度截短为0。

  if((fd_out= creat(argv[2], 0644)) == -1) {
        perror(argv[2]);
        exit(1);
    }
read()从文件中读
include <unistd.h>

ssize_t read  (int fd, void *buf, size_t count);

参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中

成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。

while((nread = read(fd_in, buf, BUFSSIZE)) > 0){
        if(write(fd_out, buf, strlen(buf)) != nread){
            perror("write");
            exit(1);
        }
        memset(buf, 0, BUFSSIZE + 5);
    }
write()函数

将数据写入已打开的文件内

write有两种用法。一种是:ssize_t write(int fd, const void *buf, size_t nbyte);
fd:文件描述符;
buf:指定的缓冲区,即指针,指向一段内存单元;
nbyte:要写入文件指定的字节数;

while((nread = read(fd_in, buf, BUFSSIZE)) > 0){
        if(write(fd_out, buf, strlen(buf)) != nread){
            perror("write");
            exit(1);
        }
        memset(buf, 0, BUFSSIZE + 5);
    }

具体代码实现


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define BUFSSIZE 512

int main(int argc, char **argv) {
    int fd_in, fd_out;
    char buf[BUFSSIZE + 5] = {0};
    ssize_t nread;
    if(argc != 3) {
        printf("USEAG: %s SOURCEFILE DESTILE", argv[0]);
        exit(1);
    }
    if((fd_in = open(argv[1], O_RDONLY)) == -1) {
        perror(argv[1]);
        exit(1);
    }
    if((fd_out= creat(argv[2], 0644)) == -1) {
        perror(argv[2]);
        exit(1);
    }
    while((nread = read(fd_in, buf, BUFSSIZE)) > 0){
        if(write(fd_out, buf, strlen(buf)) != nread){
            perror("write");
            exit(1);
        }
        memset(buf, 0, BUFSSIZE + 5);
    }

    close(fd_in);
    close(fd_out);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值