Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec19_razrab.ppt
Скачиваний:
19
Добавлен:
20.03.2015
Размер:
201.73 Кб
Скачать

Файловые операции

Стандарт POSIX – дескриптор файла – целочисленный номер

int open(const char *pathname, int flags);

int close(int fd);

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

Стандарт ANSI C – дескриптор файла – указатель на структуру

FILE *fopen(const char *path, const char *mode);

int fclose(FILE *stream);

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Файловые операции

Файловые операции возможны с любыми файловыми объектами

Дисковый файл

Файл устройства

Конвейер (fifo)

Сокет

Каждая программа обычно имеет в начале 3 дескриптора

Стандартный ввод дескриптор номер 0 - входной

Стандартный вывод дескриптор номер 1 - выходной

Стандартный поток ошибок дескриптор номер 2 -выходной

Переназначение файлового дескриптора

Файловый дескриптор соответствует открытому файлу

Можно менять номера дескрипторов файлов, чтобы связывать нужный файл с нужным дескриптором

Функции

int dup(int oldfd); - создать новый дескриптор – копию старого

int dup2(int oldfd, int newfd); - сделать так, чтобы newfd стал тоже связан с файлом, с которым связан oldfd

Пример перенаправления ввода вывода

//io.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main() {

int out_fd;

//открываем новый файл

out_fd = open("./new_file",O_WRONLY|O_CREAT);

//делаем это файл новым стандартным вводом dup2(out_fd,1);

//выполненная команда выдаст результат в новый файл //учитывая наследование дескрипторов открытых файлов execlp("ps","ps",NULL);

}

Пример выполнения

[saa@cluster processes]$ gcc io.c [saa@cluster processes]$ ./a.out [saa@cluster processes]$ cat new_file

PID TTY

TIME CMD

26544 pts/1

00:00:00 bash

27315 pts/1

00:00:00 ps

[saa@cluster processes]$

Взаимодействие между процессами

Конвейеры

Общая память

Семафоры

Конвейеры

int pipe(int filedes[2]);

Создает массив из двух связанных дескрипторов

Все, что записывается в одни дескриптор, можно читать из другого

Используется для перенаправление ввода- вывода между родительским и порожденным процессами

Пример

#include <unistd.h>

#include <stdio.h>

int main() {

int channel[2];

pipe(channel);

char buf[10]; switch ( fork() ){

case 0: //порожденный процесс попадает сюда //мы только пишем close(channel[0]);

// пишем родителю write(channel[1],"MESSAGE",8); break;

default: //родительскийпроцесс попадает сюда

//мы только ситаем close(channel[1]);

//читаем информацию от порожденного read(channel[0],buf,8);

printf("GOT FROM CHILD \"%s\"\n", buf); break;

}

return 0;

}

Пример выполнения

[saa@cluster processes]$ gcc ./pipe.c [saa@cluster processes]$ ./a.out GOT FROM CHILD "MESSAGE"

Общая память

Есть два стандарта UNIX и POSIX

Стандарт POSIX

Общая память – файловый объект

Операции

Создать

Открыть

Задать размер

Уничтожить

Отобразить на память процесса

Удалить отображение на адресное пространство

Соседние файлы в папке Лекции