#c #linux #unix
#c #linux #unix
Вопрос:
Я использую следующий код
system("gcc -c main.c -o main.o");
system("gcc -c add.c -o add.o");
system("gcc main.o add.o -o Output.exe");
Этот код обычно выполняет все инструкции постоянно. Я хочу остановить выполнение, если в коде есть какая-либо ошибка, т.е. если в main.c есть ошибка, то приведенные ниже два оператора не должны выполняться.
и если add.c выдает ошибку, то третий не должен выполняться.
Один совет, который я нашел, — использовать значения errno, установленные функцией, так как это сделать?
Мы знаем, что system() создает дочерний элемент с помощью fork() в соответствии со справочной страницей
Поэтому я хочу прочитать значение errno от дочернего элемента!
Комментарии:
1. Вы не можете читать
errno
. Но вы можете проверить, что команда передаетexit
функции (или возвращает из своейmain
функции). Прочитайте страницуsystem
руководства .2. По какой-либо причине вы не хотите использовать
make
?3. @JoachimPileborg Я имею в виду передачу exit(errno) и сбор его с помощью wait(amp;status)
4. @dbush Я пишу код для реализации утилиты make, так в чем причина
5. Вы все еще не можете. Утилиты сборки проверяют код выхода программы.
Ответ №1:
Система возвращает статус завершения выполнения команды. Так что вы можете сделать:
error = system("gcc -c main.c -o main.o");
if (error) {
// report error
}
Ответ №2:
Полезная документация, найденная в man system
, сообщает вам, что возвращает функция:
Если все системные вызовы завершаются успешно, то возвращаемое значение является статусом завершения дочерней оболочки, используемой для выполнения команды. (Статус завершения командной оболочки — это статус завершения последней команды, которую она выполняет.)
Вы всегда должны проверять возвращаемые значения стандартных библиотечных функций, особенно если вам интересно, работают ли они.
Комментарии:
1. Статус завершения оболочки — это статус завершения последней команды для обычных оболочек, но это всего лишь соглашение, вы можете написать оболочку, которая не соответствует соглашению, и тогда вам придется с этим справляться.