Я написал небольшую программу, использующую fork
для создания новых процессов, которые используют pipe
s для связи. Применяя защитное программирование, я проверяю каждое возвращаемое значение. Если возвращаемое значение указывает, что что-то пошло не так, я хочу освободить все ресурсы, закрыть все каналы и родительский процесс, чтобы дождаться завершения его дочерних процессов. Теперь, каков наилучший способ помочь в случае возникновения ошибки?
На данный момент я делаю это так:
/* initialize pipes */
if(pipe(p1fd) == -1) {
(void) printError("Could not init pipe 1");
exit(EXIT_FAILURE);
}
if(pipe(p2fd) == -1) {
(void) printError("Could not init pipe 2");
(void) close(p1fd[0]);
(void) close(p1fd[1]);
exit(EXIT_FAILURE);
}
switch (pid = fork()) {
case -1:
(void) printError("Could not fork");
(void) close(p1fd[0]);
(void) close(p1fd[1]);
(void) close(p2fd[0]);
(void) close(p2fd[1]);
exit(EXIT_FAILURE);
break;
case 0: /* child process */
break;
default: /* parent process */
break;
}
Это становится довольно громоздким, если нужно больше ресурсов. Другой способ, о котором я подумал, - предоставить функцию спасения, которая просто закрывает все каналы, не заботясь о том, действительно ли каналы были открыты (то же самое для освобождения памяти и вызова wait
для дочерних процессов). Но тогда все переменные, необходимые в такой функции спасения, должны быть глобальными, поскольку некоторые каналы передаются разным дочерним процессам / функциям.