Программирование для Linux. Профессиональный подход | страница 21



Поток >stdout является буферизуемым. Записываемые в него данные не посылаются на консоль (или на другое устройство в случае перенаправления), пока буфер не заполнится, программа не завершит работу нормальным способом или файл >stdout не будет закрыт. Осуществить принудительное "выталкивание" буфера позволяет функция >fflush():

>fflush(stdout);

В то же время поток >stderr не буферизуется. Записываемые в него данные сразу попадают на консоль.[6]

Указанная особенность потока >stdout может приводить к неожиданным результатам. Например, в следующем цикле точка не выводится каждую секунду. Вместо этого все символы сначала помещаются в буфер, а затем целая их группа одновременно выводится на экран, когда буфер оказывается заполненным.

>while (1) {

> printf(".");

> sleep(1);

>}

А в этом цикле происходит то, что нам нужно:

>while (1) {

> fprintf(stderr, ".");

> sleep(1);

>}

2.1.5. Коды завершения программы

Когда программа завершает работу, она уведомляет операционную систему о своем состоянии, посылая ей код завершения, который представляет собой 16-разрядное целое число. По существующему соглашению нулевой код свидетельствует об успешном завершении, а ненулевой указывает на наличие ошибки. Некоторые программы возвращают различные ненулевые коды, обозначая разные ситуации.

В большинстве интерпретаторов команд код завершения последней выполненной программы содержится в специальной переменной >$?. В показанном ниже примере программа >ls вызывается дважды, и оба раза запрашивается код ее завершения. В первом случае программа завершается корректно и возвращает нулевой код, во втором случае она сталкивается с ошибкой (указанный в командной строке файл не найден), поэтому код завершения оказывается ненулевым:

>% ls /

>bin  coda etc  lib        misc nfs proc sbin usr

>boot dev  home lost+found mnt  opt root tmp  var

>% echo $?

>0

>% ls bogusfile

>ls: bogusfile: No such file or directory

>% echo $?

>1

Программа, написанная на языке С или C++, указывает код завершения в операторе >return в функции >main(). Есть и другие методы задания кодов завершения. Они обсуждаются в главе 3, "Процессы". Например, программе назначается определенный код, когда она завершается аварийно (вследствие получения сигнала).

2.1.6. Среда выполнения

Операционная система Linux предоставляет каждой запущенной программе среду выполнения. Под средой подразумевается совокупность пар переменная-значение. Имена переменных среды и их значения являются строками. По существующему соглашению переменные среды записываются прописными буквами.