Как прочитать errno дочернего процесса, созданного функцией system()?

#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. Статус завершения оболочки — это статус завершения последней команды для обычных оболочек, но это всего лишь соглашение, вы можете написать оболочку, которая не соответствует соглашению, и тогда вам придется с этим справляться.