2009-10-05 3 views
1

Могу ли я сделать анонимный поток в c? Я не хочу создавать новый файл в файловой системе, просто есть поток, который может использовать одна функция, в то время как другая может заразиться от него. Не C++, c.Анонимный поток в c

ответ

6

Возможно, вы ищете трубы.

Вперед Ваш STDOUT к трубе.

Тогда другое приложение будет читать из трубы.

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

#define RDR 0 
#define WTR 1 

char ** parseargs(char *string); 

int main(void){ 
    char mode = 'r'; 
    char prog[50] = "/bin/ps --version"; 
    char **argv; 
    int p[2]; 
    pid_t pid; 
    FILE *readpipe; 
    int pipein, pipeout; 
    char buf; 


    /* create the pipe */ 
    if(pipe(p) != 0){ 
     fprintf(stderr, "error: could not open pipe\n"); 
    } 

    pipein = p[RDR]; 
    pipeout = p[WTR]; 

    if((pid = fork()) == (pid_t) 0){ 



     close(pipein); 

     dup2(pipeout, 1); 
     close(pipeout); 


     if(execv(argv[0], argv) == -1){ 
     fprintf(stderr, "error: failed to execute %s\n", argv[0]); 
     } 
     _exit(1); 
    } 

    close(pipeout); 


    readpipe = fdopen(pipein, &mode); 

    while(!feof(readpipe)){ 
     if(1 == fread(&buf, sizeof(char), 1, readpipe)){ 
     fprintf(stdout, "%c", buf); 
     } 
    } 


    return 0; 
} 
0

Упс, только что нашел ... возможно. tmpfile() возвращает текстовый файл *

Это правильный способ сделать это?

+0

, который все равно создаст файл ... –

1

Да, tmpfile() является одним из способов сделать это. Тем не менее, я считаю, что tmpfile() в наши дни не одобряется из-за проблем с безопасностью.

Итак, вы должны использовать mkstemp в POSIX или tmpfile_s в Windows вместо tmpfile().

Однако все они будут создавать файлы в файловой системе. Они временны в том, что они «уходят», когда программа выходит.

Другой вариант, который не создает физический файл, - mmap().

0

Если вы работаете в Unix (или аналогичной ОС), вы хотите прочитать Руководство Beej по обмену Интерпроцессом Unix (это хорошо прочитано независимо от вашей ОС).
Посмотрите на Beej's Guides.

В быстром взгляде там я заметил несколько вещей, которые вы могли бы использовать с большей или меньшей работой (и с дополнительным созданием файла/ресурса):

  • Трубой
  • FIFOs
  • Очереди сообщений
  • сегментов разделяемой памяти
  • памяти Подключенные файлы
  • Unix Sockets
Смежные вопросы