我在C中使用消息队列,并将所有文件(在当前文件夹中)的信息从客户端发送到服务器(MSGMAX定义为4096)。 客户代码:
int mq_id;
struct { long type; char text[MSGMAX]; } mymsg;
mq_id = msgget(12, IPC_CREAT | 0666);
FILE* p;
char str[MSGMAX];
p = popen("ls -l", "r");
while (fgets(str, MSGMAX, p)){ strcpy (mymsg.text, str); }
pclose(p);
mymsg.type = 1;
msgsnd(mq_id, &mymsg, sizeof(mymsg), IPC_NOWAIT);
}
在这一部分,mymsg.text
返回正确的多重行字符串(结果为ls -l
)。但是,当我尝试在 server 部分中打印此字符串时,它只撤消了整个字符串的最后一行:
int mq_id;
struct { long type; char text[MSGMAX]; } mymsg;
mq_id = msgget(12, 0);
if (msgrcv(mq_id, &mymsg, sizeof(mymsg), 0, 0) < 0)
perror("\nMsg error!");
else
printf("%s", mymsg.text);
如何使用所有行完全发送mymsg.text
?
答案 0 :(得分:1)
使用while (fgets(str, MSGMAX, p)){ strcpy (mymsg.text, str); }
,mymsg.txt
读取的每一行都将覆盖fgets
的内容。我建议写类似...
strcpy(mymsg.text,"");
while (fgets(str, MSGMAX, p)){ strcat (mymsg.text, str); }
或者您将缓冲区发送到循环中的服务器,即,将每行分别读取。