Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
4Activity
0 of .
Results for:
No results containing your search query
P. 1
Unix Programming Lecture 02

Unix Programming Lecture 02

Ratings: (0)|Views: 367 |Likes:
Published by Oleksiy Kovyrin

More info:

Published by: Oleksiy Kovyrin on Mar 08, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

09/12/2010

pdf

text

original

 
Программирование для OS UNI
X
 Романенко В.А
 Лекция №2 
Среда программирования UNIX 
 Вce версии UNIX предоставляют строго определенный ограниченный набор входов в ядрооперационной системы, через которые прикладные задачи имеют возможностьвоспользоваться базовыми услугами, предоставляемыми UNIX. Эти точки входа получилиназвание системных вызовов (system calls).
Системный вызов
определяет функцию, выполняемую ядром операционной системы отимени процесса, выполнившего вызов, и является интерфейсом самого низкого уровнявзаимодействия прикладных процессов с ядром. В UNIX каждый системный вызов имеет соответствующую функцию с тем же именем, хранящуюся в стандартной библиотеке языка С.
Помимо системных вызовов предлагается большой набор функций общего назначения. Этифункции не являются точками входа в ядро операционной системы, хотя в процессевыполнения многие из них выполняют системные вызовы.Например, функция
 printf(3S)
использует системный вызов
write(2)
для записи данных вфайл, в то время как функции
 strcpy(3C)
(копирование строки) или a
toi(3C)
(преобразованиесимвола в его числовое значение) вообще не прибегают к услугам операционной системы.Таким образом, часть библиотечных функций является "надстройкой" над системнымивызовами, обеспечивающей более удобный способ получения системных услуг.На рис. 1 показана схема взаимодействия приложения с ядром операционной системы прииспользовании системных вызовов и библиотечных функций.
Рис. 1. Системные вызовы и библиотечные функции
Форматы исполняемых файлов
В большинстве современных операционных систем UNIX используются двастандартных формата исполняемых файлов — COFF (Common Object File Format) и ELF(Executable and Linking Format).
Выполнение программы в операционной системе UNIX
Выполнение программы начинается с создания в памяти ее образа и связанных спроцессом структур ядра операционной системы, инициализации и передаче управленияинструкциям программы. Завершение программы ведет к освобождению памяти исоответствующих структур ядра.1
 
Программирование для OS UNI
X
 Романенко В.А
Запуск С-программы
Функция
main()
является первой функцией, определенной пользователем (т. е. явноописанной в исходном тексте программы), которой будет передано управление послесоздания соответствующего окружения запускаемой на выполнение программы.Традиционно функция
таin()
определяется следующим образом:
 main(int argc, char *argv[], char *envp[]);
Первый аргумент (
argc
) определяет число параметров, переданных программе, включаяее имя.Указатели на каждый из параметров передаются в массиве
argv
[ ], таким образом,через argv[0] адресуется строка, содержащая имя программы, argv[l] указывает на первыйпараметр и т. д. до argv [ argc-1].Массив
envp
[ ] содержит указатели на переменные окружения, передаваемыепрограмме. Каждая переменная представляет собой строку вида
имя_ 
переменной=значение переменной.Стандарт ANSI С определяет только два первых аргумента функции
main() — 
argc иargv. Стандарт POSIX.1 определяет также аргумент envp, хотя рекомендует передачуокружения программы производить через глобальную переменную environ.
extern char **environ;
Рекомендуется следовать последнему формату передачи для лучшей переносимостипрограмм на другие платформы UNIX.Приведем пример программы, соответствующую стандарту POSIX.1, которая выводитзначения всех аргументов, переданных функции
main().
число переданных параметров,сами параметры и значения первых десяти переменных окружения.
#include <stddef.h>extern char **environ;main(int argc, char *argv[]){ int i;printf("число параметров %s равно %d\n", argv[0], argc-1);for (i=1; i<argc; i++)printf("argv[%d] = %s\n", i,argv[i]);for (i=0; i<8; i++)if (environ[i] != NULL)printf("environ[%d] : %s\n", i, environ[i]);}
Запустив эту программу на выполнение, мы увидим следующую информацию:
$progname first second 3
argv[l] = firstargv[2] = secondargv[3]
=
3environ[0] LOGNAME=andyenviron[1] MAIL=/var/mail/andyenviron[2] LD_LIBRARY_PATH=/usr/openwin/lib:/usr/ucblibenviron[3] PAGER=/usr/bin/pgenviron[4] TERM=vtlOOenviron[5] PATH=/usr/bin:/bin:/etc:/usr/sbin:/sbin:/usr/ccs/bin:/usr/local/binenviron[6] HOME=/home/andyenviron[7] SHELL=/usr/local/bin/bash
2
 
Программирование для OS UNI
X
 Романенко В.А
Для получения и установки значений конкретных переменных окружения используютсядве функции:
 getenv(3C)
и
 putenv(3C):
#include <stdlib.h>char *getenv(const char *name) ;
возвращает значение переменной окружения name, a
int putenv(const char *string) ;
помещает переменную и ее значение (var_name=var_value) в окружение программы.Обычно при запуске программы на выполнение из командной строки shellавтоматически устанавливает для нее три стандартных потока ввода/вывода: для вводаданных, для вывода информации и для вывода сообщений об ошибках. Начальнуюассоциацию этих потоков с конкретными устройствами производит
терминальный сервер
в большинстве систем это процесс
 getty
 ,
который открывает специальный файлустройства, связанный с терминалом пользователя, и получает соответствующиедескрипторы. Эти потоки наследует командный интерпретатор shell и передает ихзапускаемой программе. При этом shell может изменить стандартные направления, еслипользователь указал на это с помощью специальных директив перенаправления потока.>fileПеренаправление стандартного потока вывода в файл>>fileДобавление в файл данных из стандартного потока<fileПолучение стандартного потока данных из файла p1|p2Передача стандартного потока вывода программы1 в поток ввода пр.2n>fileПереключение потока ввода из файла с дескриптором ‘nв файлn>>fileТоже но записи добавляютсяn>&mСлияние потоков с дескрипторами ‘nи ‘m<<strИспользуется стандартный поток ввода до подстроки STR с подстановкойметасимволов интерпретатора<<\strТоже но без подстановки
Обработка ошибок
Обычно в случае возникновения ошибки системные вызовы возвращают —1 и устанавливаютзначение переменной еггnо, указывающее причину возникновения ошибки. Файл заголовков
<errno.h>
содержит коды ошибок, значения которых может принимать переменная еггnо, скраткими комментариями.Стандарт ANSI С определяет две функции, помогающие сообщить причину ошибочнойситуации:
 strerror(SC)
и
 реrrоr(ЗС).
Переменная
еггnо
определена следующим образом:
external int errno;
Функция
strrrоr(ЗС)
 
объявлена следующим образом:
#nclude <string.h>char *strerror(int errnum);
Функция принимает в качестве аргумента errnum номер ошибки и возвращает указательна строку, содержащую сообщение о причине ошибочной ситуации.Функция
 реrrоr(ЗС)
объявлена следующим образом:
#include <errno.h>#include <stdio.h>void perror(const char *s);
3

Activity (4)

You've already reviewed this. Edit your review.
1 hundred reads
1 thousand reads
denisdenisoff liked this
traxium liked this

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->