7
votes

Comment traiter les données de RAM comme s'il s'agissait d'un vrai fichier?

Donc, j'ai des données temporaires dans mon programme (en RAM). Je veux en quelque sorte faire sembler comme c'est un fichier (par exemple pour l'envoyer dans un autre programme qui prend un lien de fichier comme argument)?

est-ce possible?

Comment faire une telle chose?


4 commentaires

Quel système d'exploitation courez-vous?


Qu'est-ce qui ne va pas avec simplement écrire les données à un fichier "réel" et envoyer ce fichier comme un argument?


@Codeka: Je ne sais pas ... peut-être parce que l'accès au disque dur est UHM ... lent?


@Liranuna: Consultez ma réponse, l'écriture sur le disque ne doit pas être lente, en particulier pour les fichiers temporaires.


5 Réponses :


0
votes

Vous pouvez utiliser pipe () xxx


3 commentaires

Pas une fonction Windows (voir Commentaire sur la question)


Oui, j'ai compris que, avant que la question n'ait été modifiée, aucun système d'exploitation n'a été spécifié


Bien que je suis d'accord, il n'est pas possible de faire la manière de faire de la Windows d'utiliser des fonctions POSIX telles que le tuyau sous Windows (par exemple en utilisant Cygwin), mais je suis d'accord que ce n'est pas la réponse que je donnerais pour Windows



1
votes

Vous pouvez le faire en C à l'aide de la fonction popen () Fonction: xxx

Ceci est possible si votre programme externe lit son entrée de stdin < / code>.


4 commentaires

@Billy Oneal: C'est vrai, mais toute implémentation générale de C offre une fonction de type (bien qu'elle puisse être appelée _popen () comme dans MSVC).


Cela suppose également que l'OP souhaite exécuter / démarrer le programme externe de l'intérieur de l'intérieur qui détient les données. Néanmoins, cette solution est slick.


Sauf si vous êtes sous Windows. _Popen ne fonctionne pas correctement à moins que vous démarrez l'application donnée à l'aide du sous-système de console plutôt que du sous-système Windows.


En outre, vous ne pouviez pas passer le nom du tuyau à une autre application Windows en attendant un nom de fichier.



0
votes

Oui, c'est possible. Vous pouvez transférer vos données sur votre autre application via un Communication interprocessante Mécanisme:

  1. Selon votre système d'exploitation, vous avez des options différentes ici. Vous pouvez créer un tuyau, car d'autres affiches ont mentionné ici, autant d'OSES ont des pipes.
  2. Vous pouvez également utiliser la mémoire partagée.
  3. Vous pouvez simplement l'écrire dans un fichier, puis vous ouvrir ce fichier dans votre autre application.
  4. De nombreux OSE ont d'autres techniques que vous pouvez utiliser.

    EDIT: MSDN répertorie tous les mécanismes IPC disponibles pour Windows ici .


2 commentaires

Quels processus sont intercommunant? La réponse n'a pas de sens.


@samoz - The Op décrit deux programmes - son qui a les données dans la RAM qu'il souhaite envoyer, et une autre qui doit recevoir ces données. Programme == processus lorsqu'ils exécutent dans le système d'exploitation.



11
votes

Si supporté par votre système d'exploitation (systèmes Unixoid et Windows DO), vous pouvez essayer d'utiliser Fichiers mappés de mémoire .


1 commentaires

+1. De cette façon, les données ne sont pas copiées à moins que l'OS ne décide que cela doit être.



17
votes

Pourquoi ne pas simplement écrire le fichier sur le disque? Si l'écriture sur le disque est trop lente, vous pouvez transmettre le drapeau fichier_attribute_temporary sur CreateFile pour conserver les données dans le cache (et évitez de l'écrire sur le périphérique physique).

Parfois, les solutions évidentes sont les meilleures ...


4 commentaires

C'est la bonne façon de le faire. +5 si possible.


+1 Mais je suppose que c'est une question de la taille de la grande cache et du fichier, et en espérant que le premier est plus grand que la seconde!


@MDMA: True, mais si le cache est trop petit pour s'adapter au fichier, vous pourriez faire valoir qu'il n'est probablement pas bon de garder le fichier entier en mémoire en premier lieu. La bonne chose à propos de file_attribute_temporary est que s'il n'y a pas assez d'espace dans le cache, cela utilisera toujours le système de fichiers afin que vous n'ayez pas à vous inquiéter.


Pourquoi ne pas: parce que vous copiez les données de votre RAM vers System RAM, en utilisant le double de la quantité de mémoire. Mémoire de mappage d'un fichier ne fait pas.