Část 1: Kontrola a změna přístupových práv
K získání informací o souboru (včetně jeho práv) použijeme funkci stat(). Ta naplní speciální strukturu struct stat metadaty souboru. Bitová maska st_mode obsahuje aktuální práva. Pro jejich úpravu použijeme systémové volání chmod().
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
int main() {
const char *filename = "tutorial_soubor.txt";
struct stat file_stat;
// 1. Načtení informací o souboru pomocí stat()
if (stat(filename, &file_stat) == -1) {
perror("Chyba při získávání informací o souboru");
return 1;
}
// 2. Kontrola, zda má vlastník právo zápisu (S_IWUSR)
if (file_stat.st_mode & S_IWUSR) {
printf("Vlastník MÁ právo zapisovat do souboru.\n");
} else {
printf("Vlastník NEMÁ právo zapisovat do souboru.\n");
}
// 3. Změna práv: Přidáme vlastnikovi právo spouštět soubor (S_IXUSR)
// Zkopírujeme stávající práva a pomocí bitového OR (|) přidáme nové právo
mode_t new_mode = file_stat.st_mode | S_IXUSR;
if (chmod(filename, new_mode) == -1) {
perror("Chyba při změně práv");
return 1;
}
printf("Práva souboru byla úspěšně změněna (přidáno právo spustit 'x').\n");
return 0;
}
Část 2: Vytváření tvrdých a symbolických odkazů
Pro vytvoření tvrdého odkazu použijeme funkci
link(). Pokud původní soubor smažeme, data budou skrze tvrdý odkaz stále přístupná.Pro vytvoření symbolického (měkkého) odkazu použijeme funkci
symlink(). Tento odkaz pouze ukazuje na název/cestu původního souboru. Pokud původní soubor smažeme, symbolický odkaz se stane „rozbitým“
#include <stdio.h>
#include <unistd.h>
int main() {
const char *original = "tutorial_soubor.txt";
const char *hard_link = "tvrdy_odkaz.txt";
const char *sym_link = "symbolicky_odkaz.txt";
// 1. Vytvoření tvrdého odkazu (Hard link)
if (link(original, hard_link) == -1) {
perror("Chyba při vytváření tvrdého odkazu");
} else {
printf("Tvrdý odkaz '%s' byl úspěšně vytvořen.\n", hard_link);
}
// 2. Vytvoření symbolického odkazu (Symbolic link)
if (symlink(original, sym_link) == -1) {
perror("Chyba při vytváření symbolického odkazu");
} else {
printf("Symbolický odkaz '%s' byl úspěšně vytvořen.\n", sym_link);
}
// Nyní můžeš v terminálu zkusit smazat původní soubor pomocí: rm tutorial_soubor.txt
// Uvidíš, že 'tvrdy_odkaz.txt' stále funguje a má data, zatímco 'symbolicky_odkaz.txt' je nefunkční.
return 0;
}
Co jsme se naučili?
Jak získat a změnit práva soborů
Rozdíl mezi symbolickým a trvdým odkazem