Existe-t-il une fonction POSIX pour copier un fichier?
Maintenant à la recherche par le biais de certains OS fonctions je trouve que sur les systèmes POSIX, vous avez C appels de fonction comme unlink()
pour supprimer des fichiers, link()
à créer des liens en dur pour les fichiers, symlink()
pour créer des fichiers symboliques, rename()
pour déplacer un fichier, mais ... où est une fonction de copy()
un fichier?
Je sais que la façon habituelle est de simplement ouvrir le fichier source, lire son contenu, ouvrez un fichier de destination et de vidage. Mais pourquoi ne puis-je pas trouver une telle fonction d'utilité compte tenu de tous les précédents?
source d'informationauteur Grzegorz Adam Hankiewicz
Vous devez vous connecter pour publier un commentaire.
Lorsque l'on parle de "la copie d'un fichier", deux sémantique existent:
Windows /DOS systèmes de fichiers, traditionnellement, n'ont pas de "copie" le mécanisme, mais un*X a toujours eu, dans la forme de des liens en dur.
Donc POSIX/ONU*X a la
link(2)
système d'appel pour établir une nouvelle référence à l'existant "fichier de données" sous un nouveau nom, par exemple, faire un copie superficielle.Une "copie" de l'appel système n'a de sens que si il y a un "fast copie en profondeur le mécanisme" - par exemple, dans le cas où le sous-jacente du système de fichiers met en œuvre quelque chose comme deduplucation à faire au niveau du fichier de clonage.
Autrement, une telle fonction serait de "dégrader" (revenir à) une mise en œuvre de bibliothèque.
De l'ONU*X mécanisme afin de permettre quelque chose comme système de fichiers spécifiques que c'est
ioctl()
le "évier de cuisine de I/O extensibilité". Pour un exemple comment utiliser cet établissement, le cas échéant, de la copie de fichiers, voir cette GNU coreutils post avec une demande d'amélioration pour utiliser un fichier de clonage sur BTRFS.Étant donné que Windows
CopyFile
est en faitCopyFileEx
sans un rappel, je doute fort c'est vraiment un appel système; c'est une fonction d'utilité. Pour le Vin Émulateur Windowsvous pouvez vérifier la kernel32.dll source de la mise en œuvre, trouverCopyFileEx
dans le Vin sources,dll/kernel32/chemin d'accès.c
pour un exemple de la façon dont cette peut être fait.Démontage /Décompilation de Windows réelle
kernel.dll
n'est pas autorisé en vertu de Microsoft licensing, donc je ne peut légalement faire valoir que Windows lui-même fait la même chose, c'est à direCopyFile
est un système de base de la mise en œuvre, pas un appel système.De comparer Windows et de l'ONU*X de nouveau ici... pas tout dans un*X libc est un appel système, c'est pourquoi l'ONU*X pages de manuel, la distinction entre l'article 2 (sys appels) et de l'article 3 (bibliothèque d'exécution des interfaces). La même chose est vraie pour les fonctions en
kernel.dll
sur Windows - certains d'entre eux sont "direct passthrough", tandis que d'autres sont plus complexes "les fonctions de l'utilitaire" pas mis en œuvre par l'intermédiaire d'un unique appel système.J'ai essayé de courir strace sur la commande cp sur Linux et il fait ouvrir les deux fichiers et il lit à partir d'un fichier et écrire à l'autre dans des blocs de 32768 octets:
Alors oui, il n'y a pas de cp syscall. Espérons qu'il vous aide.
Vous ne pouvez pas trouver la fonction d'utilité pour la copie d'un fichier, car il n'y a pas besoin pour cela de la même manière; il peut être construit à partir de "pièces de rechange". Des fonctions comme
unlink()
etsymlink()
ne peut pas être construit en fonction d'autres fonctions, alors que les fonctions comme un hypothétiquecopy_file()
pouvez (vous devez).Donné deux d'ouvrir le fichier torrents,
f1
pour la lecture et l'f2
pour l'écriture, alors vous pourriez utiliser:La
err_syserr()
fonction de rapport d'erreurs, y compris la chaîne de caractères passée en argument et le message d'erreur implicite parerrno
*; il n'en revient pas.BUFSIZ
est défini dans<stdio.h>
mais vous pourriez choisir d'utiliser une valeur plus grande. Vous préférerez peut-être pas de rapport d'erreur de ce genre, mais que la fonction renvoie 0 en cas de succès et -1 en cas d'un échec.Notez que parce que la fonction n'est pas à ouvrir les fichiers, il ne ferme pas non plus. Cela signifie que vous pouvez l'utiliser pour concaténer plusieurs fichiers d'entrée à un seul fichier de sortie, par exemple. Vous pouvez utiliser une fonction wrapper pour ouvrir un fichier en lecture et l'autre pour l'écriture.
* en Fait,
err_syserr()
est une fonction commeprintf()
qui prend une chaîne de format et d'autres arguments, puis affiche le message d'erreur tel que décrit et les sorties.POSIX systèmes ne fournissent pas d'appels système comme fonction CopyFile dans Win32, alors ne perdez pas votre temps à chercher les
Copy_file()
fonction. Si vous ne voulez pas de réinventer la roue, je pense que c'est une bonne idée d'utiliserfork()
pour créer un nouveau processus et appelexecl()
. Comme ceci: