gpt4 book ai didi

C:同时从管道 char 和 int 读取(棘手的一个)

转载 作者:行者123 更新时间:2023-11-30 14:40:12 25 4
gpt4 key购买 nike

我正在管道中写入一些整数,当我结束时我写入“11”。然后,当我从同一个管道读取数据时,我必须获取整数并对它们进行处理,当我得到“11”时,我应该终止。但我想不出任何在管道中同时读取 int 和 char 的解决方案(我知道这是基于 fifo 方法的)。

有什么想法吗?

//THIS IS AN EXAMPLE CODE OF WHAT I WANT TO DO 

//I am writing to the pipe
while(CONDITION)
write(mypipe, &random_int, sizeof(short));
write(mypipe, "1", sizeof("11"));

/* code... */

//I am reading from the pipe
while(TRUE){
read(mypipe, &received_int, sizeof(short));
// if strcmp(receiver_int, "11")==0 then exit;
// else do stuff with receiver_int
}

最佳答案

管道只是一个字节流,即使您将读取的字节正确解释为 16 位整数和 2 个字符的字符串“11”,在 ASCII 中是字节 31 31,那么如何你能区分“11”和整数12593吗?它们具有相同的二进制表示形式。

一种选择是继续读取直到管道终止,这可能适合传输文件。但不允许持续的来回消息。

write(mypipe, &random_int, sizeof(short));
close(mypipe); // finished writing

// recv
while (true)
{
short received_int;
if (read(mypipe, &received_int, sizeof(short)) == sizeof(short)) // Not handling the int getting split into two separate read's here
{
// Use received_int
}
else return; // 0 on close
}

这就是为什么大多数协议(protocol)在流之上引入消息概念(无论是文本还是二进制)。例如,您可能有一个 8 位“操作码”,并说 0 是“断开连接”,1 是“带有整数的消息”,因此要写入一个整数:

 unsigned char opcode = 1;
short random_int = 55; // Make sure it actually a short, as you used sizeof(short)!
write(mypipe, &opcode, 1);
write(mypipe, &random_int, sizeof(short));

要阅读,请先阅读操作码,然后再决定:

char opcode;
read(mypipe, &opcode, 1); // CHECK RETURN!
switch (opcode)
{
case 0: return; // Finished
case 1:
{
short received_int;
read(mypipe, &received_int, sizeof(short)); // CHECK RETURN!
// Use received_int
break;
}
}

您可以查看一些现有协议(protocol),了解它们如何将不同的内容编码到字节流中。

关于C:同时从管道 char 和 int 读取(棘手的一个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com