- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
现在,我正在尝试输出 buf.mtext 的内容,以便在继续我的程序之前确保采用正确的输入。一切似乎都运行良好,除了一件事; msgrcv()将垃圾字符放入缓冲区,接收进程输出垃圾字符。
这是我的发件人流程:
int main (void)
{
int i; // loop counter
int status_01; // result status
int msqid_01; // message queue ID (#1)
key_t msgkey_01; // message-queue key (#1)
unsigned int rand_num;
float temp_rand;
unsigned char eight_bit_num;
unsigned char counter = 0;
unsigned char even_counter = 0;
unsigned char odd_counter = 0;
srand(time(0));
struct message {
long mtype;
char mtext[BUFFER_SIZE];
} buf_01;
msgkey_01 = MSG_key_01; // defined at top of file
msqid_01 = msgget(msgkey_01, 0666 | IPC_CREAT)
if ((msqid_01 <= -1) { exit(1); }
/* wait for a key stroke at the keyboard ---- */
eight_bit_num = getchar();
buf_01.mtype = 1;
/* send one eight-bit number, one at a time ------------ */
for (i = 0; i < NUM_REPEATS; i++)
{
temp_rand = ((float)rand()/(float)RAND_MAX)*255.0;
rand_num = (int)temp_rand;
eight_bit_num = (unsigned char)rand_num;
if ((eight_bit_num % 2) == 0)
{
printf("Even number: %d\n", eight_bit_num);
even_counter = even_counter + eight_bit_num;
}
else
{
printf("Odd number: %d\n", eight_bit_num);
odd_counter = odd_counter + eight_bit_num;
}
/* update the counters ------------------------------ */
counter = counter + eight_bit_num;
if((eight_bit_num % 2) == 0) { even_counter = even_counter + eight_bit_num; }
else { odd_counter = odd_counter + eight_bit_num; }
buf_01.mtext[0] = eight_bit_num; // copy the 8-bit number
buf_01.mtext[1] = '\0'; // null-terminate it
status_01 = msgsnd(msqid_01, (struct msgbuf *)&buf_01, sizeof(buf_01.mtext), 0);
status_01 = msgctl(msqid_01, IPC_RMID, NULL);
}
这是我的接收进程:
int main() {
struct message {
long mtype;
char mtext[BUFFER_SIZE];
} buf;
int msqid;
key_t msgkey;
msgkey = MSG_key_01;
msqid = msgget(msgkey, 0666); // connect to message queue
if (msqid < 0) {
printf("Failed\n");
exit(1);
}
else {
printf("Connected\n");
}
if (msgrcv(msqid, &buf, BUFFER_SIZE, 0, 0) < 0) { // read message into buf
perror("msgrcv");
exit(1);
}
printf("Data received is: %s \n", buf.mtext);
printf("Done receiving messages.\n");
return 0;
}
输出通常如下所示:
Data received is: ▒
Done receiving messages.
我也确保每次运行发送方和接收方进程后都清除消息队列,因为我发现这可能会导致问题。预先感谢您的帮助。
最佳答案
事实证明,正如我怀疑的那样,建议的解决方案都不是问题所在;发送进程实际上工作得很好。问题是我试图打印 buf.mtext 而不是 buf.mtext[0] ,它不是一个实际的整数值。我通过这样做解决了这个问题:
int temp_num = buf.mtext[0];
printf("Data recieved is %d \n", temp_num);
关于c++ - 为什么 msgrcv() 将垃圾字符输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60389915/
我使用消息队列将消息从一个进程发送到另一个进程。接收消息的进程仅在完成对 msgrcv 函数的所有调用后才打印输出。我期望的是它会在收到消息时打印数据,但只有在收到所有消息后才会打印数据。 我尝试过更
我有两个程序通过 IPC 队列相互发送和接收消息。然而,有时 msgrcv 函数会得到一条空白消息,而不是接收通过队列实际发送的消息。我已经注释掉了一个我认为应该有效的修复程序,但我想在这里检查一下,
我当前正在尝试在主进程及其子进程之间发送消息。我正在使用消息传递来强制执行关键部分,但子进程中的消息接收功能失败,我不知道是否应该采用不同的方式发送消息。我的消息接收函数正在父进程中获取消息,因此我无
在我的项目中,协议(protocol)(不可更改)指定以下结构: typedef struct { long type; char username[USER_NAME_MAX_LENGTH]; in
this is my code and in the last part,msgrecv does not accept the messages from the queue accourding
所以我的 msgrcv() 函数调用效果很好,但它会在从其他进程接收到的内容中添加字符。 发送方进程发送hello,接收方进程接收hello@\n或hello\n@或hello@ ,因为它随机打印不同
我正在编写一个基本服务器程序,它必须从客户端接收两种类型的消息(第一个消息是类型 1,第二个消息是类型 2)。似乎它没有看到来自已正确发送的客户端的消息(msgsnd 不返回 -1)。我读到这可能是由
我正在开发一个程序,该程序应该像服务器一样运行,不断从消息队列中读取并处理收到的消息。 主循环看起来像这样: while (1) { /* Receive message */ if
我需要一些关于 msgrcv 的帮助...我需要能够接收这样的消息: while(1){ int status = msgrcv(qid, &msg, sizeof(msg.data), us
我构建了一个程序,允许我创建和删除消息队列以及发送和接收消息。 除了接收消息外,一切似乎都正常工作。当我收到结构时,我可以访问类型(我一直用它来表示“收件人”)并打印它,但是存储在结构的 msg 字段
我编写了两个程序,一个使用 msgsnd 发送消息,另一个使用 msgrcv 接收消息。我已经使用这些功能很长一段时间了,但我无法弄清楚接收文件时出现“检测到堆栈粉碎”错误。在该文件中,我尝试将文件的
现在,我正在尝试输出 buf.mtext 的内容,以便在继续我的程序之前确保采用正确的输入。一切似乎都运行良好,除了一件事; msgrcv()将垃圾字符放入缓冲区,接收进程输出垃圾字符。 这是我的发件
我在队列中有许多消息(它们是整数)我想要消费,我想使用整数 int consumed 来跟踪我消费了多少消息。 我首先使用 ds.msg_qnum > 0 检测队列是否有消息,其中 ds 是 stru
我有一个问题。 我有一个进程,假设它是一个客户端,还有一个叫做服务器的进程。客户端和服务器通过同一个队列相互通信。假设客户端向服务器发送一条消息(请求),因此服务器处理它并且应该将消息发送回客户端以确
我有两个不同的程序: 第一个,基本上是无限循环地在消息队列上调用 msgrcv 并在它收到任何东西时打印,在 C++ 中: //foo1.cpp #include #include #includ
我使用 IPC 队列在线程之间进行通信的代码有问题。我需要安全地处理 SIGINT - 当 SIGINT 在关闭之前出现时让程序完成所有事件线程。虽然,我在寻找解决方案时遇到了严重的问题,因为即使使用
#include #include #include #include #include #include #include #include #include struct msg
我正在为考试学习操作系统基础知识,但遇到了一个奇怪的问题。我目前正在研究发送/接收功能。假设我有 3 个主程序 Client,它们通过 msgsnd() 原语发送消息。结构如下: typedef st
我正在unix系统上用C编写代码。我创建了一个消息队列服务器。每次我收到新消息时,我都会 fork ,并且子进程会处理新客户端。服务器等待新的客户端。这是代码。 for (;;) { s
我有一个应用程序,它具有信号处理程序并创建了一个线程来处理消息队列。下面是信号处理程序, /*! \Register handle on SIGINT. */ signal(SIGINT,
我是一名优秀的程序员,十分优秀!