系统调用C(文件描述符)

时间:2016-10-04 11:35:05

标签: c operating-system system-calls

编写了以下代码来打开文件并使用linux中的sysyem调用将数据写入终端。

要读取文件描述符(fd)的值,它应该分配一个值。正如我们在if else声明中所知,如果是其他部分,或者如果第一部分将一次实施。所以根据下面的代码,fd将只在else处有一个值。但是当我传递文件名并运行该程序时,它会打开文件。文件打开是在read(()系统调用的while循环中发生的。但是while循环在else部分,因为文件描述符在理论上不具有任何值。那么read函数如何准确识别文件?这是困惑我。

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

    #define SIZE 10

    int main(int argc, char *argv[])
    {
        int fd,n;
        char buff[SIZE];

        if(argc != 2)
        {
            printf("USAGE : %s\n",argv[0] );
            exit(1);        
        }        
        else if ((fd = open(argv[1],0)) == -1)
        {
            perror("STATUS");
            exit(1);
        }
        else
        {
            while((n = read(fd,buff,SIZE)) > 0)
            {
                write(1,buff,SIZE);

            }
            close(fd);
        }        
    }

1 个答案:

答案 0 :(得分:2)

以下是:

假设程序是在命令行上使用 xyz.txt 启动的,我们假设 xyz.txt 文件确实存在:

if(argc != 2)
{
                                        // we don't get here because argc == 2
    printf("USAGE : %s\n",argv[0] );
    exit(1);
}
else if ((fd = open(argv[1],0)) == -1)  // the statement in the if clause will therefore
                                        // be executed, fd will be something different 
                                        // from -1 because open succeeded
{
    perror("STATUS");                   // therefore we dont ge here either
    exit(1);
}
else
{                                       // instead we get here and
    while((n = read(fd,buff,SIZE)) > 0) // everything works as expected
    {
        write(1,buff,SIZE);

    }
    close(fd);
}