C文件复制程序不适用于目录(在Linux上)

时间:2018-11-26 09:46:00

标签: c linux copy system-calls

以下是将文件(第一个参数)的内容复制到新文件(第二个参数)的程序。

我正在linux上对其进行测试,例如,将用户终端的内容复制到新文件中也可以:

./copy /dev/tty newFile

但是,无法复制当前目录的内容:

./copy . newFile

后者在打开第一个参数时不会引起错误,但是不会复制任何内容。我以为目录的内容会被复制到新文件上?

编辑:之所以会发生这种情况,是因为linux按照标准将工作目录设为〜

下面的copy.c程序:

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


int copy(int inFileDesc,int outFileDesc);

int main (int argc, char** argv)
{
    int inputfd;
    int outputfd;
    if (argc!=3)
    {
        printf("Wrong number of arguments\n");
        exit(1);
    }
    inputfd=open(argv[1],O_RDONLY);
    if(inputfd==-1)
    {
        printf("Cannot open file\n");
        exit(1);
    }
    outputfd=creat(argv[2],0666);
    if(outputfd==-1)
    {
        printf("Cannot create file\n");
        exit(1);
    }
    copy(inputfd,outputfd);
    exit(0);
}

int copy(int inFileDesc,int outFileDesc)
{
    int count;
    char buffer[BUFSIZ];
    while((count=read(inFileDesc,buffer,sizeof(buffer)))>0)
    {
        write(outFileDesc,buffer,count);
    }
}

1 个答案:

答案 0 :(得分:2)

如果您阅读man 2 openman 2 read

第2个人打开

The named file is opened unless:
...
[EISDIR] The named file is a directory, and the arguments specify that it is to
be opened for writing.

男人2阅读

The pread(), read(), and readv() calls will succeed unless:
...
[EISDIR] An attempt is made to read a directory.

因此,open不会失败,因为您指定了O_RDONLY并返回了文件描述符,但是read会在第一次调用时失败。