2016-01-18 34 views
1

我在我的代码有问题的过程代码:队列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读取文件再算上字母的金额,然后我想写它来排队,但我得到我不能写排队的错误,因为“错误的参数”

我的结构:

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和计数器数据类型为int了。我不知道为什么这不起作用。也许这是setlocale的问题? 队列正在其他进程中创建。

+0

更大的“错误的参数”你的意思是EINVAL(又名无效参数)? – hroptatyr

+0

“无效参数” –

+0

您是否成功使用'msgget()'获得'qid'? – hroptatyr

回答

3

正如在评论中讨论:

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

,前者已被排除,而后者显然是不正确的,即BufSize是在示例代码sizeof(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,有着特殊的意义。

解决办法是设置在struct MsgStructureMsgType到的东西比0

+0

它帮助了很多:) –

+0

额外的问题:这个程序是用于计数字母,但是当我有行像:qwertqq \ 00 azerty它只计数到7,但应该13.我怎样才能解决这个问题? –

+0

在这种情况下不要使用'fgetws',自己读取缓冲区(使用'read()'),使用'memchr()'检查换行符,这允许在你的字符串中有'\ 0's,然后从缓冲区开始处理块,直到memchr()给你的内容为止,设置缓冲区超过换行符并重新开始。总结:做手动线分块 – hroptatyr