je dois créer une fonction qui pose un verrou sur une partie de mon script unix (notamment lorsque j'écris dans une partie d'un fichier) et une autre qui le lève.
Du genre
//Variant 0: pas de lock
//Variant 1: lock bloquant
//Variant 2: lock non-bloquant
int verrouillage(int fd, int offset, int variant)
{
}
//Deverouille -> Attention a l'offset: un offset invalide peut creer des petits bouts de fichier verrouille.
void deverrouillage(int fd, int offset)
{
}
Je sais qu'il faut utiliser la fonction lockf().
Est-ce que j'ai le droit de faire quelque chose comme ça
int cmd;
if (variant == 0) {
return 0;
} else if (variant == 1) {
cmd=F_LOCK;
} else if (variant == 2) {
cmd=F_TLOCK;
}
et ensuite
lockf(fd,cmd,len);
J'ai lu la documentation mais je ne compends pas bien comment l'utiliser quand même. Comme on n'a pas eu de cours, directement le TP à réaliser et plus de prof sous la main pour poser des questions (dans cette matière)...Je suis preneuse de tout fragment d'explication ! Merci
Bon, j'ai fini, je ne sais pas si ça fonctionne correctement car je ne sais pas comment je peux vérifier ça mais mon programme s'execute correctement et compile sans erreur.
//Variant 0: pas de lock
//Variant 1: lock bloquant
//Variant 2: lock non-bloquant
int verrouillage(int fd, int offset, int variant) {
int cmd;
switch (variant) {
case 0:
return 0;
case 1:
cmd = F_LOCK;
break;
case 2:
cmd = F_TLOCK;
break;
default:
return 0;
}
if (lockf(fd, cmd, offset) == -1) {
perror("Verrouillage impossible\n");
return -1;
} else {
return 0;
}
}
//Deverouille -> Attention a l'offset: un offset invalide peut creer des petits bouts de fichier verrouille.
void deverrouillage(int fd, int offset)
{
if (lockf(fd, F_ULOCK, offset) == -1) {
perror("Deverrouillage impossible\n");
exit(2);
}
}
et je les appelle comme ça
//Ajoute une entree en fin de fichier
void ajout(char* fileName)
{
int fd;
int fdbis;
struct contact newContact;
scanContact(&newContact);
if ((fd=open(fileName,O_WRONLY|O_APPEND|O_CREAT,BUFF_SIZE))<0)
{
perror("Error open fichier Contact");
exit(2);
}
fdbis=fd;
if (verrouillage(fd,sizeof(struct contact),1)==-1){
perror("Verrouillage impossible");
} else {
if(write(fd,&newContact,sizeof(newContact))!=sizeof(struct contact)) {
perror("Error write fichier Contact");
exit(2);
} else {
deverrouillage(fdbis,sizeof(struct contact));
}
}
close(fd);
}
//Modifie une entree donnee
void modificationEntree(char* fileName)
{
int fd,i,cpt,fdbis;
void * buffer;
int nbOct;
int lireID,lireNom,lirePrenom;
struct contact lireContact;
printf("Quelle entree souhaitez vous modifier ? ");fflush(stdout);
scanf("%d",&cpt);
i=0;
if ((fd=open(fileName,O_RDWR,BUFF_SIZE))<0)
{
perror("Error open fichier source");
exit(2);
}
while(i<(cpt-1)) {
if((lireID=read(fd,&lireContact,sizeof(struct contact)))!=sizeof(struct contact))
{
perror("Erreur read");
exit(2);
}
i++;
}
scanContact(&lireContact);
if (verrouillage(fd,sizeof(struct contact),2)==-1){
perror("ajout impossible");
} else {
fdbis=fd;
if(write(fd,&lireContact,sizeof(struct contact))!=sizeof(struct contact))
{
perror("Error write fichier Contact");
exit(2);
} else {
deverrouillage(fdbis,sizeof(struct contact));
}
}
close (fd);
}//fin de modificationEntree
Merci beaucoup pour ces remarques, je vais modifier tout ça!
Je n'étais pas très sûre d'avoir le droit de faire ce que j'ai fait pour la position de la tete de lecture dans mon fichier. J'ai copié le fd dans un fdbis pour pouvoir revenir en arrière déverouiller ma portion de code. J'aurais peut-être du utiliser lseek...
fonction lockf()
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.