Table des matières
1.fcntl" >1.fcntl
2.Exemple de verrouillage en lecture-écriture" >2.Exemple de verrouillage en lecture-écriture
3. Effectuez d'abord le verrouillage en lecture, puis le verrouillage en écriture. Les résultats sont les suivants : " >3. Effectuez d'abord le verrouillage en lecture, puis le verrouillage en écriture. Les résultats sont les suivants :
4. Si vous exécutez d'abord le verrou en écriture, puis le verrou en lecture, les résultats sont les suivants : " >4. Si vous exécutez d'abord le verrou en écriture, puis le verrou en lecture, les résultats sont les suivants :
Maison Tutoriel système Linux Une technique pour la programmation système Linux : utiliser fcntl() pour implémenter des verrous en lecture-écriture

Une technique pour la programmation système Linux : utiliser fcntl() pour implémenter des verrous en lecture-écriture

Feb 13, 2024 pm 04:03 PM
linux linux教程 linux系统 linux命令 shell脚本 Mécanisme de synchronisation Linux embarqué Débuter avec Linux apprentissage Linux

Le verrouillage en lecture-écriture est un mécanisme de synchronisation couramment utilisé, qui permet à plusieurs processus ou threads d'effectuer des opérations de lecture simultanées ou des opérations d'écriture mutuellement exclusives sur la même ressource, améliorant ainsi l'efficacité et la sécurité du système. Dans la programmation système Linux, il existe de nombreuses façons d'implémenter des verrous en lecture-écriture, comme l'utilisation de la bibliothèque pthread, l'utilisation de verrous de fichiers, etc. Cet article vous présentera une méthode d'utilisation de l'appel système fcntl() pour implémenter des verrous en lecture-écriture, ainsi que ses principes, son utilisation, ses avantages et ses inconvénients, afin que vous puissiez mieux utiliser et comprendre cette technique dans la programmation système Linux.

Linux 系统编程的一种技巧:使用 fcntl() 实现读写锁

Lorsque plusieurs processus accèdent en lecture et en écriture au même fichier, afin de garantir l'intégrité des données, le fichier doit être verrouillé. Les fichiers peuvent être verrouillés et déverrouillés via la fonction fcntl().

1.fcntl

1.1. Description de la fonction : Manipuler les caractéristiques des fichiers en fonction des descripteurs de fichiers.

1.2. Utilisation :

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock *lock);

fd : descripteur de fichier.

cmd : commande d'opération.

arg : paramètres utilisés par la commande. La nécessité ou non du paramètre arg dépend de la commande cmd.

lock : informations de verrouillage.

2.Exemple de verrouillage en lecture-écriture

Créez deux nouveaux fichiers, le code source est affiché en 2.1 et 2.2 ci-dessous.

2.1. Ajouter un verrou de lecture au fichier

#include 

\#include 

\#include 

\#include 

\#include 

int main(int argc, const char * argv [ ])

{

int fd = open("test.c", O_RDONLY);

if (fd == -1)

{

perror("open failed:");

return -1;

}

struct stat sta;

fstat(fd,&sta);

struct flock lock;  

lock.l_len = sta.st_size;

lock.l_pid = getpid();

lock.l_start = 0;

lock.l_type = F_RDLCK;

lock.l_whence = SEEK_SET;

printf("进程pid: %d\n",lock.l_pid);

if(fcntl(fd,F_SETLK,&lock) == -1)

{

perror("fcntl fail ");

return -1;

}

else

{

printf("add read lock success!\n");

}

sleep(10);

close(fd);

return 0;

}

2.2.给文件加写锁

\#include 

\#include 

\#include 

\#include 

\#include 

int main(int argc, const char * argv [ ])

{

int fd = open("test.c", O_WRONLY);

if (fd == -1)

{

perror("open failed:");

return -1;

}

struct stat sta;

fstat(fd,&sta);

struct flock lock;  

lock.l_len = sta.st_size;

lock.l_pid = getpid();

lock.l_start = 0;

lock.l_type = F_WRLCK;

lock.l_whence = SEEK_SET;

printf("进程pid: %d\n",lock.l_pid);

while(fcntl(fd,F_SETLK,&lock) == -1 )

{

perror("fcntl:");

sleep(1);

struct flock lock_1;

lock_1 = lock;

lock_1.l_type = F_WRLCK;  //

fcntl(fd,F_GETLK,&lock_1);//获取文件锁状态,及加锁(lock_1.l_type)能否成功

switch(lock_1.l_type)

{

case F_RDLCK:

printf("检测到读锁 pid = %d \n",lock_1.l_pid);

break;

case F_WRLCK:

printf("检测到写锁 pid = %d \n",lock_1.l_pid);

break;

case F_UNLCK:

printf("检测到已解锁.pid = %d \n",lock_1.l_pid);

}

}

printf("写锁设置成功\n");

getchar();

close(fd);

return 0;

}


