![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Named Pipes: как с ними в линуксе обращаться?
Галинка © (2007-11-13 18:33:00)Есть два канала. Как проверить, пишется в канал или нет? Хотя бы?
Ricko (2007-11-14 18:11:00) [1]
> Галинка © (14.11.07 16:00) [12]
> Ман в линуксе выдал про write только то, что можно юзеру
> сообщение послать ((
man 2 write
Галинка (2007-11-14 16:50:00) [2]Понятно, что должно. Но нет его. Убрала амперсенты сохранила и скомпилила. И скомпилилось ((
Zeqfreed (2007-11-14 16:41:00) [3]> Галинка © (14.11.07 16:33) [16]
Понятно. Там должно быть предупреждениеpassing argument 2 of ‘write’ makes pointer from integer without a cast.
Галинка (2007-11-14 16:33:00) [4]Zeqfreed © (14.11.07 16:26) [15]
про указатель спасибо. А O_PDONLY это опечатка конечно. Должно быть O_RDONLY. Но без указателей скомпилил и даже не икнул (( А потом просто вис ((
В след. раз попробую полностью. Просто код в линуксе в вирт.машине а форум в винде. Копи/пасте не работает )))
Zeqfreed (2007-11-14 16:26:00) [5]> Галинка © (14.11.07 16:22) [14]
Ну как минимум из-за того, что open и write принимают вторым параметром указатель и идентификатора O_PDONLY в стандартных заголовках нет :)
А приводить желательно полностью код, т.к. приятно все-таки, когда не требуется самому дописывать половину кода, чтобы запустить код. Да и от всяких мелочей, которые опускаются, тоже многое зависит.
Галинка (2007-11-14 16:22:00) [6]
> Zeqfreed © (14.11.07 16:13) [13]
почему? Просто я не все наверное скопировала. Инклуды не все точно. Я думала только информативные строчки нужны ))
Zeqfreed (2007-11-14 16:13:00) [7]> Галинка © (14.11.07 16:00) [12]
С помощью gcc? Тот код не должен компилироваться :)
Галинка (2007-11-14 16:00:00) [8]Спасибо Bless и Zeqfreed. Действительно дело в формате передачи параметров. Ман в линуксе выдал про write только то, что можно юзеру сообщение послать ((
Компилирую в шеле. Про fifo почитаю.
Zeqfreed (2007-11-14 15:32:00) [9]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
#include
#include
#include
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
#include
#include
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 15:12:00) [10]
> В чем может быть проблема?
В неверном выборе профессии.
Купи, наконец, книгу о вкусной и здоровой пище!
Bless (2007-11-14 15:10:00) [11]А разве второй параметр в функции read, write не должен быть указателем?
Галинка (2007-11-14 14:43:00) [12]Со строкой (переводом в uppercase) все работало до этого. А со структурой не хочет ((
Галинка (2007-11-14 14:42:00) [13]Кокретнее. Есть струтура данных, прописаная и в клинте и в сервере:
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));
Но сервер не может прочитать структуру. В чем может быть проблема?
Rouse_ (2007-11-14 11:34:00) [14]
> Важен ли формат данных, записываемых/считываемых через канал?
Данные они как в Линуксе так и в винде одинаковые.
Сергей М. (2007-11-14 11:21:00) [15]
> Важен ли формат данных, записываемых/считываемых через канал?
>
>
Важен для кого?
Галинка (2007-11-14 11:14:00) [16]Ладно, спрошу по другому. Важен ли формат данных, записываемых/считываемых через канал?
Ricko (2007-11-13 23:25:00) [17]
> Как проверить, пишется в канал или нет? Хотя бы?
>
Записать и прочитать?
Галинка (2007-11-13 18:54:00) [18]Есть они там. Созданы в консоли командой mkfifo ("pIn", 0600).
TUser (2007-11-13 18:47:00) [19]А они там есть?