From abd096bb213dbd138e655327630f6e4734c30d55 Mon Sep 17 00:00:00 2001
From: Moncef STITI <moncef.stiti@etu.u-pec.fr>
Date: Mon, 2 Dec 2024 20:45:45 +0100
Subject: [PATCH] =?UTF-8?q?Ajouts=20de=20la=20version=20non=20s=C3=A9curis?=
 =?UTF-8?q?=C3=A9e=20+=20Makefile=20+=20G=C3=A9n=C3=A9rateur=20de=20fichie?=
 =?UTF-8?q?rs=20.db?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Data/accounts.db                  | 512 ++++++++++++++++++++++++++++++
 DataGenerator/Makefile            |  13 +
 DataGenerator/README.md           |  71 +++++
 DataGenerator/generate_accounts.c | 124 ++++++++
 Secured/Makefile                  |  13 +
 Secured/README.md                 |   1 +
 Secured/secured_transaction.c     |   0
 Unsecured/Makefile                |  13 +
 Unsecured/README.md               |  31 ++
 Unsecured/unsecured_transaction.c | 165 ++++++++++
 10 files changed, 943 insertions(+)
 create mode 100644 Data/accounts.db
 create mode 100644 DataGenerator/Makefile
 create mode 100644 DataGenerator/README.md
 create mode 100644 DataGenerator/generate_accounts.c
 create mode 100644 Secured/Makefile
 create mode 100644 Secured/README.md
 create mode 100644 Secured/secured_transaction.c
 create mode 100644 Unsecured/Makefile
 create mode 100644 Unsecured/README.md
 create mode 100644 Unsecured/unsecured_transaction.c

