J'écris un outil d'archivage (ONU) et la façon dont il est conçu, il crée d'abord un fichier régulier à partir des archives avant d'examiner les attributs spéciaux et peut décider que cet article est un lien symbolique, en fait. P >
Note: Avant d'autres personnes me malentent mal pour vouloir faire un lien symbolique de em> un fichier. Non, j'écris les données Symlink, c'est-à-dire son chemin, dans le fichier, puis je voudrais dire au système de fichiers qu'il s'agit d'un lien symbolique fort> p>
Je développe cela sur OS X, où il est possible de transformer un fichier régulier en un symbole symbolique en définissant simplement ses codes de type et de créateur en conséquence. P>
Maintenant, j'aime bien faire fonctionner ce code sur Linux. J'ai donc envie de trouver une manière similaire là-bas. P>
Je suis conscient que la façon normale de créer un symbole symbolique doit appeler la fonction symbolique (), mais je me demande s'il existe également un moyen de modifier un fichier régulier en un symbole symbolique, tout comme il est possible dans le système BSD de OSX, Donc, je n'ai pas trop de refroidir mon code de travail trop? P>
Il y a Lstat (), qui renvoie le type de fichier dans les bits les plus optimistes de ST_MODE. Maintenant, je me demande s'il y a aussi une fonction Setter analogue pour ce champ de mode. P>
3 Réponses :
Je ne crois pas qu'il y ait un moyen de le faire comme vous le décrivez. IIRC, le système de fichiers stocke des informations liMLink dans la table Inode et non dans un fichier régulier, il n'ya donc aucune façon directe de transformer un fichier dans un lien. P>
Si le chemin de Symlink est stocké dans le fichier, pourquoi ne pas lire le chemin, supprimer le fichier et créer un symbole symbolique à sa place? P>
J'accepte cette réponse non pour sa suggestion de travail plutôt évidente, mais pour l'explication pour laquelle il n'y a pas de moyen de faire ce que je voulais faire. J'espère que votre explication est correcte :)
Peut-être que je suis confus de n'ai pas lu soigneusement suffisamment, mais selon Cette réponse , j'ai conclu qu'un lien symbolique est juste un fichier avec un fichier Drapeau spécial dans l'inode. Ce drapeau ne peut-il pas être retourné alors?
@Alexy Il est plus compliqué que cela, car vous avez des inodes de niveau de noyau, plus un tas de substances spécifiques à la mise en œuvre, qui varie du système de fichiers au système de fichiers. Si vous vous trouvez besoin de manipuler des liens symboliques à ce faible niveau, vous faites probablement quelque chose de difficile.
Non, vous ne pouvez pas transformer l'un dans l'autre. Vous devez dissuader de tuer le fichier, puis de Symlink pour créer un lien symbolique comme remplacement. P>
Il serait préférable de créer un lien symbolique avec un nom différent, puis renommez-le sur le fichier d'origine. Il s'agit d'un remplacement atomique et il n'y aura pas de lacune dans laquelle le nom de fichier est manquant (comme cela se produit après votre Dislink).
démontrer ce que j'ai écrit comme un commentaire à la réponse de Bmarguiles,
$ vi f2s.c ... $ cc -o f2s f2s.c $ echo -n / > test $ ./f2s test $ ls -l test lrwxrwxrwx 1 me me 1 Feb 24 23:17 test -> / $ echo -n / > test2 $ strace ./f2s test2 open("test2", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0 read(3, "/", 1) = 1 close(3) = 0 symlink("/", "test2~") = 0 rename("test2~", "test2") = 0
Je suis curieux de savoir pourquoi l'utilisation de realloc () code> sur
malloc () code>?
Surtout parce que je suis paresseux et que je n'ai envie que de taper un seul gratuit code> à la fin. Ce n'est pas un code de qualité de la production.
Vous n'êtes pas aussi paresseux que vous le pensez, vous avez déjà deux gratuit () code> 's =)
Haha ouais, et rétrospectivement, se déplaçant vers un MALLOC + GRATUIT code> à l'intérieur de la boucle serait vraiment autant de travail pour que je puisse la saisir. Néanmoins, j'ai écrit cela rapidement dans la forme de réponse de la pile - vous avez de la chance que j'ai même pris la peine de copier, de compiler et de le tester :-)
Merci d'avoir fait l'effort de démontrer cela. Ce n'était pas vraiment nécessaire mais j'apprécie l'effort. Je suis déchiré entre accepter votre réponse pour les efforts supplémentaires vs BTA's pour sa réponse à ma question. Je vais vous donner un autre et lui la coche, comme vous avez déjà deux onduleurs. J'espère que cela ne ressemble pas trop injuste.
Vérification si je comprends: vous souhaitez transformer un fichier régulier en un symbole symbolique qui pointe sur ce que le fichier contenait?
Ralated à la nouvelle question "Qu'est-ce qui est là derrière un lien symbolique?" . De la réponse acceptée, j'ai conclu que la différence entre un fichier ordinaire et un symbole symbolique est dans un drapeau de l'inode, alors j'imagine que cela vous échappe que le drapeau devrait suffire, mais je suppose que ce n'est pas si facile.