Fork - ваш гид в мире вилок для велосипедов и столовых приборов
Команда fork в операционных системах Unix и Linux используется для создания копии текущего процесса. Эта копия, называемая дочерним процессом, получает свой уникальный идентификатор процесса (PID) и полностью копирует текущее состояние родительского процесса, включая все переменные, открытые файлы и контекст исполнения.
Примеры использования команды fork:
1. Создание нового процесса с помощью fork и выполнение новой программы в нем:
c
#include
#include
#include
int main() {
pid_t pid;
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
printf("Это дочерний процесс\n");
execl("/bin/ls", "ls", "-l", NULL);
} else {
printf("Это родительский процесс\n");
wait(NULL);
}
return 0;
}
В этом примере мы создаем дочерний процесс с помощью fork и исполняем новую программу в нем с помощью функции execl. Функция execl заменяет текущий образ процесса на новый образ, созданный в новой программе. В родительском процессе мы ждем, пока дочерний процесс завершится с помощью функции wait.
2. Создание нового процесса с помощью fork и использование общей памяти для обмена данными между процессами:
c
#include
#include
#include
#include
int main() {
int fd[2]; // создаем канал
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid_t pid;
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// Это дочерний процесс
close(fd[0]); // закрываем чтение канала
write(fd[1], "Hello, world!", 13); // записываем в канал
exit(EXIT_SUCCESS);
} else {
// Это родительский процесс
close(fd[1]); // закрываем запись канала
char buffer[100];
wait(NULL);
read(fd[0], buffer, 100); // читаем из канала
printf("%s\n", buffer);
}
return 0;
}
В этом примере мы создаем канал с помощью функции pipe и используем его для обмена данными между процессами. В дочернем процессе мы записываем строку "Hello, world!" в канал, а в родительском процессе мы читаем данные из канала и выводим их на экран. Канал позволяет нам обмениваться данными между процессами без использования файлов или сетевых соединений.
Таким образом, команда fork позволяет создавать новые процессы в операционных системах Unix и Linux. Она может использоваться для запуска новых программ, обмена данными между процессами и других задач. Успешное использование команды fork требует понимания работы процессов в операционной системе и общих принципов программирования.