使用 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;
}
我正在尝试仅使用 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;
}