├── E1.fork-func ├── fork-func.md └── main.c ├── E2.clone-func ├── clone-func.md └── main.c └── README.md /E1.fork-func/fork-func.md: -------------------------------------------------------------------------------- 1 | # Fork() 2 | -- O an programımız için oluşturulmuş ve çalışan process'in içindeki tüm değişkenleri kopyalayarak birebir kopyasını oluşturur ve bu yeni process'i mevcut process'imizin altına child process olarak ekler. 3 | 4 | -- Bu yeni oluşan child ve var olan parent process'i birbirinden ayırmak ve farklı işlemler yaptırabilmek için process id'lerinden (pid) yararlanırız. Fork fonksiyonu çalıştığında child process için 0, parent process için 0'dan farklı bir değer (pid) döner. 5 | -------------------------------------------------------------------------------- /E1.fork-func/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int main() { 6 | pid_t pid; // fork() dönüş değişkeni 7 | 8 | pid = fork(); // yeni process oluşturma 9 | 10 | /* 11 | Yeni oluşturulan child process'in ID'si 0, parent process ise 0'dan başka bir değer alır 12 | */ 13 | if (pid == 0) 14 | printf("child proc pid:%d\n", pid); 15 | else 16 | printf("parent proc pid:%d\n", pid); 17 | 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /E2.clone-func/clone-func.md: -------------------------------------------------------------------------------- 1 | # clone(int (*func), void *yigin, int flag, void *arg, ...) 2 | 3 | -- Fork() fonksiyonunun yaptığı işin benzerini yapar. Ama aradaki temel fark oluşan yeni process bir önceki process'in çocuğu değil ikizi olarak konumlandırılabilir. 4 | 5 | -- Fonksiyonun yapısını incelediğimizde ise 1. parametre yeni oluşan process'in çalıştıracağı fonksiyondur. 2. parametre ise yeni process'in çocuk olarak çalışacağı durumda kullanacağı stack belleğin başlangıç noktasıdır. 3. parametre az önce bahsettiğim durum olan oluşan process'in ne tür akrabalığa sahip olacağını belirleyen bayraktır. 6 | 7 | -- Ancak clone() (anladığım kadarıyla) macOS veya windows üzerinde bir process oluşturmanıza izin vermiyor çünkü sistem çağrılarında bunun karşılığı yok. Linux üzerine geliştirilmiş bir fonksiyon olduğu için yalnızca linux kerneli üzerinde kullanılabiliyor. 8 | -------------------------------------------------------------------------------- /E2.clone-func/main.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define YIGIN_BOYUTU 1024 8 | 9 | int yeni_process() { // Child process'in çalıştıracağı fonksiyon 10 | puts("\nChild process çalıştı.\n"); 11 | return 0; 12 | } 13 | 14 | int main() { 15 | int pid; 16 | void *yigin, *yigintepe; // Child process'in yigin isaretcisi 17 | 18 | yigin = malloc(YIGIN_BOYUTU); // Yigin icin gerekli alan ayirilir. 19 | if (yigin == 0) { // Bellek alanı tahsis hatasi kontrolu 20 | printf("bellek tahsis hatasi!!"); 21 | exit(1); 22 | } 23 | 24 | // Yigin asagi dogru genisledigi icin tepe adresini veriyoruz 25 | yigintepe = yigin + YIGIN_BOYUTU; 26 | 27 | // Clone ile mevcut process'i kopyalıyoruz 28 | pid = clone(¥i_process, (char*)yigintepe, 0, 0); 29 | 30 | // Child process'in tamamlanmasını bekliyoruz 31 | pid = waitpid(pid, NULL, 0); 32 | 33 | puts("\nChild process sonlandi\n"); 34 | 35 | // Bellegi serbest birak 36 | free(yigin); 37 | 38 | return 0; 39 | } 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## OS-Programming-Examples 2 | 3 | İşletim Sistemleri mekanizmalarını öğrenirken aldığım notlar burada olacak. 4 | --------------------------------------------------------------------------------