(纠正我,如果我的条款我错了)所以我需要从一个文件描述符读取,但读取方法需要一个int字节大小读取那么多或我可以使用O_NONBLOCK ,但我仍然需要设置一个未知大小的缓冲区大小。使其变得困难。继承人我到目前为止从C中的文件描述符读取
这是我的方法,处理所有的投票和mkfifo。和N在主
struct pollfd pfd[N];
int i;
for(i = 0; i < N; i++)
{
char fileName[32];
snprintf (fileName, sizeof(fileName), "%d_%di", pid, i);
mkfifo(fileName, 0666);
pfd[i].fd = open(fileName, O_RDONLY | O_NDELAY);
pfd[i].events = POLLIN;
pfd[i].revents = 0;
snprintf (fileName, sizeof(fileName), "%d_%do", pid, i);
mkfifo(fileName, 0666);
i++;
pfd[i].fd = open(fileName, O_WRONLY | O_NDELAY);
pfd[i].events = POLLOUT;
pfd[i].revents = 0;
i--;
}
while(1)
{
int len, n;
n = poll(pfd, N, 2000);
if(n < 0)
{
printf("ERROR on poll");
continue;
}
if(n == 0)
{
printf("waiting....\n");
continue;
}
for(i = 0; i < N; i++)
{
char buff[1024]; <---i dont want to do this
if (pfd[i].revents & POLLIN)
{
printf("Processing input....\n");
read(pfd[i].fd, buff, O_NONBLOCK);
readBattlefield(buff);
print_battleField_stats();
pfd[i].fd = 0;
}
}
}
已经预先定义我也读的地方,一旦阅读()读取所有的数据到来,清空管道,这意味着我可以再次使用相同的另一个收到的数据。但它不会清空管道,因为我不能再次使用同一个管道。我问我的教授,但他所说的只是使用类似于scanf的东西,但如果scanf采用FILE流,那么如何使用scanf,而poll.fd是int?本质上我的最终问题是,如何通过文件描述符使用扫描或其他类型读取传入数据?使用扫描将帮助我更好地处理数据。
编辑: 在另一个终端我必须把猫文件>(named_file) 和我的主程序将读取输入数据。继承人什么输入数据看起来像
第一2个数字是网格信息和玩家数量,以及后即网格,但这是一个简化版本,不适合处理大小超过100的玩家和网格超过1000的
使您的缓冲区成为您准备在任何给定时间处理的大块数据的大小,然后重复处理。或者如果你fdopen()fd你可以得到一个FILE *并使用fscanf()。 –
注意事项 - 用'i ++'和'i - '你的pfd initialisaion技巧看起来不正确。 – keltar
你能发表一个你输入数据看起来像什么的例子吗? – ryyker