Copier après la connexion

/*

Remarque :

1. Lock_1 dans fcntl(fd,F_GETLK,&lock_1) doit être initialisé et lock_1.l_type doit être défini sur le verrou correspondant pour déterminer si le verrou peut être verrouillé avec succès et la raison de l'échec.

2. Lorsque GETLK, fcntl détecte d'abord s'il existe un verrou qui peut empêcher ce verrouillage, s'il existe, il écrase les informations de la structure flock (lock_1). Sinon, définissez le type de lock_1.l_type sur F_UNLCK.

*/

Pour les verrous en écriture (verrous exclusifs F_WRLCK), un seul processus peut bénéficier d'un verrou exclusif sur une zone spécifique du fichier.

Pour les verrous en lecture (verrous partagés F_RDLCK), de nombreux processus différents peuvent détenir des verrous partagés sur la même zone du fichier en même temps. Afin de détenir un verrou partagé, le fichier doit être ouvert en lecture ou en lecture/écriture. Tant qu'un processus possède un verrou partagé, aucun autre processus ne peut obtenir un verrou exclusif.

Compilez et exécutez séparément :

3. Effectuez d'abord le verrouillage en lecture, puis le verrouillage en écriture. Les résultats sont les suivants :

liu@ubuntu:~/learn/lrn_linux$ ./readlock.out 

进程pid: 16458

add read lock success!

liu@ubuntu:~/learn/lrn_linux$ ./writelock.out 

进程pid: 16459

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到读锁 pid = 16458 

fcntl:: Resource temporarily unavailable

检测到已解锁.pid = 16459 
Copier après la connexion

Écrire le verrouillage défini avec succès

On constate que lorsque le fichier est occupé par un verrou en lecture, un verrou en écriture (verrou exclusif) ne peut pas être ajouté

4. Si vous exécutez d'abord le verrou en écriture, puis le verrou en lecture, les résultats sont les suivants :

liu@ubuntu:~/learn/lrn_linux$ ./writelock.out 
Copier après la connexion

Pid de processus : 16349

Écrire le verrouillage défini avec succès

liu@ubuntu:~/learn/lrn_linux$ ./readlock.out 
Copier après la connexion

Pid de processus : 16350

fcntl fail : Resource temporarily unavailable
Copier après la connexion

Le verrouillage est donc réussi.

Grâce à cet article, vous devez avoir une compréhension de base de la méthode d'utilisation de fcntl() pour implémenter des verrous en lecture-écriture dans la programmation système Linux, et connaître ses principes, son utilisation, ses avantages et ses inconvénients. Vous devez également comprendre le but et l'impact de l'utilisation de fcntl() pour implémenter des verrous en lecture-écriture, et comment utiliser et configurer correctement fcntl() dans la programmation système Linux. Nous vous recommandons d'utiliser fcntl() pour atteindre vos objectifs dans les scénarios où vous devez implémenter des verrous en lecture-écriture. Dans le même temps, nous vous rappelons également de prêter attention à certains problèmes et défis potentiels lors de l'utilisation de fcntl(), tels que la compatibilité, la portabilité, les performances, etc. J'espère que cet article pourra vous aider à mieux utiliser la programmation système Linux et vous permettre de maîtriser les compétences et les avantages de fcntl() sous Linux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment configurer la tâche de synchronisation APScheduler en tant que service sur macOS? Comment configurer la tâche de synchronisation APScheduler en tant que service sur macOS? Apr 01, 2025 pm 06:09 PM

Configurez la tâche de synchronisation APScheduler en tant que service sur la plate-forme MacOS, si vous souhaitez configurer la tâche de synchronisation APScheduler en tant que service, similaire à Ngin ...

