Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Named Pipes: как с ними в линуксе обращаться?   Найти похожие ветки 

 
Галинка ©   (2007-11-13 18:33) [0]

Есть два канала. Как проверить, пишется в канал или нет? Хотя бы?


 
TUser ©   (2007-11-13 18:47) [1]

А они там есть?


 
Галинка ©   (2007-11-13 18:54) [2]

Есть они там. Созданы в консоли командой mkfifo ("pIn", 0600).


 
Ricko ©   (2007-11-13 23:25) [3]


> Как проверить, пишется в канал или нет? Хотя бы?
>

Записать и прочитать?


 
Галинка ©   (2007-11-14 11:14) [4]

Ладно, спрошу по другому. Важен ли формат данных, записываемых/считываемых через канал?


 
Сергей М. ©   (2007-11-14 11:21) [5]


> Важен ли формат данных, записываемых/считываемых через канал?
>
>


Важен для кого ?


 
Rouse_ ©   (2007-11-14 11:34) [6]


> Важен ли формат данных, записываемых/считываемых через канал?

Данные они как в Линуксе так и в винде одинаковые.


 
Галинка ©   (2007-11-14 14:42) [7]

Кокретнее. Есть струтура данных, прописаная и в клинте и в сервере:


fullduplex.h:

#define NP1 "/tmp/np1"
#define NP2 "/tmp/np2"

typedef Expression{
 int A, B;
 char Sign;
 int Result;
}

Expression _curExpr;


В клинте эта структура заполняется аргументами командной строки и записывается во входной канал сервера.


fd_client.c:
#include "fullduplex.h"

int main(int argc, char *argv[]){
int rdfd, wrfd;

memset(&_curExpr, 0, sizeof(Expression));
_curExpr.A = atoi(argv[1]);
_curExpr.B = atoi(argv[3]);
_curExpr.Sign = argv[2][0];

rdfd = open(NP1, O_PDONLY);
wrfd = open(NP2, O_WRONLY);

write(wrfd, _curExpr, sizeof(Expression));

read(rdfd, _curExpr, sizeof(Expression));

}

На стороне сервера происходит следующее:

rdfd = open(NP1, O_PDONLY);
wrfd = open(NP2, O_WRONLY);

read(rdfd, _curExpr, sizeof(Expression));

switch(_curExpr.Sign){
 case "+":
   _curExpr.Result = _curExpr.A + _curExpr.B;
   break;
 case "-":
   _curExpr.Result = _curExpr.A - _curExpr.B;
   break;
 case "*":
   _curExpr.Result = _curExpr.A * _curExpr.B;
   break;
 case "/":
   _curExpr.Result = _curExpr.A / _curExpr.B;
   break;
}

write(wrfd, _curExpr, sizeof(Expression));


Но сервер не может прочитать структуру. В чем может быть проблема?


 
Галинка ©   (2007-11-14 14:43) [8]

Со строкой (переводом в uppercase) все работало до этого. А со структурой не хочет ((


 
Bless ©   (2007-11-14 15:10) [9]

А разве второй параметр в функции read, write не должен быть указателем?


 
Игорь Шевченко ©   (2007-11-14 15:12) [10]


>  В чем может быть проблема?


В неверном выборе профессии.
Купи, наконец, книгу о вкусной и здоровой пище!


 
Zeqfreed ©   (2007-11-14 15:32) [11]

fullduplex.h:
#define NP1 "/tmp/np1"
#define NP2 "/tmp/np2"

struct Expression {
int A, B;
char Sign;
int Result;
};

struct Expression _curExpr;


fd_client.c:
#include "fullduplex.h"
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int rdfd, wrfd;

memset(&_curExpr, 0, sizeof(struct Expression));
_curExpr.A = atoi(argv[1]);
_curExpr.B = atoi(argv[3]);
_curExpr.Sign = argv[2][0];

rdfd = open(NP1, O_RDONLY);
printf("cli opened read pipe\n");
wrfd = open(NP2, O_WRONLY);
printf("cli opened write pipe\n");

write(wrfd, &_curExpr, sizeof(struct Expression));
printf("cli wrote data\n");

read(rdfd, &_curExpr, sizeof(struct Expression));
printf("cli read data\n");
}


fd_server.c:
#include "fullduplex.h"
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int rdfd, wrfd;

wrfd = open(NP1, O_WRONLY);
printf("srv opened write pipe\n");
rdfd = open(NP2, O_RDONLY);
printf("srv opened read pipe\n");

read(rdfd, &_curExpr, sizeof(struct Expression));
printf("srv read data\n");

switch(_curExpr.Sign){
 case "+":
    _curExpr.Result = _curExpr.A + _curExpr.B;
    break;
 case "-":
    _curExpr.Result = _curExpr.A - _curExpr.B;
    break;
 case "*":
    _curExpr.Result = _curExpr.A * _curExpr.B;
   break;
 case "/":
 _curExpr.Result = _curExpr.A / _curExpr.B;
    break;
}

write(wrfd, &_curExpr, sizeof(struct Expression));
printf("srv wrote data\n");
}


