C 文件描述符,open()返回零

C 文件描述符,open()返回零,c,C,我打开一个文件,想在里面写点东西。问题在于,出于某种原因,fd2为0。它不在文件中写入,而是在终端上写入。我不关闭代码中的任何位置的(0)。为什么我得到fd=0而不是示例3。在终端上写入的原因是fd的值为零?我知道fd=0表示标准输入 有什么想法吗?多谢各位 if ((fd2 = open(logFile, O_RDWR |O_APPEND | O_CREAT , 0666) == -1)) DieWithError("open() failed"); printf("FD2 = %d

我打开一个文件,想在里面写点东西。问题在于,出于某种原因,fd2为0。它不在文件中写入,而是在终端上写入。我不关闭代码中的任何位置的(0)。为什么我得到fd=0而不是示例3。在终端上写入的原因是fd的值为零?我知道fd=0表示标准输入

有什么想法吗?多谢各位

if ((fd2 = open(logFile, O_RDWR |O_APPEND | O_CREAT , 0666) == -1))
    DieWithError("open() failed");

printf("FD2 = %d",fd2);     //returns me zero

bzero(tempStr, sizeof(tempStr));
bzero(hostname, sizeof(hostname));

gethostname(hostname, sizeof(hostname));

sprintf(tempStr, "\n%sStarting FTP Server on host %s in port %d\n", ctime(&currentime), hostname, port);

if (write(fd2, tempStr, strlen(tempStr)) == -1)
    DieWithError("write(): failed");
这是错误的

if ((fd2 = open(logFile, O_RDWR |O_APPEND | O_CREAT , 0666) == -1))
你想要这个

if ((fd2 = open(logFile, O_RDWR |O_APPEND | O_CREAT , 0666)) == -1)
很难看到,因为这行太长了,但括号放错了位置。总之,

if ((   fd2 = open(...) == -1     )) // your code
if ((   fd2 = (open(...) == -1)   )) // equivalent code
if ((   (fd2 = open(...)) == -1)  )) // correct code
如果行太长,最好不要让它出现在
If

#include <err.h>

fd2 = open(...);
if (fd2 < 0)
    err(1, "open failed");
#包括
fd2=开放(…);
if(fd2<0)
错误(1,“打开失败”);

您的条件已关闭。注意括号。应该是:

if ((fd2 = open(logFile, O_RDWR |O_APPEND | O_CREAT , 0666)) == -1)
//                                                        ^^^    ^^^
有时候最好不要比自己聪明:

int fd = open(...);

if (fd == -1) { DieWithError(); }

什么是日志文件?是不是
/dev/console
?如果你在Linux上,通过
strace
运行它。日志文件只是日志文件的一个路径。logIf如果你不能可靠地正确使用括号(而且你不能-你的另一个问题也被放错括号弄得乱七八糟),那么把事情分开:
fd2=open(logFile,O|RDWR | O| O|APPEND | O| O|CREAT,0666);如果(fd2==-1){…}
。您不太可能出错。至于日志输出出现在您的终端上的原因,通常的设置方式是,标准输入、标准输出和标准错误通常都是与您的终端的读/写连接,因此您可以写入标准输入,并从标准输出和标准错误中读取(我有一份狄更斯式的工作,按我的意图打字)。因此,你的错误括号表达式以你写标准输入结束,当它是终端时,通常是可写的。