#include #include #include #include #include #include #include #include #define BUFFER 1024 int main(int argc, const char* argv[]) { if (argc < 2)//parametrelerin dogru girilip girilmediginin kontorlu { fprintf(stderr, "%s must be executed with an argument!\n", argv[0]); fprintf(stdout, "Aborted automatically...\n"); exit(0); } if (argc > 2)//parametrelerin dogru girilip girilmediginin kontorlu { fprintf(stderr, "%s was executed with too many arguments!\n", argv[0]); fprintf(stdout, "Aborted automatically...\n"); exit(0); } if (argc == 2)//parametrelerin dogru girilip girilmediginin kontorlu { if (!isdigit(argv[1][0]) || atoi(argv[1]) < 2)//girilen parametrenin int olup olmadigi ve derinlik kontolu { fprintf(stderr, "Wrong argument! Depth value must be an integer greater than one (%d).\n", atoi(argv[1])); fprintf(stdout, "Aborted automatically...\n"); return 0; } } const int depth = atoi(argv[1]);//derinlik int'e cevrilip bir degiskende tutuluyor int level = depth;//dongude karsilastirmak adina derinlik bir baska degere esitleniyor pid_t top_parent_pid = getpid();//root parent id'si pid_t pid;//dongude kullanmak icin bir pid_t tanimliyoruz while (level--)//derinlik kadar donguyu dondurmek icin level'i birer azaltıyoruz for(int i = level ; 0>i;i--) { pid = fork(); if ((level + 1) == depth)//dongu baslangicinda level-- ile basladigi icin derinligi level+1 ile kontrol ediyoruz { if (pid == 0)//log dosyalarini terminale yazdiriyoruz { printf("----------logs/151068_uyg2A_logAll.log----------\n\n"); system("[ -r logs/151068_uyg2A_logAll.log ] && cat logs/151068_uyg2A_logAll.log"); printf("-----------------------------------\n\n"); printf("-----------------------------------\n"); sleep(2); } else { fprintf(stdout, "Process ID : %d, Parent Process ID : %d forked...\n", getpid(), getppid());//parent process'in terminale yazdirilmasi fprintf(stdout, "will create logs/ folder 1 second later\n\n"); sleep(1);//bu satirdan sonraki satirda log dosyasinin olusturulmasi vardir system("mkdir -p logs && \ touch logs/151068_uyg2A_logAll.log && \ echo "" >> logs/151068_uyg2A_logAll.log && \ date >> logs/151068_uyg2A_logAll.log"); } } else if ((pid != 0) || (top_parent_pid == getpid())) { if (pid != 0) break; else if (top_parent_pid == getpid()) { pid_t child_two_pid = getpid();//child 2 process(tek bir kez uretilecek cocuk) fprintf(stdout, "Process ID : %d, Parent Process ID : %d forked...\n", getpid(), getppid());//child 2 nin terminale yazdirilmasi break; } } else//grandchild'in id'sinin terminale yazdirilmasi { fprintf(stdout, "Process ID : %d, Parent Process ID : %d forked...\n", getpid(), getppid()); } } sleep(1); if (top_parent_pid == getpid() && pid != 0)//pstree'nin terminale ve log dosyasina yazilmasi { char command[BUFFER]; sprintf(command, " pstree -p %d && \ echo 'PID: %d depth: %d' >> logs/151068_uyg2A_logAll.log && \ pstree -p %d >> logs/151068_uyg2A_logAll.log && \ echo "" >> logs/151068_uyg2A_logAll.log", top_parent_pid, top_parent_pid, depth, top_parent_pid); system(command); } wait(NULL); int status; wait(&status); if (WIFEXITED(status)) printf("Process ID : %d, Parent Process ID : %d terminated... \n", getpid(), getppid());//butun processlerin terminate edilmesi return 0; }