Анонимный поток в c - PullRequest
       9

Анонимный поток в c

1 голос
/ 05 октября 2009

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

Ответы [ 4 ]

6 голосов
/ 05 октября 2009

Может быть, вы ищете трубы.

Направьте свой 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;
}
1 голос
/ 05 октября 2009

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

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

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

Другая опция, которая не создает физический файл: mmap ().

0 голосов
/ 05 октября 2009

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

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

  • Труба
  • FIFOs
  • очереди сообщений
  • Сегменты общей памяти
  • Отображенные в память файлы
  • Unix Sockets
0 голосов
/ 05 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...