/
MaestroN
/
Eltex_Homework
Обзор
Документация
Войти
/
MaestroN
/
Eltex_Homework
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Task_9/Task9.1.c
66 строк
4 KB
nikita_shub
Добавление задания 9 Процессы и потоки
28 янв 2025, 15:30
28 янв 2025, 15:30
fc4d1c8
Код
Авторство
О чём код?
/* 1: Запуск внешней программы с использованием fork() и exec() Цель: Научиться порождать дочерний процесс, который заменяет своё образ, выполняя внешнюю программу (например, стандартную утилиту) с помощью системного вызова execvp(). Напишите программу, в которой родительский процесс создает дочерний с помощью fork(). В дочернем процессе выполняйте замену образа на вызов внешней команды (например, ls -l или date) с помощью execvp(). Родительский процесс должен дождаться завершения дочернего процесса с помощью waitpid() и вывести сообщение о завершении. Основные требования • Использование fork() для создания дочернего процесса. • Замена образа дочернего процесса функцией execvp(). • Контроль ошибок: если fork() или execvp() не удалось, вывести сообщение. • Ожидание завершения дочернего процесса с использованием waitpid(). Рекомендации: • Подготовьте массив аргументов для execvp(), например: char *args[] = { "ls", "-l", NULL }; • Обратите внимание на корректное завершение (выход с нужным кодом) в дочернем процессе перед вызовом execvp(). • Протестируйте на разных командах, чтобы убедиться, что передаются правильные аргументы. хорошая статья: https://ru.linux-console.net/?p=5862 */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { char* command = "ls"; char* argument_list[] = {"ls", "-l", NULL}; pid_t pid = fork(); if (pid == -1) { // Проверка создания дочернего процесса perror("fork failed"); return 1; } else if (pid == 0) { // Дочерний процесс printf("PID %d\n", pid); int status_code = execvp(command, argument_list); // Замена образа дочернего процесса на ls -l, то есть фактически процесс больше не выполняет свой текущий код, а выполняет новый код с этой командой printf("Эта строка не будет выводиться, если правильно отработал execvp, так как ораз процесса заменен\n"); // Если execvp не удалась, выводим сообщение об ошибке if (status_code == -1) { perror("ошибка execvp"); return 1; } } else { // Родительский процесс printf("PPID: %d\n",pid); int status; waitpid(pid, &status, 0); // Этот вызов блокирует выполнение родительского процесса до тех пор, пока дочерний процесс не завершится. if (WIFEXITED(status)) { printf("Дочерний процесс завершился с кодом: %d\n", WEXITSTATUS(status)); } else { printf("Дочерний процесс завершился ненормально.\n"); } } return 0; }