使用 read/write 系统调用实现 cp 命令

Implementing the cp command using read/write system calls

我正在尝试仅使用 read/write 系统调用来实现 cp 命令。
这是我的代码:

/**
 * cp file1 file 2
 */

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int errsv;
    char contents[1024];
    int fd_read, fd_write;
    fd_read = open(argv[1], O_RDONLY);
    if (fd_read == -1)
    {
        errsv = errno;
        printf("Error occured: %d\n", errsv);
    }
    read(fd_read, contents, sizeof(contents));
    fd_write = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0744);
    if (fd_write == -1)
    {
        errsv = errno;
        printf("Error occured: %d\n", errsv);
    }
    write(fd_write, contents, sizeof(contents));
    close(fd_read);
    close(fd_write);
    return 0;
}

我使用以下命令测试了代码:

cc test.c 
./a.out file1 file2

这是我的文件 1:

dummy text
dummy text

代码运行之后,虽然file2包含file1的文字,但也有一些乱码。 [这里就不放了。]
为什么会这样?

write(fd_write, 内容, strlen(内容)); Strlen returns 填充的条目数,但 sizeof returns 缓冲区大小为 1024

您需要循环调用read()write()来复制整个文件。 read() returns 0 当你到达 EOF 时,或者如果有错误则为负结果,然后你可以结束循环。

read() returns 读取的字节数,可能小于缓冲区的大小。您需要在调用 write() 时使用该数字,否则您将向输出文件写入额外的字符。这些将是第一次迭代中的未初始化字符,而在其他迭代中,它们将保留在先前迭代中的字符上。

int main(int argc, char *argv[])
{
    char contents[1024];
    int fd_read, fd_write;
    fd_read = open(argv[1], O_RDONLY);

    if (fd_read == -1)
    {
        perror("open input file");
        exit(1);
    }
    fd_write = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0744);
    if (fd_write == -1)
    {
        perror("open output file");
        exit(1)
    }

    int n_read;
    while ((n_read = read(fd_read, contents, sizeof(contents))) > 0) {
        write(fd_write, contents, n_read);
    }

    close(fd_read);
    close(fd_write);
    return 0;
}