diff --git a/Data/accounts.db b/Data/accounts.db
new file mode 100644
index 0000000..6cdc957
--- /dev/null
+++ b/Data/accounts.db
@@ -0,0 +1,512 @@
+SBF     1002034
+Alameda  291573
+FTX       52180
+Aaliyah    3193
+Aaron       650
+Abel       3351
+Abigail    2510
+Abraham    5635
+Ace        8555
+Ada        3618
+Adalyn     5884
+Adalynn    5958
+Adam       6610
+Addison    7883
+Adeline    5831
+Adelyn     5882
+Adonis     1137
+Adrian     7247
+Adriel     9517
+Aidan       533
+Aiden      1507
+Alaia      9478
+Alaina     6923
+Alan       3141
+Alana      1493
+Alani      5758
+Alayna     9966
+Alex       3177
+Alice      1561
+Alina      1210
+Alivia     2704
+Aliyah     1417
+Allison     568
+Alyssa     6457
+Amara      5224
+Amari      7391
+Amaya       642
+Amelia     8502
+Amir       1171
+Amira      4334
+Amy        1182
+Ana        5100
+Andrea     5615
+Andres     8695
+Andrew     7338
+Angel      1525
+Angela     8126
+Anna       1230
+Annie      9660
+Anthony     662
+Antonio    2714
+Archer     3451
+Aria        535
+Ariana     4802
+Arianna     352
+Ariel      9650
+Ariella    7061
+Arlo       6744
+Arthur     1859
+Arya       6755
+Asher      7920
+Ashley     8160
+Ashton     3877
+Aspen      7614
+Athena     6937
+Atlas      8190
+Atticus    2419
+Aubree     4877
+Aubrey     6328
+Audrey     6642
+August     8444
+Aurora     1403
+Austin     8905
+Autumn     6558
+Ava        9948
+Avery      9039
+Axel       9508
+Ayden      8588
+Ayla       9081
+Bailey     4803
+Barrett    9995
+Beau       8519
+Beckett    8165
+Beckham    9778
+Bella      4265
+Bennett    9700
+Bentley    2972
+Blake      6017
+Blakely    5423
+Bodhi      6378
+Brady      9117
+Brandon    4983
+Braxton    7364
+Brayden    1770
+Brianna     697
+Brielle    8041
+Brody      6123
+Brooke     6119
+Brooks     8496
+Bryan      3502
+Bryce      9246
+Bryson     7691
+Caden      8359
+Caleb      7617
+Callie     6316
+Callum     7787
+Calvin      222
+Camden     4145
+Cameron    9308
+Camila     9245
+Camille    1912
+Carlos     4820
+Carson     5447
+Carter     3933
+Cash       9696
+Cecilia    1122
+Charlee    7386
+Charles    8009
+Charlie    5190
+Chase      2952
+Chloe      8528
+Claire     5932
+Clara      5654
+Clayton    4180
+Cohen      2205
+Cole       1540
+Colin      6879
+Colt       5743
+Colton     3352
+Connor     9590
+Cooper     9204
+Cora       9256
+Crew        756
+Daisy      7731
+Dakota      715
+Dallas      185
+Damian     9556
+Damien     5030
+Daniel     1241
+Daniela    2533
+David      7693
+Dawson     3323
+Dean       3374
+Declan     7165
+Delaney    8922
+Delilah    5043
+Diana      7145
+Diego      8494
+Dominic    4487
+Dylan      1157
+Easton      429
+Eden       5737
+Edward     3671
+Elaina     4904
+Eleanor    6137
+Elena      4161
+Eli        8404
+Eliana     5790
+Elias      2146
+Elijah     9679
+Elise      4983
+Eliza      5808
+Ella       9500
+Elliana    4036
+Ellie      1723
+Elliot     5487
+Elliott    5745
+Eloise     7702
+Elsie      5916
+Ember      1491
+Emerson    2267
+Emersyn    3010
+Emery      5530
+Emilia     3532
+Emilio     2757
+Emily      9052
+Emma       7833
+Emmett     8018
+Enzo       8469
+Eric       8803
+Esther     1050
+Ethan         1
+Eva        8834
+Evan        200
+Evelyn     6608
+Everett    9216
+Everly     4547
+Ezekiel    1598
+Ezra       7906
+Faith         4
+Felix      5767
+Finley     6310
+Finn       7201
+Freya      8723
+Gabriel    5737
+Gael       8659
+Gavin      4169
+Gemma      7147
+Genesis    2299
+George       15
+Georgia    9995
+Gia        8006
+Gianna     5480
+Grace       760
+Gracie     8384
+Graham     8418
+Grant      9280
+Grayson    5715
+Greyson    4484
+Griffin    5850
+Hadley     2114
+Hailey     5555
+Hannah     9112
+Harlow     2691
+Harmony    2063
+Harper     9581
+Haven      1924
+Hayden     9966
+Hayes      8086
+Hazel      5300
+Hendrix    5818
+Henry      9248
+Holden     4102
+Hope        692
+Hudson     5088
+Hunter     4404
+Ian        6817
+Iris       1080
+Isaac      5999
+Isabel      359
+Isaiah     7753
+Isla       1017
+Israel      594
+Ivan        664
+Ivy        6304
+Jace       4407
+Jack       3990
+Jackson      24
+Jacob       170
+Jade       3440
+James      8926
+Jameson    6604
+Jane        498
+Jasmine    3051
+Jason      9728
+Jasper     2828
+Javier     7855
+Jax        8908
+Jaxon      4189
+Jaxson     2730
+Jayce      7589
+Jayden     6240
+Jeremy     5982
+Jesse      8363
+Jesus      8294
+Jett       6246
+Joel       5807
+John       3155
+Jonah       747
+Jordan     8527
+Jordyn     9632
+Jorge      8063
+Jose       4601
+Joseph     9733
+Joshua     5949
+Josiah     9377
+Josie      8903
+Journee    4832
+Journey    9777
+Juan       6247
+Judah      1895
+Jude       6285
+Julia      4898
+Julian     5887
+Juliana    1534
+June       4494
+Juniper    6224
+Justin      638
+Kaden       492
+Kai        5817
+Kaia       6535
+Kaiden     4316
+Kailani    5645
+Kairo      6017
+Kaleb      7719
+Kali       6426
+Kamila     9026
+Karter     4248
+Kash       3053
+Kayden     9595
+Kayla      2358
+Kaylani    7512
+Kaylee     7742
+Kayson     2493
+Kehlani    9286
+Kennedy    8040
+Kenneth    5949
+Kevin       597
+Khloe      5500
+King       9997
+Kinsley    4396
+Knox       2027
+Kyler      4753
+Kylie       279
+Kyrie      6554
+Laila      2810
+Lainey      414
+Landon     8531
+Lane       8464
+Layla      9705
+Leah       2496
+Legend     7346
+Leila      3977
+Leilani     562
+Lennon     7681
+Lennox     8220
+Leo        7762
+Leon       2891
+Levi       2983
+Liam       7012
+Lila       4313
+Lilah      1404
+Liliana    2499
+Lilith     8127
+Lillian    4908
+Lilly      5729
+Lily       9859
+Lincoln    7871
+Logan      4065
+Lola       4705
+London     3089
+Londyn     1484
+Lorenzo    5020
+Louis       965
+Luca       6599
+Lucas       664
+Lucia      3616
+Lucille    4881
+Lucy       3361
+Luis       9748
+Luka       1935
+Lukas      8431
+Luke       9931
+Luna       6020
+Lydia       702
+Lyla        265
+Maddox     9929
+Madelyn    2379
+Madison    3422
+Maeve      6136
+Maggie     8802
+Malachi    1844
+Malakai    5814
+Malcolm    7431
+Malia      2025
+Marcus     3123
+Margot     5901
+Maria      6541
+Mariana    7569
+Mark       4851
+Marley     6134
+Mary       8821
+Mason      5801
+Mateo      9612
+Matias     3550
+Matteo     5872
+Matthew     713
+Max        9879
+Maximus    9827
+Maxwell    8829
+Maya        138
+Melanie    4156
+Melody     1524
+Messiah    9006
+Mia        7462
+Micah      1588
+Michael    3164
+Miguel     3322
+Mila       6799
+Millie     7037
+Milo       9159
+Miriam     8851
+Molly      7204
+Morgan     8109
+Mya        8690
+Myla       8285
+Myles      1137
+Naomi      2973
+Nash       1329
+Natalia    5393
+Natalie    7553
+Nathan     8773
+Nevaeh      781
+Nico       4694
+Nicolas    1621
+Noah       7044
+Noelle     7566
+Nolan      4236
+Nora       8258
+Norah      9258
+Nova        267
+Nyla       4483
+Oakley     1904
+Oaklynn    1001
+Octavia    8586
+Olive      3934
+Oliver     3903
+Olivia     1907
+Omar       7041
+Oscar      6324
+Owen       5164
+Paisley      18
+Parker      815
+Patrick    9158
+Paul       3517
+Paxton     5039
+Payton     6592
+Peter      1345
+Peyton     3521
+Phoebe     9978
+Phoenix     451
+Piper      2705
+Presley    2481
+Preston    9877
+Quinn      5558
+Rachel      713
+Raegan     7147
+Raelynn    4279
+Rafael     2833
+Reagan     7688
+Reese      1360
+Remi        638
+Rhett      4539
+Richard     331
+Riley      1796
+River      2147
+Robert     8900
+Roman      1379
+Ronan      1123
+Rosalie    1264
+Rose       5521
+Ruby       5181
+Ruth       2100
+Ryan       1888
+Ryder      4632
+Ryker      7000
+Rylee      6823
+Ryleigh    5272
+Sadie      8701
+Sage       3870
+Samuel     8899
+Sara       7189
+Sarah      8263
+Sawyer     1115
+Saylor     4478
+Selena     8566
+Sienna     7778
+Silas      6478
+Simon      5933
+Skylar     2881
+Sloane     3976
+Sofia      2663
+Sophia     3717
+Sophie     8921
+Stella     7310
+Steven     6315
+Stevie     4019
+Summer       55
+Sutton     6914
+Sydney     6679
+Tatum      5999
+Taylor     8818
+Teagan     3328
+Tessa      1810
+Theo       9329
+Thiago     3309
+Thomas     9536
+Timothy    9264
+Tobias     1741
+Trinity    4497
+Tristan    1724
+Tucker     6941
+Tyler      1340
+Valeria    7307
+Valerie    6181
+Vanessa    8728
+Vera       6875
+Victor      780
+Vincent    1258
+Violet     3092
+Vivian     6420
+Walker     4560
+Walter      902
+Waylon     3815
+Wesley     7172
+Weston      627
+William    1343
+Willow     6424
+Wren       8767
+Wyatt      3887
+Xander     4887
+Xavier      781
+Ximena     4902
+Zachary     256
+Zane       6394
+Zara       4155
+Zayden     3461
+Zayn       6848
+Zion       3345
+Zoe        2722
+Zoey       9946
+Zuri       6531
diff --git a/DataGenerator/Makefile b/DataGenerator/Makefile
new file mode 100644
index 0000000..5bd2e2f
--- /dev/null
+++ b/DataGenerator/Makefile
@@ -0,0 +1,13 @@
+# Nom de l'exécutable
+TARGET = generate_accounts
+
+# Fichier source
+SRC = generate_accounts.c
+
+# Règle par défaut : compilation et lien
+all:
+	gcc $(SRC) -o $(TARGET)
+
+# Nettoyage des fichiers générés
+clean:
+	rm -f $(TARGET)
\ No newline at end of file
diff --git a/DataGenerator/README.md b/DataGenerator/README.md
new file mode 100644
index 0000000..049e906
--- /dev/null
+++ b/DataGenerator/README.md
@@ -0,0 +1,71 @@
+# 🏦 Générateur de comptes bancaires
+
+Ce programme en C permet de générer un fichier contenant des comptes bancaires aléatoires avec des noms et des montants répartis en fonction de vos paramètres. 🎲💰
+
+## 🚀 Fonctionnalités
+- Génération de comptes avec des **prénoms réalistes** (ex. Emma, Moncef, Lenny).
+- Répartition personnalisée des montants par compte :
+    - Total à distribuer.
+    - Nombre de comptes.
+    - Montants minimum et maximum par compte.
+- Exportation des données dans un fichier `.db` avec format fixe.
+
+## 🛠️ Compilation
+Pour compiler le programme, utilisez la commande suivante dans votre terminal :
+
+```bash 
+gcc -o generate_accounts generate_accounts.c
+```
+
+ou 
+
+```bash 
+make
+```
+
+## 🏃 Utilisation
+
+### Commande
+```bash 
+./generate_accounts -t <total_amount> -n <num_accounts> -m <min_amount> -M <max_amount> [-f <filename>]
+```
+
+
+| Option | Description                                         | Obligatoire | Exemple |
+| ------ | --------------------------------------------------- | ----------- | ------- |
+| `-t` | Montant total à répartir entre les comptes          | ✅           | `-t 10000`       |
+| `-n`      | Nombre total de comptes à générer                   | ✅           | `-n 5`       |
+| `-m`      | Montant minimum par compte                          | ✅           | `-m 500`       |
+| `-M`      | Montant maximum par compte                          | ✅           | `-M 3000`       |
+| `-f`      | Nom du fichier de sortie (par défaut `accounts.db`) | ❌           | `-f accounts.db`       |
+
+### Exemple
+#### Commande
+```bash 
+./generate_accounts -t 10000 -n 5 -m 500 -M 3000 -f accounts.db
+```
+
+#### Résultat attendu 
+Fichier `accounts.db` :
+```yaml
+Emma       2500
+Liam       3000
+Olivia     1500
+Noah       2000
+Ava        1000
+```
+
+
+## ⚠️ Gestion des erreurs
+
+1. Montant insuffisant pour répartir les comptes :
+```bash
+./generate_accounts -t 1000 -n 5 -m 500 -M 3000
+```
+**Erreur :** Paramètres invalides
+
+2. Montant maximum inférieur au minimum :
+```bash
+./generate_accounts -t 10000 -n 5 -m 1000 -M 500
+```
+**Erreur :** Paramètres invalides
\ No newline at end of file
diff --git a/DataGenerator/generate_accounts.c b/DataGenerator/generate_accounts.c
new file mode 100644
index 0000000..ca86668
--- /dev/null
+++ b/DataGenerator/generate_accounts.c
@@ -0,0 +1,124 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define NAME_LENGTH 10 // Longueur fixe pour le nom
+#define ENTRY_LENGTH 16 // Longueur fixe pour une entrée (nom + argent + saut de ligne)
+
+// Génère un nom aléatoire parmis une liste prédéfinie
+void generate_random_name(char *name) {
+    const char *names[] = {
+        "Emma", "Liam", "Olivia", "Noah", "Ava", "Oliver", 
+        "Sophia", "Elijah", "Isabella", "James", "Mia", 
+        "Charlotte", "Amelia", "Harper", "Evelyn", "Jack", 
+        "Benjamin", "Lucas", "Henry", "Alexander", "Ella",
+        "Grace", "Chloe", "Lily", "Ellie", "Hannah", "Aiden", 
+        "Samuel", "Levi", "Owen", "Julian", "Nora", "Hazel", 
+        "Victoria", "Aurora", "Camila", "Aria", "Luna", "Scarlett",
+        "Moncef", "Mohamed", "Ali", "Ahmed", "Hassan", "Hosni",
+        "Lenny", "Khalid", "Louay", "Yanis", "Denis", "Luc",
+    };
+    int num_names = sizeof(names) / sizeof(names[0]);
+    int index = rand() % num_names;
+
+    strncpy(name, names[index], NAME_LENGTH);
+    name[NAME_LENGTH] = '\0'; // Assure que le nom est bien terminé
+}
+
+// Génère un fichier de comptes aléatoires
+void generate_accounts(const char *filename, int total_amount, int num_accounts, int min_amount, int max_amount) {
+    if (num_accounts <= 0 || min_amount < 0 || max_amount < min_amount || total_amount < num_accounts * min_amount) {
+        fprintf(stderr, "Paramètres invalides.\n");
+        return;
+    }
+
+    FILE *file = fopen(filename, "w");
+    if (!file) {
+        perror("Erreur à l'ouverture du fichier");
+        return;
+    }
+
+    srand(time(NULL));
+    int remaining_amount = total_amount;
+
+    for (int i = 0; i < num_accounts; i++) {
+        char name[NAME_LENGTH + 1];
+        generate_random_name(name);
+
+        int max_for_account = remaining_amount - (num_accounts - i - 1) * min_amount;
+        if (max_for_account > max_amount) {
+            max_for_account = max_amount;
+        }
+
+        int amount = (i == num_accounts - 1) ? remaining_amount : (rand() % (max_for_account - min_amount + 1) + min_amount);
+
+        remaining_amount -= amount;
+
+        // Formatage des données dans une ligne de 16 caractères
+        char entry[ENTRY_LENGTH + 1];
+        snprintf(entry, ENTRY_LENGTH + 1, "%-10s%5d\n", name, amount);
+
+        fwrite(entry, 1, ENTRY_LENGTH, file);
+    }
+
+    fclose(file);
+    printf("Comptes générés et enregistrés dans %s\n", filename);
+}
+
+
+int main(int argc, char *argv[]) {
+    // Paramètres par défaut
+    int total_amount = 0;
+    int num_accounts = 0;
+    int min_amount = 0;
+    int max_amount = 0;
+    char *filename = "accounts.db";
+
+    int opt;
+    while ((opt = getopt(argc, argv, "t:n:m:M:f:")) != -1) {
+        switch (opt) {
+            case 't':
+                total_amount = atoi(optarg);
+                break;
+            case 'n':
+                num_accounts = atoi(optarg);
+                break;
+            case 'm':
+                min_amount = atoi(optarg);
+                break;
+            case 'M':
+                max_amount = atoi(optarg);
+                break;
+            case 'f':
+                if (strlen(optarg) > 0) {
+                    filename = optarg;
+                }
+                break;
+            default:
+                fprintf(stderr, "Usage: %s -t total_amount -n num_accounts -m min_amount -M max_amount [-f filename]\n", argv[0]);
+                exit(EXIT_FAILURE);
+        }
+    }
+
+    // Vérification des paramètres
+    if (total_amount <= 0 || num_accounts <= 0 || min_amount < 0 || max_amount < min_amount || total_amount < num_accounts * min_amount) {
+        fprintf(stderr, "Paramètres invalides.\n");
+        fprintf(stderr, "Usage: %s -t total_amount -n num_accounts -m min_amount -M max_amount [-f filename]\n", argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    // Afficher les paramètres utilisés
+    printf("Génération des comptes avec les paramètres suivants :\n");
+    printf("  Montant total : %d\n", total_amount);
+    printf("  Nombre de comptes : %d\n", num_accounts);
+    printf("  Montant minimum par compte : %d\n", min_amount);
+    printf("  Montant maximum par compte : %d\n", max_amount);
+    printf("  Fichier de sortie : %s\n", filename);
+
+    // Génération des comptes
+    generate_accounts(filename, total_amount, num_accounts, min_amount, max_amount);
+
+    return 0;
+}
diff --git a/Secured/Makefile b/Secured/Makefile
new file mode 100644
index 0000000..ab138fa
--- /dev/null
+++ b/Secured/Makefile
@@ -0,0 +1,13 @@
+# Nom de l'exécutable
+TARGET = secured_transaction
+
+# Fichier source
+SRC = secured_transaction.c
+
+# Règle par défaut : compilation et lien
+all:
+	gcc $(SRC) -o $(TARGET)
+
+# Nettoyage des fichiers générés
+clean:
+	rm -f $(TARGET)
\ No newline at end of file
diff --git a/Secured/README.md b/Secured/README.md
new file mode 100644
index 0000000..912adec
--- /dev/null
+++ b/Secured/README.md
@@ -0,0 +1 @@
+## SOON
\ No newline at end of file
diff --git a/Secured/secured_transaction.c b/Secured/secured_transaction.c
new file mode 100644
index 0000000..e69de29
diff --git a/Unsecured/Makefile b/Unsecured/Makefile
new file mode 100644
index 0000000..0f0fe69
--- /dev/null
+++ b/Unsecured/Makefile
@@ -0,0 +1,13 @@
+# Nom de l'exécutable
+TARGET = unsecured_transaction
+
+# Fichier source
+SRC = unsecured_transaction.c
+
+# Règle par défaut : compilation et lien
+all:
+	gcc $(SRC) -o $(TARGET)
+
+# Nettoyage des fichiers générés
+clean:
+	rm -f $(TARGET)
\ No newline at end of file
diff --git a/Unsecured/README.md b/Unsecured/README.md
new file mode 100644
index 0000000..1e5275a
--- /dev/null
+++ b/Unsecured/README.md
@@ -0,0 +1,31 @@
+@TODO : Améliorer le README.MD (le texte y compris)
+
+
+# 🏦 Simulateur de Transactions Bancaires Concurrentes
+
+Ce programme en C simule des transactions bancaires aléatoires entre comptes dans un environnement multi-processus. Il est conçu pour illustrer les défis de la concurrence sans synchronisation explicite.
+
+## ✨ Fonctionnalités
+
+- 📖 **Lecture et écriture de comptes** : Les comptes sont stockés dans un fichier avec un format fixe (nom et solde).
+- 🔄 **Transactions aléatoires** : Effectue des transferts d'argent aléatoires entre comptes.
+- 🤹 **Simulation multi-processus** : Plusieurs processus enfants effectuent des transactions simultanément.
+- 📊 **Calcul des soldes** : Affiche le solde total avant et après les transactions.
+
+---
+
+## ⚠️ Limitations et Bugs Potentiels
+
+🚨 **Ce programme n'utilise pas de mécanismes de verrouillage pour gérer la concurrence.**
+
+1. **💥 Problème de concurrence** :
+   - Plusieurs processus peuvent lire et écrire dans le fichier en même temps, entraînant des incohérences dans les soldes (race condition).
+   - Par exemple, deux processus modifiant simultanément un compte peuvent écraser leurs changements.
+
+2. **📉 Corruption des données** :
+   - Une interruption (crash ou arrêt forcé) pendant une transaction peut laisser des données partiellement écrites.
+
+3. **❌ Absence de validations robustes** :
+   - Aucune vérification supplémentaire pour s'assurer que les montants transférés sont cohérents en cas de concurrence.
+
+---
\ No newline at end of file
diff --git a/Unsecured/unsecured_transaction.c b/Unsecured/unsecured_transaction.c
new file mode 100644
index 0000000..208f48a
--- /dev/null
+++ b/Unsecured/unsecured_transaction.c
@@ -0,0 +1,165 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/wait.h>
+#include <string.h>
+
+#define ACCOUNT_SIZE 16
+#define MAX_NAME_LEN 10
+#define MAX_BALANCE_LEN 5
+#define FILENAME "../Data/accounts.db"
+
+// Fonction pour lire un compte dans le fichier
+void read_account(int fd, int index, char *name, int *balance) {
+    char buffer[ACCOUNT_SIZE];
+    lseek(fd, index * ACCOUNT_SIZE, SEEK_SET);
+    read(fd, buffer, ACCOUNT_SIZE);
+    sscanf(buffer, "%10s %d", name, balance);
+}
+
+// Fonction pour écrire un compte dans le fichier
+void write_account(int fd, int index, const char *name, int balance) {
+    char buffer[ACCOUNT_SIZE];
+
+    // Créer une chaîne formatée avec une largeur fixe
+    snprintf(buffer, ACCOUNT_SIZE - 1, "%-10s%4d", name, balance);
+
+    // Assurer que le buffer termine par '\n'
+    buffer[ACCOUNT_SIZE - 1] = '\n';
+
+    // Positionner et écrire dans le fichier
+    lseek(fd, index * ACCOUNT_SIZE, SEEK_SET);
+    write(fd, buffer, ACCOUNT_SIZE);
+}
+
+
+// Fonction pour effectuer une transaction
+void perform_transaction(int fd, int account_count) {
+    int from_idx = rand() % account_count;
+    int to_idx = rand() % account_count;
+    while (from_idx == to_idx) {
+        to_idx = rand() % account_count;
+    }
+
+    char from_name[MAX_NAME_LEN], to_name[MAX_NAME_LEN];
+    int from_balance, to_balance;
+
+    // Lire les comptes source et destination
+    read_account(fd, from_idx, from_name, &from_balance);
+    read_account(fd, to_idx, to_name, &to_balance);
+
+    // Calculer un montant aléatoire à transférer (max 20% du solde source)
+    int max_transfer = from_balance / 5;
+    if (max_transfer > 0) {
+        int transfer_amount = rand() % max_transfer;
+
+        // Effectuer la transaction
+        from_balance -= transfer_amount;
+        to_balance += transfer_amount;
+
+        // Écrire les nouveaux soldes dans le fichier
+        write_account(fd, from_idx, from_name, from_balance);
+        write_account(fd, to_idx, to_name, to_balance);
+
+        printf("Transaction : %s -> %s : %d€\n", from_name, to_name, transfer_amount);
+    } else {
+        printf("Transaction annulée : Fonds insufisants %s\n", from_name);
+    }
+}
+
+// Fonction pour un processus de transactions
+void process_transactions(int transactions, int account_count) {
+    int fd = open(FILENAME, O_RDWR);
+    if (fd < 0) {
+        perror("Erreur : Impossible d'ouvrir le fichier");
+        exit(1);
+    }
+
+    for (int i = 0; i < transactions; i++) {
+        perform_transaction(fd, account_count);
+        usleep(rand() % 100000); // Temporisation aléatoire
+    }
+
+    close(fd);
+}
+
+int calculate_total_balance() {
+    int fd = open(FILENAME, O_RDONLY);
+    if (fd < 0) {
+        perror("Erreur : Impossible d'ouvrir le fichier");
+        return -1;
+    }
+
+    off_t file_size = lseek(fd, 0, SEEK_END);
+    int account_count = file_size / ACCOUNT_SIZE;
+
+    int total_balance = 0;
+    char name[MAX_NAME_LEN];
+    int balance;
+
+    for (int i = 0; i < account_count; i++) {
+        read_account(fd, i, name, &balance);
+        total_balance += balance;
+    }
+
+    close(fd);
+    return total_balance;
+}
+
+int main(int argc, char *argv[]) {
+    if (argc != 3) {
+        fprintf(stderr, "Usage: %s <number_of_processes> <transactions_per_process>\n", argv[0]);
+        return 1;
+    }
+
+    int num_processes = atoi(argv[1]);
+    int transactions_per_process = atoi(argv[2]);
+
+    srand(time(NULL));
+
+    // Calcul du solde total initial
+    int initial_balance = calculate_total_balance();
+    if (initial_balance < 0) {
+        return 1; // Erreur lors de l'ouverture du fichier
+    }
+    printf("Solde total initial : %d€\n", initial_balance);
+
+    // Ouvrir le fichier pour déterminer le nombre de comptes
+    int fd = open(FILENAME, O_RDONLY);
+    if (fd < 0) {
+        perror("Erreur : Impossible d'ouvrir le fichier");
+        return 1;
+    }
+    off_t file_size = lseek(fd, 0, SEEK_END);
+    close(fd);
+
+    int account_count = file_size / ACCOUNT_SIZE;
+
+    printf("Nombre de comptes : %d\n", account_count);
+
+    // Créer les processus enfants
+    for (int i = 0; i < num_processes; i++) {
+        if (fork() == 0) {
+            process_transactions(transactions_per_process, account_count);
+            exit(0);
+        }
+    }
+
+    // Attendre les processus enfants
+    for (int i = 0; i < num_processes; i++) {
+        wait(NULL);
+    }
+
+    // Calcul du solde total final
+    int final_balance = calculate_total_balance();
+    if (final_balance < 0) {
+        return 1; // Erreur lors de l'ouverture du fichier
+    }
+    printf("Solde total final : %d€\n", final_balance);
+
+    printf("Tout les processus sont terminés !\n");
+
+    return 0;
+}