2013-01-20 57 views
4

in C 我想重定向一個進程的輸出從stdout寫入到一個「共享內存段」,它可以被認爲是一個字符數組或一個指針字符串
我知道有dup2但它將文件描述符作爲參數,而不是指向數組的指針。有沒有辦法將它重定向到一個字符串?將輸出從stdout重定向到一個字符串?

回答

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

看到它們的定義

+1

請注意,緩衝區大小必須完全以字節爲單位「BUFSIZ」!如果它更小,則會有緩衝區溢出漏洞,如果它更大,它將永遠不會被使用。如果您想緩衝超過BUFSIZ字節,此解決方案將不起作用。 –

+1

如何撤消這個?它需要撤消它嗎? – kangear

0

您可以寫入管道,並從中讀取到共享內存中(也就是說,如果您不能使用共享內存中字符串的管道而不是)。

+0

我有兩個不同的過程(不是兒童和父母),所以我不能做他們之間的管道。對? – CSawy

0

shm_openfreopensetbuf你可以有一個文件描述符指向共享內存,並把它傳遞給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讀取並保存到一個字符串;但要小心

您也可以找到在Here

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

這應該在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); 
相關問題