Лабораторная. 1лаб. Системные вызовы getppid() и getpid()
![]()
|
1) Системные вызовы getppid() и getpid() Значение идентификатора текущего процесса - вызов getpid(), значение идентификатора родительского процесса для текущего процесса - вызов getppid(). ![]() #include #include #include int main(){ pid_t curProc = getpid(); pid_t curParentProc = getppid(); printf("pid: = %d, my ppid = %d\n", (int)curProc, (int)curParentProc); } 2) Системный вызов fork() Системный вызов fork() служит для порождения нового процесса ![]() #include #include int main(){ pid_t pid, ppid; int a = 0; (void)fork(); a = a+1; pid = getpid(); ppid = getppid(); printf("My pid = %d, my ppid = %d, result = %d\n", (int)pid, (int)ppid, a); return 0; } 3) Написание, компиляция и запуск программы с использованием вызова fork() с разным поведением процессов ребенка и родителя ![]() #include #include int main(){ pid_t pid, ppid; int a = 0; pid_t isParent = fork(); pid = getpid(); ppid = getppid(); if ((bool)isParent){ // child a = a+5; } else { // parent a = a+1; } printf("My pid = %d, my ppid = %d, result = %d\n", (int)pid, (int)ppid, a); return 0; } 4) Написание, компиляция и запуск программы, распечатывающей аргументы командной строки и параметры среды ![]() #include int main(int argc, char *argv[], char *envp[]){ printf("Arguments: "); for (; *argv; ++argv){ printf("%s ", *argv); } printf("\n\n"); printf("Env params: "); for (; *envp; ++envp){ printf("%s \n", *envp); } printf("\n"); return 0; } 5) Программа, печатающее содержимое файла 03-2.c Вызов exec() заменяет пользовательский контекст текущего процесса на содержимое некоторого исполняемого файла и устанавливает начальные значения регистров процессора ![]() /* Программа 03-2.с, изменяющая пользователь- ский контекст процесса (запускающая другую программу) */ #include #include #include int main(int argc, char *argv[], char *envp[]){ /* Мы будем запускать команду cat c аргументом командной строки 03-2.с без изменения параметров среды, т.е. фактически выполнять команду "cat 03-2.c", которая должна выдать содержимое данного файла на экран. Для функции execle в качестве имени программы мы указываем ее полное имя с путем от корневой директории —/bin/cat. Первое слово в командной строке у нас должно совпадать с именем запускаемой программы. Второе слово в командной строке – это имя файла, содержимое которого мы хотим распечатать. */ (void) execle("/bin/cat", "/bin/cat", "03-2.c", 0, envp); /* Сюда попадаем только при возникновении ошибки */ printf("Error on program start\n"); _exit(-1); return 0; /* Никогда не выполняется, нужен для того, чтобы компилятор не выдавал warning */ } 6) Написание, компиляция и запуск программы для изменения пользовательского контекста в порожденном процессе![]() #include #include #include int main(int argc, char *argv[], char *envp[]){ pid_t pid, ppid; pid_t isParent = fork(); pid = getpid(); ppid = getppid(); if ((bool)isParent){ // parent (void) execle("./parent", "./parent", "parent.c", 0, envp); } else { // child (void) execle("./child", "./child", "child.c", 0, envp); } /* Сюда попадаем только при возникновении ошибки */ printf("Error on program start\n"); _exit(-1); return 0; } ![]() |