Советую обратить внимание на порядок открытия пайпов и ознакомиться с man 7 fifo. А код в [7] вообще чем компилироваться должен был? :)


 
Галинка ©   (2007-11-14 16:00) [12]

Спасибо Bless и Zeqfreed. Действительно дело в формате передачи параметров. Ман в линуксе выдал про write только то, что можно юзеру сообщение послать ((

Компилирую в шеле. Про fifo почитаю.


 
Zeqfreed ©   (2007-11-14 16:13) [13]

> Галинка ©   (14.11.07 16:00) [12]

С помощью gcc? Тот код не должен компилироваться :)


 
Галинка ©   (2007-11-14 16:22) [14]


> Zeqfreed ©   (14.11.07 16:13) [13]


почему? Просто я не все наверное скопировала. Инклуды не все точно. Я думала только информативные строчки нужны ))


 
Zeqfreed ©   (2007-11-14 16:26) [15]

> Галинка ©   (14.11.07 16:22) [14]

Ну как минимум из-за того, что open и write принимают вторым параметром указатель и идентификатора O_PDONLY в стандартных заголовках нет :)

А приводить желательно полностью код, т.к. приятно все-таки, когда не требуется самому дописывать половину кода, чтобы запустить код. Да и от всяких мелочей, которые опускаются, тоже многое зависит.


 
Галинка ©   (2007-11-14 16:33) [16]

Zeqfreed ©   (14.11.07 16:26) [15]

про указатель спасибо. А O_PDONLY это опечатка конечно. Должно быть O_RDONLY. Но без указателей скомпилил и даже не икнул (( А потом просто вис ((

В след. раз попробую полностью. Просто код в линуксе в вирт.машине а форум в винде. Копи/пасте не работает )))


 
Zeqfreed ©   (2007-11-14 16:41) [17]

> Галинка ©   (14.11.07 16:33) [16]

Понятно. Там должно быть предупреждение passing argument 2 of ‘write’ makes pointer from integer without a cast.


 
Галинка ©   (2007-11-14 16:50) [18]

Понятно, что должно. Но нет его. Убрала амперсенты сохранила и скомпилила. И скомпилилось ((


 
Ricko ©   (2007-11-14 18:11) [19]


> Галинка ©   (14.11.07 16:00) [12]
> Ман в линуксе выдал про write только то, что можно юзеру
> сообщение послать ((

man 2 write



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.067 c
2-1194872329
DimOk
2007-11-12 15:58
2007.12.09
Как подключить файл помощи


2-1194776157
alikon1
2007-11-11 13:15
2007.12.09
arctan в Delphi


1-1190197939
ari_9
2007-09-19 14:32
2007.12.09
как получить событие смены пользователем языка ввода ?


2-1194901296
Vice____
2007-11-13 00:01
2007.12.09
TEdit>мой компонент


1-1190366442
nali
2007-09-21 13:20
2007.12.09
Ошибка при динамическом создании компонента.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский