6

在 C 中,我想将进程的输出从 stdout 重定向到写入“共享内存段”,它可以被认为是一个 char 数组或带有指针的字符串
我知道有 dup2 但它需要文件描述符作为参数不是指向数组的指针。有没有办法将它重定向到一个字符串?

4

5 回答 5

7
char string[SIZE];
freopen("/dev/null", "a", stdout);
setbuf(stdout, string);

有关它们的定义,请参见freopensetbuf

于 2013-01-20T19:39:35.387 回答
3

这应该适用于 UNIX 系统:

// set buffer size, SIZE
SIZE = 255;

char buffer[SIZE];
freopen("/dev/null", "a", stdout);
setbuf(stdout, buffer);
printf("This will be stored in the buffer");
freopen ("/dev/tty", "a", stdout);
于 2017-08-21T18:02:57.137 回答
0

您可以写入管道,然后将其读取到共享内存中(也就是说,如果您不能使用管道而不是共享内存中的字符串)。

于 2013-01-20T19:34:51.133 回答
0

为了将标准输出简单地重定向到内存字符串,只需执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PATH_MAX 1000

int main()
{
    FILE *fp;
    int status;
    char path[PATH_MAX];

    fp = popen("ls ", "r");

    if (fp == NULL)  return 0;


    while (fgets(path, PATH_MAX, fp) != NULL)
        printf("\nTest=> %s", path);

    status = pclose(fp);
}
于 2017-03-30T03:36:19.823 回答
0

使用shm_open您可以有一个指向共享内存的文件描述符并将其传递给 dup2 函数,如下所示:

int fd = shm_open("shm-name", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
dup2(fd, STDOUT_FILENO);
fprintf(stdout, "This is string is gonna be printed on shared memory");

毕竟寻找共享内存到开头(使用 lseek 读取它并将其保存到字符串;但要小心

您还可以在此处找到缓冲到管道中的示例

于 2016-01-23T07:22:52.343 回答