2015-02-11 63 views
0
嗨!

如何通過fifo發送結構

我想從一個程序傳遞整個結構,並在另一個使用fifo讀取它。 我正在使用讀取和寫入功能。

我把我的結構放到這個函數中有問題。當我做到了,並試圖發送和接收我得到一個錯誤(核心轉儲)或我收回了一些垃圾。我不知道我的問題發生在哪裏(在收件人或發件人中)。我如何發送/接收我的結構,或者我的代碼中有什麼錯誤。

這裏是我的代碼...

接收

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; 
} 
+0

這是太多代碼來查看。請參閱[幫助頁面](http://stackoverflow.com/help/mcve),獲取編寫一個好問題的提示。 – dg99 2015-02-11 18:13:14

回答

3

你不能只送內存結構從一個程序到另一個。你必須做所謂的'序列化',即將結構轉換爲表示結構的字節流。有許多序列化技術:ASN1/Ber,XML,JSON,Google協議愛好者,推出自己的。

只是你知道這是爲什麼。結構中的字段消息實際上是一個指針,當你將這個指針發送給另一個程序時,它指向相同的地址,但是在接收者程序中不是發送者。該地址可能不存在,當然也不包含發件人程序中的字符串。