The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Код на С не работает в Solaris (скажите что не так)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от varvara_88 email(ok) on 18-Май-11, 14:50 
Это лаба с иммитацией механизма клиент-сервер, дана как образец но серверная часть не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии q не останавливается. поскажите что не так

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#define fifo "./fifo" //объявление имени именованного канала
int main(int argc, char * argv[])
{
FILE * file_fifo; //структура для работы с файлом
char ch;
mkfifo(fifo, 0700); //создание канала, с именем fifo, с маской прав доступа 0700
file_fifo = fopen(fifo, "w"); //открытие канала на запись
if (file_fifo == NULL) //обработка ошибки открытия
{
errno=EBADFD; //File descriptor in bad state
perror(argv[0]);
return -1;
}
do
{
ch = getchar(); //считать символ
fputc(ch, file_fifo); //запись в канал
if (ch == 10) fflush(file_fifo);//принудительная очистка буферов канала, в результате чего клиент считывает все переданные символы.
} while (ch != 'q'); //ввод символов до символа 'q'
fclose(file_fifo); //закрытие файла
unlink(fifo); //удаление канала
return 0;
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от Вова on 18-Май-11, 15:36 
>[оверквотинг удален]
> {
> ch = getchar(); //считать символ
> fputc(ch, file_fifo); //запись в канал
> if (ch == 10) fflush(file_fifo);//принудительная очистка буферов канала, в результате
> чего клиент считывает все переданные символы.
> } while (ch != 'q'); //ввод символов до символа 'q'
> fclose(file_fifo); //закрытие файла
> unlink(fifo); //удаление канала
> return 0;
> }

Я знаю, что не так, а ты симпатичная?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от ACCA (ok) on 18-Май-11, 17:15 
> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии
> q не останавливается. поскажите что не так

Он и не начинался. То, что ты видишь - echo из stdin.

1. Пока клиент не прицепился, fopen(fifo... блокируется
2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь
   Enter в конце строки или не заполнишь все 4К буфера. То есть while ждёт
   не "нажатия q", а строку или буфер, в котором попадётся q.

Используй strace, чтобы понять, что происходит.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от Вова on 18-Май-11, 17:34 
>> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии
>> q не останавливается. поскажите что не так
> Он и не начинался. То, что ты видишь - echo из stdin.
> 1. Пока клиент не прицепился, fopen(fifo... блокируется
> 2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь
>    Enter в конце строки или не заполнишь все 4К
> буфера. То есть while ждёт
>    не "нажатия q", а строку или буфер, в котором
> попадётся q.
> Используй strace, чтобы понять, что происходит.

1 - согласен, а буферизации stdin тут не видно.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от varvara_88 email(ok) on 18-Май-11, 18:58 
Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Код на С не работает в Solaris (скажите что не так)"  +3 +/
Сообщение от ACCA (ok) on 18-Май-11, 19:13 
> Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)

Это ты Вове утром расскажешь...

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от Вова on 19-Май-11, 13:55 
>> Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)
> Это ты Вове утром расскажешь...

В принципе, вообще можно сказать такими словами  - мол стдин буфферизируется, но это только следствие причины - режима терминала. Надо терминал переводить в non-canonical-режим - tcsetattr(..). То есть правовернее говорить "терминал не в том режиме".

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

6. "Код на С не работает в Solaris (скажите что не так)"  +/
Сообщение от q (??) on 18-Май-11, 23:37 
попробуй исправить так:
file_fifo = fopen(fifo, "w");
на
file_fifo = fopen(fifo, "r+");

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру