编写了以下代码来打开文件并使用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);
}
}
答案 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);
}