Cat > fifo1

Затем набирайте произвольные строки, завершите ввод символом конца файла CTRL-d. Что будет выведено в первом окне?

В программе именованный канал создается при помощи системного вызова mknod() или библиотечной функции mkfifo(), которая, в свою очередь, использует mknod().

В этой части лабораторной работы необходимо создать и проверить несколько вариантов клиент/серверной системы, основанной на именованном канале. Предполагается, что сервер создает именованный канал и пытается читать из него данные. Клиент запускается после старта сервера и записывает в канал некоторые данные для сервера, затем клиент завершается. После чтения данных из канала сервер распечатывает их и также завершается.

Задание3.

3.1. Наберите и выполните программы server.c и client.c(их тексты имеются в папке Methodic/…):

 

/* server.c SERVER PROGRAM */

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

#define FIFONAME "..." /* Some unique name of pipe must be specified here */

 

int main(void)

{

int n, fd;

char buf[1024]; /* A buffer for reading and writing the pipe */

 

printf (“SERVER STARTS…n”);

 

/* Remove any previously created pipe with this name if any. */

unlink(FIFONAME);

 

/* Create a named pipe with the permissions to write and read for all. */

if (mkfifo(FIFONAME, 0666) < 0) {

perror("mkfifo problem in server");

exit(1);

}

 

/* Make sure that the permission flag is really 0666 */

if (chmod(FIFONAME, 0666) < 0)

{perror("chmod problem in server"); exit(1);}

 

/* Open the created named pipe for reading. */

if ((fd = open(FIFONAME, O_RDONLY)) < 0) {

perror("open problem in server");

exit(1);

}

 

/*

* Read from the named pipe until end-of-file,

* and print what we get on the standard output.

*/

while ((n = read(fd, buf, sizeof(buf))) > 0)

write(1, buf, n);

 

close(fd);

printf (“SERVER TERMINATED…n”);

exit(0);

}

 

 

/* client.c CLIENT PROGRAM*/

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

#define FIFONAME "..." /* The same name as in server must be specified here */

 

int main(void)

{

int n, fd;

char buf[1024]; /* Buffer for reading */

 

printf (“CLIENT STARTS…n”);

 

/* Open existing named pipe for writing. It was

* created by the server already.

*/

if ((fd = open(FIFONAME, O_WRONLY)) < 0) {

perror("open problem in client");

exit(1);

}

 

/*

* Read any text from standard input, and copy

* this text data to the named pipe. The text must be finished by Ctrl/d

*/

while ((n = read(0, buf, sizeof(buf))) > 0)

write(fd, buf, n);

 

printf (“CLIENT TERMINATED…n”);

close(fd);

exit(0);

}

 

3.2. Запустите серверный процесс (без параметров в командной строке) в фоновом режиме. Вы увидите соответствующий идентификатор процесса. Проверьте Ваш каталог, чтобы убедиться, что именованный канал создан.

3.3. Запустите клиентский процесс без параметров в командной строке. Введите с клавиатуры несколько строк какого-либо сообщения и завершите его символом конца файла, Ctrl-d. Запишите в отчет вид экрана.

3.4. Повторите задание 3.2. Но теперь запустите сервер, как обычно, на переднем плане.

3.5. Запустите вторую копию оболочки. Теперь Вы будете иметь два виртуальных терминала: один для сервера и другой для клиента. Расположите оба окна так, чтобы они одновременно были видны на экране. Со второго терминала запустите клиентский процесс и введите несколько строк с клавиатуры (завершив их символом Ctrl-d). Запишите в отчет вид обоих экранов.

3.6. Повторите задания 3.4 и 3.5. Но теперь запустите клиентский процесс таким образом, чтобы он считывал информацию из какого-либо текстового файла (например, из файла с исходным текстом клиентской программы). Что Вы увидите на экране серверного терминала?

3.7. Модифицируйте обе программы (для сервера и клиента) так, чтобы имя канала можно было задавать в командной строке (вместо директивы #define FIFONAME). Дайте программам имена server2.c и client2.c. Создайте исполняемый файл для модифицированной программы и повторите задания 3.4, 3.5 и 3.6.

3.8. В client2.c замените цикл while фрагментом, который записывает какое-нибудь постоянное сообщение в buf (вместо чтения текста с клавиатуры). Дайте программе имя client3.c. Для client3.c и server2.c повторите задания 3.4 и 3.5.

3.9. Проверьте действие режима O_NONBLOCK (или O_NDELAY), указывая его при открытии канала. Запишите в отчет Ваши выводы.

3.10. Проверьте Ваш каталог. Удалите все оставшиеся там именованные каналы.