2015-07-21 49 views
0

在窗口我会用这样的:重定向标准错误到一个临时文件

strcpy (errorFileName, _tempnam (NULL,"pfx")); 
freopen (errorFileName, "wt", stderr); 

man page在Linux中tempnam特别说使用它,并使用mkstemp代替。很公平。但是它会返回一个文件描述符。有没有简单的方法可以使用mkstempstderr重定向到文件中? 存储由mkstemp生成的文件名,以备将来在程序中使用,如果有必要?

int fd = mkstemp("pfxXXXXXX"); 
if (fd != -1) 
{ 
    //get file name here? or is there a better way 
    strcpy (errorFileName, nameFromFd); 
    freopen (errorFileName, "wt", stderr); 
} 
+2

为什么不让用户决定他想看到他的输出的位置? –

+0

@BaummitAugen他们确定,这是只有在指定选项时才执行的方法的一部分。无论哪种方式,这不是我的代码。我无法做出那样的设计决定。 – amza

+0

我的意思是,如果用户想要,用户可以从程序外部重定向stderr,所以不需要在代码中执行此操作。 –

回答

3

你想看看dup2()。

dup2(fd,2); 

应该做的伎俩:

int dup2(int oldfd, int newfd); 

    dup2() makes newfd be the copy of oldfd, closing newfd first if neces- 
    sary, but note the following: 

    * If oldfd is not a valid file descriptor, then the call fails, and 
     newfd is not closed. 

    * If oldfd is a valid file descriptor, and newfd has the same value as 
     oldfd, then dup2() does nothing, and returns newfd. 

来源:男人DUP

+1

如果您显示的文档是引用(如格式建议),则应添加一个源,可能作为链接。 –

+0

确保这是你在程序中做的第一件事。在'* FILE'和文件描述符上混合操作可能会导致奇怪的结果。 –

+0

Source是dup/dup2/dup3的手册页,这是在unix系统上查找C库函数的常用方法。 “man dup2”会给你提供这些信息。 – Mirar

0

回答你问题的第二部分,存储由mkstemp在计划将来使用生成的文件名如果有必要,只需使用本地变量来存储文件名

char nameBuff[32]; 
memset(nameBuff,0,sizeof(nameBuff)); 
strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",21); 
mkstemp(nameBuff); 
printf("\n Temporary file [%s] created\n", nameBuff); 
相关问题