队列Linux无法写入

时间:2016-01-18 04:00:56

标签: c linux

我的流程代码代码存在问题:

FILE *fp;
int     i, 
    counter;    // Liczba liter w wiadomosci
wchar_t buffer[1024], *line;
struct MsgStructure WB; // Write Buffor
setlocale(LC_ALL, "pl_PL.UTF-8");

while(run)
{
    fp = fopen(FIFO, "r");
    fwide(fp, 1);
    while ((line = fgetws(buffer, sizeof buffer / sizeof buffer[0], fp)) != NULL) 
    {
          counter = 0;
          for (i = 0; line[i] != L'\0'; i++)
              if (iswalpha(line[i]))
                 counter++;

          WB.Msg = counter;

          if ((WriteToQueue( qid, &WB )) == -1)     
          {
               perror("Error\n");
          }

    }

    fclose(fp);
}

我的程序从FIFO文件读取然后计算字母数量然后我想把它写入队列但我得到一个错误,我不能写入队列因为&#34;错误的参数&#34; < / p>

我的结构:

struct MsgStructure { 
    long int MsgType; 
    int Msg; 
}; 

WriteToQueue是一个简单的函数:

int WriteToQueue( int qid, struct MsgStructure *qbuf ){
    int result, BufSize;

    BufSize = sizeof(struct MsgStructure) - sizeof(long);        
    result = msgsnd( qid, qbuf, BufSize, 0);
      return(result);
}

我的消息类型是int,counter也是int。我不知道为什么这不起作用。也许这是setlocale的问题? 队列正在其他过程中创建。

1 个答案:

答案 0 :(得分:3)

如评论中所述:

   EINVAL Invalid msqid value, or nonpositive mtype value,
          or invalid msgsz value (less than 0 or greater than
          the system value MSGMAX).

前者已被排除,后者显然不正确,即示例代码中BufSizesizeof(int)

离开mtype<=0。从手册页:

   The msgp argument is a pointer to caller-defined
   structure of the following general form:

       struct msgbuf {
           long mtype;       /* message type, must be > 0 */
           char mtext[1];    /* message data */
       };

这符合msgrcv() msgtyp参数,如果为0,则具有特殊含义。

解决方法是将MsgType中的struct MsgStructure设置为大于0的值。