Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.042 c