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?

sr01853
  • 6,043
  • 1
  • 19
  • 39
CSawy
  • 904
  • 2
  • 14
  • 25

5 Answers5

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

see freopen and setbuf for their definitions

sr01853
  • 6,043
  • 1
  • 19
  • 39
3

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);
setnoset
  • 249
  • 3
  • 7
  • 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". – NoComprende Jan 17 '22 at 16:11
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).

NPE
  • 486,780
  • 108
  • 951
  • 1,012
  • i have two different processes (not a child and a parent) so i cant do pipe between them. right? – CSawy Jan 20 '13 at 21:04
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

pouyan
  • 307
  • 1
  • 5
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);
}
Pang
  • 9,564
  • 146
  • 81
  • 122
Carlos
  • 1