C 为什么如果我重定向文件上的STD_并写入STD_,文件仍为空?

C 为什么如果我重定向文件上的STD_并写入STD_,文件仍为空?,c,C,我无法解决标准输出的问题,因为我在Unix操作系统上,所以STD_IN=0,STD_OUT=1,STD_ERR=2的文件描述符,基本上我试图关闭与标准输出关联的描述符,然后用我想写入的文件的描述符覆盖它,但当我打开文件时,它是空的。 代码: #包括 #包括 #包括 #包括 /*特殊文件的描述符——在unistd.h中使用它或常量*/ #在0/*标准输入流中定义STD_*/ #定义标准输出1/*标准输出流*/ #定义标准错误2/*标准输出错误流*/ int main(参数的无符号int num,字

我无法解决标准输出的问题,因为我在Unix操作系统上,所以STD_IN=0,STD_OUT=1,STD_ERR=2的文件描述符,基本上我试图关闭与标准输出关联的描述符,然后用我想写入的文件的描述符覆盖它,但当我打开文件时,它是空的。 代码:

#包括
#包括
#包括
#包括
/*特殊文件的描述符——在unistd.h中使用它或常量*/
#在0/*标准输入流中定义STD_*/
#定义标准输出1/*标准输出流*/
#定义标准错误2/*标准输出错误流*/
int main(参数的无符号int num,字符**args)
{
if(参数的数量!=3)
{
写入(标准错误,“很少争论。\n使用=。/可执行文件”,69);
返回-1;
}
int file_des=open(args[2],O_CREAT,0640);
如果(文件编号<0)
{
写入(标准错误,“错误,我们无法打开文件。\n”,31);
返回-1;
}
//我关闭与STD_OUT关联的描述符
关闭(标准输出);
//我在第一个可用描述符上复制与fil_des关联的描述符(so STD_OUT)
dup(文件管理系统);
写入(标准输出,参数[1],大小(参数[1]);
关闭(文件);
返回0;
}
这应该是好的,我没有看到任何错误,但当我打开文件,我没有发现写的消息。
因为??“帮助我”

此代码不正确:

int file_des= open(args[2],  O_CREAT,  0640);
Per(请注意粗体部分-我的粗体):

简介

#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int oflag, ...);
int openat(int fd, const char *path, int oflag, ...);
写入文件时,您的
open()
调用需要包括
O_WRONLY
O_RDWR

int file_des= open(args[2],  O_CREAT | O_WRONLY,  0640);
问题 这里的问题是分配给
file_des
的文件描述符实际上不是1

int test=dup(文件);
fprintf(标准,“%d”,测试);
三,

那么,原因是什么呢? 问题在于如何打开文件
O_create
创建一个不存在的文件

没有关于打开文件进行读、写或读/写的规范

由于要将文件与
stdout
的文件描述符相关联,因此还必须使用
O_WRONLY
标志

int file_des=open(args[2],O_CREAT | O_WRONLY,0640);

#在0中定义STD_
?在
unistd.h
中。您希望dup重新使用1,但不检查返回值。@stark如果
STDOUT\u FILENO
1
close()
d,则编号最低的可用文件描述符将是
1
。在这种情况下,
dup()
:“除非另有规定,否则打开一个或多个文件描述符的所有函数应在每次分配时自动分配可用的最低编号(即,在调用过程中尚未打开)的文件描述符。”这是正确的,我建议您编辑一个文件描述符,答案中的明确步骤。OP的文件为空,因为EBADF的
写入
失败,因为fd#1(成功的
dup的返回
)被错误地以只读方式打开。正如您所说,调用
open
是不正确的,因为它忽略了一个强制标志。任何事情都可能发生,但在这种情况下,OP的系统可能会将O_RDONLY定义为0x0(和许多人一样),这意味着错误地忽略这些标志与指定O_RDONLY是一样的。@pilcrow编辑“再向前一步”是什么意思?(FWIW,
O_RDONLY
在Linux上是
0
)非常感谢
O_EXEC
    Open for execute only (non-directory files). The result is unspecified if this flag is applied to a directory.
O_RDONLY
    Open for reading only.
O_RDWR
    Open for reading and writing. The result is undefined if this flag is applied to a FIFO.
O_SEARCH
    Open directory for search only. The result is unspecified if this flag is applied to a non-directory file.
O_WRONLY
    Open for writing only.
int file_des= open(args[2],  O_CREAT | O_WRONLY,  0640);