Quatre façons d'implémenter le multithreading dans le langage C Quatre façons d'implémenter le multithreading dans le langage C Apr 03, 2025 pm 03:00 PM

Le multithreading dans la langue peut considérablement améliorer l'efficacité du programme. Il existe quatre façons principales d'implémenter le multithreading dans le langage C: créer des processus indépendants: créer plusieurs processus en cours d'exécution indépendante, chaque processus a son propre espace mémoire. Pseudo-Multithreading: Créez plusieurs flux d'exécution dans un processus qui partagent le même espace mémoire et exécutent alternativement. Bibliothèque multi-thread: Utilisez des bibliothèques multi-threades telles que PTHEADS pour créer et gérer des threads, en fournissant des fonctions de fonctionnement de thread riches. Coroutine: une implémentation multi-thread légère qui divise les tâches en petites sous-tâches et les exécute tour à tour.

Comment ouvrir web.xml Comment ouvrir web.xml Apr 03, 2025 am 06:51 AM

Pour ouvrir un fichier web.xml, vous pouvez utiliser les méthodes suivantes: Utilisez un éditeur de texte (tel que le bloc-notes ou TextEdit) pour modifier les commandes à l'aide d'un environnement de développement intégré (tel qu'Eclipse ou NetBeans) (Windows: Notepad web.xml; Mac / Linux: Open -A TextEdit web.xml)

L'interprète Python peut-il être supprimé dans le système Linux? L'interprète Python peut-il être supprimé dans le système Linux? Apr 02, 2025 am 07:00 AM

En ce qui concerne le problème de la suppression de l'interpréteur Python qui est livré avec des systèmes Linux, de nombreuses distributions Linux préinstalleront l'interpréteur Python lors de l'installation, et il n'utilise pas le gestionnaire de packages ...

À quoi sert le mieux le Linux? À quoi sert le mieux le Linux? Apr 03, 2025 am 12:11 AM

Linux est mieux utilisé comme gestion de serveurs, systèmes intégrés et environnements de bureau. 1) Dans la gestion des serveurs, Linux est utilisé pour héberger des sites Web, des bases de données et des applications, assurant la stabilité et la fiabilité. 2) Dans les systèmes intégrés, Linux est largement utilisé dans les systèmes électroniques intelligents et automobiles en raison de sa flexibilité et de sa stabilité. 3) Dans l'environnement de bureau, Linux fournit des applications riches et des performances efficaces.

Comment est la compatibilité Debian Hadoop Comment est la compatibilité Debian Hadoop Apr 02, 2025 am 08:42 AM

Debianlinux est connu pour sa stabilité et sa sécurité et est largement utilisé dans les environnements de serveur, de développement et de bureau. Bien qu'il y ait actuellement un manque d'instructions officielles sur la compatibilité directe avec Debian et Hadoop, cet article vous guidera sur la façon de déployer Hadoop sur votre système Debian. Exigences du système Debian: Avant de commencer la configuration de Hadoop, assurez-vous que votre système Debian répond aux exigences de fonctionnement minimales de Hadoop, qui comprend l'installation de l'environnement d'exécution Java (JRE) nécessaire et des packages Hadoop. Étapes de déploiement de Hadoop: Télécharger et unzip Hadoop: Téléchargez la version Hadoop dont vous avez besoin sur le site officiel d'Apachehadoop et résolvez-le

Debian Strings est-il compatible avec plusieurs navigateurs Debian Strings est-il compatible avec plusieurs navigateurs Apr 02, 2025 am 08:30 AM

"Debianstrings" n'est pas un terme standard, et sa signification spécifique n'est pas encore claire. Cet article ne peut pas commenter directement la compatibilité de son navigateur. Cependant, si "DebianStrings" fait référence à une application Web exécutée sur un système Debian, sa compatibilité du navigateur dépend de l'architecture technique de l'application elle-même. La plupart des applications Web modernes se sont engagées à compatibilité entre les navigateurs. Cela repose sur les normes Web suivantes et l'utilisation de technologies frontales bien compatibles (telles que HTML, CSS, JavaScript) et les technologies back-end (telles que PHP, Python, Node.js, etc.). Pour s'assurer que l'application est compatible avec plusieurs navigateurs, les développeurs doivent souvent effectuer des tests croisés et utiliser la réactivité

See all articles