Utiliser chmod dans un programme C
J'ai un programme où j'ai besoin de définir les permissions d'un fichier (disons /home/hello.t
) à l'aide de chmod
et j'ai à lire les autorisations à définir à partir d'un fichier. Pour cela, j'ai d'abord lu les autorisations dans un tableau de caractères, puis essayez de modifier les permissions de ce fichier. Mais je vois que les autorisations sont définies de manière étrange.
Un exemple de programme que j'ai écrit:
main()
{
char mode[4]="0777";
char buf[100]="/home/hello.t";
int i;
i = atoi(mode);
if (chmod (buf,i) < 0)
printf("error in chmod");
}
Je vois que les permissions de ce fichier ne sont pas mis en 777. Pouvez-vous svp m'aider sur la façon de définir les permissions de ce fichier après avoir lu la même chose à partir d'un tableau de caractères.
source d'informationauteur Raghav
Vous devez vous connecter pour publier un commentaire.
La
atoi()
fonction ne traduit que la décimale, non octal.Pour octal la conversion, l'utilisation
strtol()
(ou, comme Chris Bouffon-Jeune points,strtoul()
- bien que la validité de tailles de fichier de modes d'autorisation pour Unix tous tenir dans un délai de 16 bits, et donc ne sera jamais produire un négatiflong
de toute façon) avec 0 ou 8 comme base. En fait, dans ce contexte, en précisant 8 est le meilleur. Il permet aux gens d'écrire des 777 et obtenir la bonne valeur octale. Avec une base de 0 spécifié, la chaîne 777 est décimal (encore une fois).En outre:
main()
; être explicite tel que requis par la C99 et l'utilisationint main(void)
ouint main(int argc, char **argv)
.Ne pas jouer avec les hacher les zéros hors tension de votre chaîne.
Cela empêche C de stocker un terminal null mal! Utilisation:
Il alloue les 5 octets nécessaires pour stocker la chaîne avec un terminateur null.
Signaler des erreurs sur
stderr
passtdout
.<string.h>
en-tête (pourstrerror()
) et<errno.h>
pourerrno
. En outre, le statut de sortie du programme doit indiquer l'échec lors de lachmod()
opération échoue.De mettre toutes les modifications des rendements:
Être prudent avec
errno
; il peut changer lorsque les fonctions sont appelées. Il est assez sûr ici, mais dans de nombreux scénarios, c'est une bonne idée de capturererrno
dans une variable locale et l'utilisation de la variable locale dans les opérations d'impression, etc.Noter aussi que le code n'a pas de contrôle d'erreur sur le résultat de
strtol()
. Dans ce contexte, il est assez sûr; si l'utilisateur a fourni la valeur, ce serait une mauvaise idée de leur faire confiance pour faire les choses.Un dernier commentaire: en règle générale, vous ne devriez pas utiliser 777 permission sur les fichiers (ou répertoires). Pour les fichiers, cela signifie que vous n'avez pas l'esprit qui se met à modifier votre programme exécutable ou comment. Ce n'est généralement pas le cas; vous ne les soins ou les soins) qui modifie vos programmes. En général, ne font pas de fichiers de données exécutable à tous; dans le cas de fichiers exécutables, de ne pas donner publics d'accès en écriture et regarder de travers au groupe l'accès en écriture. Pour les répertoires, les publics de l'autorisation d'écriture signifie que vous n'avez pas l'esprit qui supprime tous les fichiers dans le répertoire (ou ajoute des fichiers). De nouveau, de temps en temps, cela peut être le bon paramètre d'autorisation à utiliser, mais il est très rarement correct. (Pour les répertoires, il est généralement une bonne idée d'utiliser le "sticky bit" trop: 1777 permission est ce qui est généralement utilisé sur
/tmp
par exemple - mais pas sur MacOS X.)