6

in C i want to redirect the output of a process from stdout to write to a "shared memory segment" which can be thought of as a char array or a string with a pointer
i know that there is dup2 but it takes file discriptors as argument not a pointer to an array. is there any way to redirect it to a string?

5 Answers 5

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

see freopen and setbuf for their definitions

Sign up to request clarification or add additional context in comments.

3 Comments

Note that the buffer size MUST be exactly BUFSIZ in bytes! If it's smaller, you'll have a buffer overflow vulnerability, and if it's larger, it will never be used. This solution will not work if you want to buffer more than BUFSIZ bytes.
how to undo this ? Is it need to undo it ?
Windows equivalent please?
5

This should work on UNIX systems:

// 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);

1 Comment

Thanks, searched for ages trying to find how to do this. A few points !) requires c99 or later, 2) I had to set buffer[SIZE]={0} to avoid trailing garbage and 3) also works on Windows if you replace "/dev/tty" with "CON".
0

You could write to a pipe, and read from it into shared memory (that is, if you can't use the pipe instead of the string in shared memory).

1 Comment

i have two different processes (not a child and a parent) so i cant do pipe between them. right?
0

with shm_open you can have a file descriptor pointing to a shared memory and pass it to dup2 function as below:

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");

And after all seek the shared memory to the beginning (with lseek read it and save it to a string; But be careful

Also you can find an example of buffering into pipe in Here

Comments

0

In order to do a simple redirection of stdout to a memory string, just do this:

#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);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.