如何通过 fifo 发送结构
How send a structure through fifo
你好!
我正在尝试从一个程序传递整个结构并使用 fifo 在另一个程序中读取它。
我正在使用读写功能。
我在将我的结构放入此函数时遇到了问题。当我这样做并尝试发送和接收时,我得到一个错误(核心转储)或者我收到了一些垃圾。我不确切地知道我的问题发生在哪里(在接收者或发送者中)。我怎样才能 send/receive 我的结构,或者我的代码有什么问题。这是我的代码...
Receiver
struct data
{
char* message;
int size;
vector <times> prog;
};
int if_fifo(char* name)
{
struct stat info;
int score = stat(name,&info);
if(S_ISFIFO(info.st_mode))
{
return 1;
}
else
{
return 0;
}
}
int fifo_in(char* name)
{
data msg;
int pip;
pip = open(name, O_RDONLY | O_NONBLOCK);
while(1)
{
int hr = read(pip,&msg,sizeof(msg));
if(hr != 0)
{
cout << "Message: " << msg.message << endl;
}
}
cout << "O.K." << endl;
return 0;
}
int main(int argc, char** argv) {
int c, status_in, status_out;
char* input;
char* output;
float del;
if(argc < 5)
{
cout << "Za malo podanych parametrow" << endl;
return 1;
}
else
{
while ((c = getopt(argc, argv, "iod:")) != -1)
{
switch (c)
{
case 'i':
input = argv[2];
status_in = if_fifo(input);
break;
case 'o':
output = argv[3];
status_out = if_fifo(output);
break;
case 'd':
del = atof(argv[4]);
break;
case '?':
printf("UKNOWN");
}
}
}
if(status_in == 1)
{
return fifo_in(input);
}
else
{
cout << "It isnt fifo!!" << endl;
}
return 0;
}
发件人:
struct data
{
char* message;
int size;
vector <times> prog;
}msg;
int if_fifo(char* name)
{
struct stat info;
int score = stat(name,&info);
if(S_ISFIFO(info.st_mode))
{
return 1;
}
else
{
return 0;
}
}
int fifo_out(char* name)
{
msg.message = "To jest to!!";
msg.size = sizeof(msg.message);
int pip;
pip = open(name, O_WRONLY);
if( pip == -1 )
{
perror("Error: open( ): ");
return 1;
}
write(pip,&msg,sizeof(msg));
return 0;
}
int main(int argc, char** argv) {
int c, status_out;
char* output;
if(argc < 3)
{
cout << "Za malo podanych parametrow" << endl;
return 1;
}
else
{
while ((c = getopt(argc, argv, "o:")) != -1)
{
switch (c)
{
case 'o':
output = argv[2];
status_out = if_fifo(output);
break;
case '?':
printf("UKNOWN");
}
}
}
if(status_out == 1)
{
return fifo_out(output);
}
return 0;
}
您不能只将内存结构从一个程序发送到另一个程序。您必须执行所谓的 'serialization' 操作,即将结构转换为表示该结构的字节流。有很多很多序列化技术:ASN1/ Ber、XML、JSON、Google 协议爱好者,自己动手吧。
只是让你知道这是为什么。结构中的字段消息实际上是一个指针,当您将此指针发送到另一个程序时,它指向相同的地址但在接收程序中不是发送方。该地址可能不存在,并且肯定不包含您在发件人程序中的字符串。
我正在尝试从一个程序传递整个结构并使用 fifo 在另一个程序中读取它。 我正在使用读写功能。
我在将我的结构放入此函数时遇到了问题。当我这样做并尝试发送和接收时,我得到一个错误(核心转储)或者我收到了一些垃圾。我不确切地知道我的问题发生在哪里(在接收者或发送者中)。我怎样才能 send/receive 我的结构,或者我的代码有什么问题。这是我的代码...
Receiverstruct data
{
char* message;
int size;
vector <times> prog;
};
int if_fifo(char* name)
{
struct stat info;
int score = stat(name,&info);
if(S_ISFIFO(info.st_mode))
{
return 1;
}
else
{
return 0;
}
}
int fifo_in(char* name)
{
data msg;
int pip;
pip = open(name, O_RDONLY | O_NONBLOCK);
while(1)
{
int hr = read(pip,&msg,sizeof(msg));
if(hr != 0)
{
cout << "Message: " << msg.message << endl;
}
}
cout << "O.K." << endl;
return 0;
}
int main(int argc, char** argv) {
int c, status_in, status_out;
char* input;
char* output;
float del;
if(argc < 5)
{
cout << "Za malo podanych parametrow" << endl;
return 1;
}
else
{
while ((c = getopt(argc, argv, "iod:")) != -1)
{
switch (c)
{
case 'i':
input = argv[2];
status_in = if_fifo(input);
break;
case 'o':
output = argv[3];
status_out = if_fifo(output);
break;
case 'd':
del = atof(argv[4]);
break;
case '?':
printf("UKNOWN");
}
}
}
if(status_in == 1)
{
return fifo_in(input);
}
else
{
cout << "It isnt fifo!!" << endl;
}
return 0;
}
发件人:
struct data
{
char* message;
int size;
vector <times> prog;
}msg;
int if_fifo(char* name)
{
struct stat info;
int score = stat(name,&info);
if(S_ISFIFO(info.st_mode))
{
return 1;
}
else
{
return 0;
}
}
int fifo_out(char* name)
{
msg.message = "To jest to!!";
msg.size = sizeof(msg.message);
int pip;
pip = open(name, O_WRONLY);
if( pip == -1 )
{
perror("Error: open( ): ");
return 1;
}
write(pip,&msg,sizeof(msg));
return 0;
}
int main(int argc, char** argv) {
int c, status_out;
char* output;
if(argc < 3)
{
cout << "Za malo podanych parametrow" << endl;
return 1;
}
else
{
while ((c = getopt(argc, argv, "o:")) != -1)
{
switch (c)
{
case 'o':
output = argv[2];
status_out = if_fifo(output);
break;
case '?':
printf("UKNOWN");
}
}
}
if(status_out == 1)
{
return fifo_out(output);
}
return 0;
}
您不能只将内存结构从一个程序发送到另一个程序。您必须执行所谓的 'serialization' 操作,即将结构转换为表示该结构的字节流。有很多很多序列化技术:ASN1/ Ber、XML、JSON、Google 协议爱好者,自己动手吧。
只是让你知道这是为什么。结构中的字段消息实际上是一个指针,当您将此指针发送到另一个程序时,它指向相同的地址但在接收程序中不是发送方。该地址可能不存在,并且肯定不包含您在发件人程序中的字符串。