Комментарии к коду лабораторных по Unix.
Primary tabs
/* Это третье задание к 1-ой лабораторной - Отредактируйте prog1.c – отмените комментарии для блокировок файла (то что было закомментировано -см. в методичке) . откомпилируйте файл заново. Собственно говоря - исходник дан преподавателем ,а наша задача состоит в том, чтобы разобраться с кодом.*/ #include <stdio.h> /* standard input/output header — стандартный заголовочный файл ввода/вывода */ #include <stdlib.h> /*stdlib.h — заголовочный файл стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие*/ #include <unistd.h> /* определяет различные символьные константы и типы и объявляет некоторые функции. */ #include <sys/wait.h> /* заголовок определяет ряд символьных констант, используемых с waitpid()*/ #include <sys/file.h> /* определяет константы для операций с файлами */ #include <sys/stat.h> /* определяет структуру данных .возвращаемых функциями fstat(),lstat() и stat().*/ const char *filename = "messagebuf.dat"; /* указатель на область с именем файла. */ char msgbuf[64]; /* выделение памяти под символьный массив динной 64 байта */ void error_out(const char *msg) /* фукция которая не возвращает значения, но при этом получает указатель на неизменяемую символьную область.*/ { perror(msg); /* выведет сообщение о последней ошибке, произошедшей во время выполнения функции или системного вызова + переданный, определяемый программистом параметр-сообщение, например - "Опять на работает !!!!!" */ exit(EXIT_FAILURE); /* ничего не возвращает, но требует параметр статуса выхода - любое число, соответсвующее коду ошибки, однако следует помнить, что наиболее безопасным является указание: 0 или EXIT_SUCCESSFUL при успехе и EXIT_FAILURE (не единица) при неудаче. */ } void child(void) { /*With mandatory locks we block here until the parent unlocks the file. */ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* устанавливает связь между файлом и его переменной-дискриптором. открывается с параметром который получается путём побитного сложения констант => обладает всеми их свойствами. подробнее см -http://pubs.opengroup.org/onlinepubs/009... третий аргумент определяет параметры*/ if (fd == -1) /* Если функция вернула -1 , то значит открыть файл не удалось. */ error_out("parent:open"); /* выводим сообщение о том, что открыть файл не удалось и описание последней произошедшей ошибки.*/ /* With advisory locks we block here until the parent unlocks the file.*/ int r = lockf(fd, F_LOCK, 0); /*Устанавливает POSIX-блокировку на открытом файле. F_LOCK - устанавливает блокировку на файле. Только один процесс может блокировать данный файл в текущий момент времени. Если файл уже блокирован, то он будет блокирован позже, когда будет снята предыдущая блокировка. */ if (r == -1) /* если блокировку установить не удалось выводим сообщение об этом деле. */ error_out("child:lockf"); /* */ /* Now we know the data is valid. - теперь мы знаем что данные доступны. */ int len = read(fd, msgbuf, sizeof(msgbuf)); /* */ if (len <= 0) /* */ error_out("client:read"); /* */ else printf("child read: %s\n",msgbuf ); /* выводим сообщение о том, что потомок читает указаный файл. */ close(fd); /* преращаем работу с файлом */ } void parent(int fd) { /* Read a message from console and write the message to the file. - читаем сообщение из консоли и выводим в файл. */ printf("Enter a message > "); /* */ scanf("%s", msgbuf); /* */ write(fd, msgbuf, sizeof(msgbuf)); /* */ /* Flush the user-space buffers to the filesystem before unlocking. - сливаем данные буфера в файл*/ fsync(fd); /* обеспечивает запись измененных данных в файл, заданный дескриптором - функция для асинхронной записи. */ /* As soon as the data on the filesystem is up-to-date we can unlock the file and let the child read it. - после того как в файловой системе обновлены мы можем разблокровать файл=> позволить процессу-потомку его прочитать.*/ int r = lockf(fd, F_ULOCK, 0); /* видимо. происходит открытие доступа к файлу, благодаря параметру F_ULOCK*/ if (r == -1) /* */ error_out("lockf:F_ULOCK"); /* сообщаем об ошибке если снять блокировку с файла не получилось.*/ close(fd); /* */ } int main(int argc, char *argv[]) /* */ { int status = 0; /* */ /* Create the file before the fork - до того как ветвится( дословно - форкнуться ) создаём файл .*/ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* */ if (fd == -1) /* */ error_out("parent:open"); /* */ /* Put an exclusive lock on the file. - блокировка файла исклучительно для одного процесса. */ int r = lockf(fd, F_LOCK, 0); /* блокируем файл */ if (r == -1) error_out("parent:lockf"); /*выводим сообщение об ошибке для случая если блокировка не удалась */ /* Now we fork with the file locked. - теперь мы создали новый процесс с заблокированным файлом. */ pid_t pid = fork(); /* */ switch (pid) /* проверяем значение которое получила данная переменная */ { case -1: error_out("main:fork"); /* если это то выводим сообщение об ошибки*/ case 0: /* Run the child-only code. - запускаем код потомка - кстати, этот раздел выполнится только для родителя, потому что только в контектсте родителя fork вернёт значение "0" => потомок не сможет породить ещё одного потомка в данной ситуации.*/ /* */ child(); /* запускаем код потомка. */ exit(0); /* завершаем процессс-потомок. */ default: /* Run the parent-only code and wait for the child to finish. - здесь исполням только код родителя и ждём пока завершится потомок. */ /* */ parent(fd); /* запускаем код родителя*/ wait(&status); /* получает статус процесса-потомка. функция приостанавливает вызывающего блока до того момента пока не станет доступной статус-информация одного из завершившихся процессов-потомков данного процесса.*/ /* Child returns non-zero status on failure. */ printf("child status=%d\n", WEXITSTATUS(status)); /* */ } unlink(filename); /* удаляем файловый дескриптор и сам файл. */ exit(0);/* перед завершением приложения функция вызывает ряд других функций. */ } /* Ниже я сваливаю в кучу материал из интернета по поводу различных функций и вообще - непонятных вещей, которые имели место в программе */ /* */
/* Это третье задание к 1-ой лабораторной - Отредактируйте prog1.c – отмените комментарии для блокировок файла (то что было закомментировано -см. в методичке) 3. Редактируем child.c $ vi child.c ? удалить процедуру parent() ... ? заменить декларацию функции error_out() на extern void error_out(const char *msg); ? заменить тело main() на child(); return 0; ? сохранить файл . откомпилируйте файл заново. Собственно говоря - исходник дан преподавателем ,а наша задача состоит в том, чтобы разобраться с кодом.*/ #include <stdio.h> /* standard input/output header — стандартный заголовочный файл ввода/вывода */ #include <stdlib.h> /*stdlib.h — заголовочный файл стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие*/ #include <unistd.h> /* определяет различные символьные константы и типы и объявляет некоторые функции. */ #include <sys/wait.h> /* заголовок определяет ряд символьных констант, используемых с waitpid()*/ #include <sys/file.h> /* определяет константы для операций с файлами */ #include <sys/stat.h> /* определяет структуру данных .возвращаемых функциями fstat(),lstat() и stat().*/ const char *filename = "messagebuf.dat"; /* указатель на область с именем файла. */ char msgbuf[64]; /* выделение памяти под символьный массив динной 64 байта */ extern void error_out(const char *msg) /* фукция которая не возвращает значения, но при этом получает указатель на неизменяемую символьную область.*/ { perror(msg); /* выведет сообщение о последней ошибке, произошедшей во время выполнения функции или системного вызова + переданный, определяемый программистом параметр-сообщение, например - "Опять на работает !!!!!" */ exit(EXIT_FAILURE); /* ничего не возвращает, но требует параметр статуса выхода - любое число, соответсвующее коду ошибки, однако следует помнить, что наиболее безопасным является указание: 0 или EXIT_SUCCESSFUL при успехе и EXIT_FAILURE (не единица) при неудаче. */ } void child(void) { /*With mandatory locks we block here until the parent unlocks the file. */ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* устанавливает связь между файлом и его переменной-дискриптором. открывается с параметром который получается путём побитного сложения констант => обладает всеми их свойствами. подробнее см -http://pubs.opengroup.org/onlinepubs/009... третий аргумент определяет параметры*/ if (fd == -1) /* Если функция вернула -1 , то значит открыть файл не удалось. */ error_out("parent:open"); /* выводим сообщение о том, что открыть файл не удалось и описание последней произошедшей ошибки.*/ /* With advisory locks we block here until the parent unlocks the file.*/ int r = lockf(fd, F_LOCK, 0); /*Устанавливает POSIX-блокировку на открытом файле. F_LOCK - устанавливает блокировку на файле. Только один процесс может блокировать данный файл в текущий момент времени. Если файл уже блокирован, то он будет блокирован позже, когда будет снята предыдущая блокировка. */ if (r == -1) /* если блокировку установить не удалось выводим сообщение об этом деле. */ error_out("child:lockf"); /* */ /* Now we know the data is valid. - теперь мы знаем что данные доступны. */ int len = read(fd, msgbuf, sizeof(msgbuf)); /* */ if (len <= 0) /* */ error_out("client:read"); /* */ else printf("child read: %s\n",msgbuf ); /* выводим сообщение о том, что потомок читает указаный файл. */ close(fd); /* преращаем работу с файлом */ } int main(int argc, char *argv[]) /* */ { child(); return 0; }
/* Это четвёртое задание к 1-ой лпбораторной - Разделим программу на две отдельных программы: parent.c и child.c и выполним в процессе потомке, порожденном процессом parent, программу child. Для этого используется системный вызов execve.(см. методичку.) Редактируем parent.c: $ vi parent.c ? удалить процедуру child() ... ? заменить декларацию функции error_out() на ? добавить в начале main декларацию extern void error_out(const char *msg); ? заменить в main() операции в case 0: на char *const env[] = {“PATH=.”, NULL}; ? сохранить файл */ #include <stdio.h> /* standard input/output header — стандартный заголовочный файл ввода/вывода */ #include <stdlib.h> /*stdlib.h — заголовочный файл стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие*/ #include <unistd.h> /* определяет различные символьные константы и типы и объявляет некоторые функции. */ #include <sys/wait.h> /* заголовок определяет ряд символьных констант, используемых с waitpid()*/ #include <sys/file.h> /* определяет константы для операций с файлами */ #include <sys/stat.h> /* определяет структуру данных .возвращаемых функциями fstat(),lstat() и stat().*/ const char *filename = "messagebuf.dat"; /* указатель на область с именем файла. */ char msgbuf[64]; /* выделение памяти под символьный массив динной 64 байта */ extern void error_out(const char *msg) /* заменить декларацию функции error_out() на extern void error_out(const char *msg);*/ { perror(msg); /* выведет сообщение о последней ошибке, произошедшей во время выполнения функции или системного вызова + переданный, определяемый программистом параметр-сообщение, например - "Опять на работает !!!!!" */ exit(EXIT_FAILURE); /* ничего не возвращает, но требует параметр статуса выхода - любое число, соответсвующее коду ошибки, однако следует помнить, что наиболее безопасным является указание: 0 или EXIT_SUCCESSFUL при успехе и EXIT_FAILURE (не единица) при неудаче. */ } /*здесь удалена процедура child*/ void parent(int fd) { /* Read a message from console and write the message to the file. - читаем сообщение из консоли и выводим в файл. */ printf("Enter a message > "); /* */ scanf("%s", msgbuf); /* */ write(fd, msgbuf, sizeof(msgbuf)); /* */ /* Flush the user-space buffers to the filesystem before unlocking. - сливаем данные буфера в файл*/ fsync(fd); /* обеспечивает запись измененных данных в файл, заданный дескриптором - функция для асинхронной записи. */ /* As soon as the data on the filesystem is up-to-date we can unlock the file and let the child read it. - после того как в файловой системе обновлены мы можем разблокровать файл=> позволить процессу-потомку его прочитать.*/ int r = lockf(fd, F_ULOCK, 0); /* видимо. происходит открытие доступа к файлу, благодаря параметру F_ULOCK*/ if (r == -1) /* */ error_out("lockf:F_ULOCK"); /* сообщаем об ошибке если снять блокировку с файла не получилось.*/ close(fd); /* */ } int main(int argc, char *argv[]) /* */ { char *const env[] = {"PATH=.", NULL};// этот массив констант добавлен для выполнения 4-ого задания - ".....добавить в начале main декларацию." int status = 0; /* */ /* Create the file before the fork - до того как ветвится( дословно - форкнуться ) создаём файл .*/ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* */ if (fd == -1) /* */ error_out("parent:open"); /* */ /* Put an exclusive lock on the file. - блокировка файла исклучительно для одного процесса. */ int r = lockf(fd, F_LOCK, 0); /* блокируем файл */ if (r == -1) error_out("parent:lockf"); /*выводим сообщение об ошибке для случая если блокировка не удалась */ /* Now we fork with the file locked. - теперь мы создали новый процесс с заблокированным файлом. */ pid_t pid = fork(); /* */ switch (pid) /* проверяем значение которое получила данная переменная */ { case -1: error_out("main:fork"); /* если это то выводим сообщение об ошибки*/ case 0: execve("./child", NULL, env); // запускает программу ,ссылка на файл исполняемого кода которой находится в списке параметров функции передаёт есй список переменных-строк и список переменных среды окружение - второй параметр. default: /* Run the parent-only code and wait for the child to finish. - здесь исполням только код родителя и ждём пока завершится потомок. */ /* */ parent(fd); /* запускаем код родителя*/ wait(&status); /* получает статус процесса-потомка. функция приостанавливает вызывающего блока до того момента пока не станет доступной статус-информация одного из завершившихся процессов-потомков данного процесса.*/ /* Child returns non-zero status on failure. */ printf("child status=%d\n", WEXITSTATUS(status)); /* */ } unlink(filename); /* удаляем файловый дескриптор и сам файл. */ exit(0);/* перед завершением приложения функция вызывает ряд других функций. */ }
/* Это третье задание к 1-ой лпбораторной - Отредактируйте prog1.c – отмените комментарии для блокировок файла (то что было закомментировано -см. в методичке) . откомпилируйте файл заново. Собственно говоря - исходник дан преподавателем ,а наша задача состоит в том, чтобы разобраться с кодом. 4. Редактируем errmsg.c $ vi child.c ? удалить все функции, кроме error_out() ... ? сохранить файл :wq */ #include <stdio.h> /* standard input/output header — стандартный заголовочный файл ввода/вывода */ #include <stdlib.h> /*stdlib.h — заголовочный файл стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие*/ #include <unistd.h> /* определяет различные символьные константы и типы и объявляет некоторые функции. */ #include <sys/wait.h> /* заголовок определяет ряд символьных констант, используемых с waitpid()*/ #include <sys/file.h> /* определяет константы для операций с файлами */ #include <sys/stat.h> /* определяет структуру данных .возвращаемых функциями fstat(),lstat() и stat().*/ const char *filename = "messagebuf.dat"; /* указатель на область с именем файла. */ char msgbuf[64]; /* выделение памяти под символьный массив динной 64 байта */ void error_out(const char *msg) /* фукция которая не возвращает значения, но при этом получает указатель на неизменяемую символьную область.*/ { perror(msg); /* выведет сообщение о последней ошибке, произошедшей во время выполнения функции или системного вызова + переданный, определяемый программистом параметр-сообщение, например - "Опять на работает !!!!!" */ exit(EXIT_FAILURE); /* ничего не возвращает, но требует параметр статуса выхода - любое число, соответсвующее коду ошибки, однако следует помнить, что наиболее безопасным является указание: 0 или EXIT_SUCCESSFUL при успехе и EXIT_FAILURE (не единица) при неудаче. */ } void child(void) { /*With mandatory locks we block here until the parent unlocks the file. */ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* устанавливает связь между файлом и его переменной-дискриптором. открывается с параметром который получается путём побитного сложения констант => обладает всеми их свойствами. подробнее см -http://pubs.opengroup.org/onlinepubs/009... третий аргумент определяет параметры*/ if (fd == -1) /* Если функция вернула -1 , то значит открыть файл не удалось. */ error_out("parent:open"); /* выводим сообщение о том, что открыть файл не удалось и описание последней произошедшей ошибки.*/ /* With advisory locks we block here until the parent unlocks the file.*/ int r = lockf(fd, F_LOCK, 0); /*Устанавливает POSIX-блокировку на открытом файле. F_LOCK - устанавливает блокировку на файле. Только один процесс может блокировать данный файл в текущий момент времени. Если файл уже блокирован, то он будет блокирован позже, когда будет снята предыдущая блокировка. */ if (r == -1) /* если блокировку установить не удалось выводим сообщение об этом деле. */ error_out("child:lockf"); /* */ /* Now we know the data is valid. - теперь мы знаем что данные доступны. */ int len = read(fd, msgbuf, sizeof(msgbuf)); /* */ if (len <= 0) /* */ error_out("client:read"); /* */ else printf("child read: %s\n",msgbuf ); /* выводим сообщение о том, что потомок читает указаный файл. */ close(fd); /* преращаем работу с файлом */ } void parent(int fd) { /* Read a message from console and write the message to the file. - читаем сообщение из консоли и выводим в файл. */ printf("Enter a message > "); /* */ scanf("%s", msgbuf); /* */ write(fd, msgbuf, sizeof(msgbuf)); /* */ /* Flush the user-space buffers to the filesystem before unlocking. - сливаем данные буфера в файл*/ fsync(fd); /* обеспечивает запись измененных данных в файл, заданный дескриптором - функция для асинхронной записи. */ /* As soon as the data on the filesystem is up-to-date we can unlock the file and let the child read it. - после того как в файловой системе обновлены мы можем разблокровать файл=> позволить процессу-потомку его прочитать.*/ int r = lockf(fd, F_ULOCK, 0); /* видимо. происходит открытие доступа к файлу, благодаря параметру F_ULOCK*/ if (r == -1) /* */ error_out("lockf:F_ULOCK"); /* сообщаем об ошибке если снять блокировку с файла не получилось.*/ close(fd); /* */ } int main(int argc, char *argv[]) /* */ { int status = 0; /* */ /* Create the file before the fork - до того как ветвится( дословно - форкнуться ) создаём файл .*/ int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0666 /*|S_ISGID */ ); /* */ if (fd == -1) /* */ error_out("parent:open"); /* */ /* Put an exclusive lock on the file. - блокировка файла исклучительно для одного процесса. */ int r = lockf(fd, F_LOCK, 0); /* блокируем файл */ if (r == -1) error_out("parent:lockf"); /*выводим сообщение об ошибке для случая если блокировка не удалась */ /* Now we fork with the file locked. - теперь мы создали новый процесс с заблокированным файлом. */ pid_t pid = fork(); /* */ switch (pid) /* проверяем значение которое получила данная переменная */ { case -1: error_out("main:fork"); /* если это то выводим сообщение об ошибки*/ case 0: /* Run the child-only code. - запускаем код потомка - кстати, этот раздел выполнится только для родителя, потому что только в контектсте родителя fork вернёт значение "0" => потомок не сможет породить ещё одного потомка в данной ситуации.*/ /* */ child(); /* запускаем код потомка. */ exit(0); /* завершаем процессс-потомок. */ default: /* Run the parent-only code and wait for the child to finish. - здесь исполням только код родителя и ждём пока завершится потомок. */ /* */ parent(fd); /* запускаем код родителя*/ wait(&status); /* получает статус процесса-потомка. функция приостанавливает вызывающего блока до того момента пока не станет доступной статус-информация одного из завершившихся процессов-потомков данного процесса.*/ /* Child returns non-zero status on failure. */ printf("child status=%d\n", WEXITSTATUS(status)); /* */ } unlink(filename); /* удаляем файловый дескриптор и сам файл. */ exit(0);/* перед завершением приложения функция вызывает ряд других функций. */ }
Makefile =
CC=gcc PROGS=parent child CFLAGS=-Wall all: $(PROGS) child: child.c errmsg.o parent: parent.c errmsg.o $(CC) $(CFLAGS) parent.c errmsg.o -o parent errmsg.o: errmsg.c $(CC) $(CFLAGS) -c errmsg.c -o errmsg.o clean: rm -f *.o rm -f *.so rm -f *.a rm -f $(PROGS)
===============================это всё по первой лабе. конец 1-ой=============================
- Log in to post comments
- 24555 reads
Comments
tata_la
Fri, 09/09/2011 - 17:58
Permalink
вторая лаба
===================это всё есть по второй.=========================
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Fri, 09/09/2011 - 21:37
Permalink
третья лаба
============Конец третьей лабы =====================
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:18
Permalink
5-ая лабораторная (перед ней можете разместить четвёртую)
=========================================
====================================
===========================
================================
======================это всё, что есть по 5-ой===========
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:23
Permalink
6-ая лаба и комментарии к ней.
========================
================================
===================всё по 6-ой==================
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:44
Permalink
7-ая
================
==============================
==========================
============================
===============добавляйте материалы и заметки по 7-ой ниже==================
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:47
Permalink
8-ая
=========================
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:49
Permalink
и3 11=ой
С каждым сокет связываются три атрибута: домен, тип и протокол. Эти атрибуты задаются при создании сокета и остаются неизменными на протяжении всего времени его существования. Для создания сокета используется функция socket, имеющая следующий прототип.
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:50
Permalink
и3 11=ой
_________ _ _ ______
dthcbz фкн вгу and co
tata_la
Sat, 09/10/2011 - 11:53
Permalink
и3 11=ой
_________ _ _ ______
dthcbz фкн вгу and co