Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
2-1195012746
Brave
2007-11-14 06:59
2007.12.09
Интересно, реально ли такое...


2-1195097407
sidorov
2007-11-15 06:30
2007.12.09
Почему вы удаляете мои сообщения?


15-1193990034
@!!ex
2007-11-02 10:53
2007.12.09
Как вытащить данные?


5-1164114503
Igor_thief
2006-11-21 16:08
2007.12.09
Проблема с TPageContorl


11-1181038471
SergeR
2007-06-05 14:14
2007.12.09
Пожелания по сайту KOLnMCK.ru