我已经看了前面提出的问题。我已经想出了这段代码来获取stderr的当前值,将其重新定向到buf并重新分配stderr。这是代码。
stderr到buff的重定向没有发生。当我尝试执行代码时,我可以在屏幕上看到这一点:
ls: cannot access system: No such file or directory
hellow world
error from buffer
源代码如下:
#include<stdio.h>
static int fd;
static fpos_t pos;
char *buf;
void closeerr()
{
fflush(stderr);
fgetpos(stderr, &pos);
fd = dup(fileno(stderr));
buf =(char *)calloc(sizeof(char *),1024);
stderr = fmemopen(buf, sizeof(buf), "w");
}
void reverterr()
{
fflush(stderr);
dup2(fd, fileno(stderr));
close(fd);
clearerr(stderr);
fsetpos(stderr, &pos);
}
void main()
{
closeerr();
printf("hellow world");
system(" ls -l system"); // this is where I see the error msg
printf("error from buffer %s",buf);
reverterr();
}
这段代码将stdout(逻辑与重定向stderr相同)重定向到一个临时文件(方法1如下所示,尽管我还没有分叉并创建一个子进程来写入文件)
void switchStdout(const char *newStream)
{
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen(newStream, "w", stdout);
}
void revertStdout()
{
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos);
}
void main(){
switchStdout("/tmp/err.txt");
printf("Hello world");
revertStdout();
}
fmemopen()
函数实际上并没有打开文件描述符,因此从fmemopen()
获得的FILE
上的fileno()
返回一个未定义的值。CCD_ 5是通过直接写入缓冲区而不通过操作系统发送数据来实现的。无法通过fork()
保留使用fmemopen()
打开的文件。
另一个问题是,您永远不会为缓冲区分配内存,请阅读fmemopen()
API以及如何使用它来理解问题。
以下是两种有效的方法:
- 打开一个临时文件,然后打开
fork()
。在分叉进程中,将其文件描述符复制到文件描述符2(STDERR_FILENO
)上,然后执行命令。在父级中,wait()
表示子级,然后读取它写入临时文件的内容。请注意,在读取之前需要执行lseek()
操作,因为子级将更改文件指针 - 用
pipe()
打开fifo,然后用fork()
打开fifo。在子级中,将写入端复制到文件描述符2上,关闭读取端,然后执行命令。在家长中,关闭书写端,在孩子跑步时从阅读端阅读孩子写的内容。之后别忘了给孩子wait()