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; +}