Главная страница
Навигация по странице:

  • Системный вызов fork()

  • Написание, компиляция и запуск программы с использованием вызова fork() с разным поведением процессов ребенка и родителя

  • 6) Написание, компиляция и запуск программы для изменения пользовательского контекста в порожденном процессе

  • Лабораторная. 1лаб. Системные вызовы getppid() и getpid()


    Скачать 0.58 Mb.
    НазваниеСистемные вызовы getppid() и getpid()
    АнкорЛабораторная
    Дата05.10.2022
    Размер0.58 Mb.
    Формат файлаodt
    Имя файла1лаб.odt
    ТипДокументы
    #716283

    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;

    }

    child.c и parent.c


    написать администратору сайта