2014-07-23 55 views
0

(纠正我,如果我的条款我错了)所以我需要从一个文件描述符读取,但读取方法需要一个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的

+1

使您的缓冲区成为您准备在任何给定时间处理的大块数据的大小,然后重复处理。或者如果你fdopen()fd你可以得到一个FILE *并使用fscanf()。 –

+0

注意事项 - 用'i ++'和'i - '你的pfd initialisaion技巧看起来不正确。 – keltar

+0

你能发表一个你输入数据看起来像什么的例子吗? – ryyker

回答

2

char buff [1024]; < ---我不想这样做

你想怎么做呢?这是它的工作原理。这是它是如何工作:

read(pfd[i].fd, buff, O_NONBLOCK); 

这将编译,因为O_NONBLOCK是一个整数#define,但它是绝对无误地不正确。 read()的第三个参数是要读取的字节数。不是一面旗帜。期。它可能为零,但你在这里完成的是传递一个任意的数字 - 无论O_NONBLOCK的值是多少,这个数字很可能超过1024,即缓冲区的大小。这不会设置读取非块recv()read()类似,并且将这些标志作为第四个参数,但不能将其用于文件描述符。如果要在文件描述符上设置非块,则必须使用open()fcntl()

如何通过文件描述符使用扫描或其他排序来读取传入数据?

您可以使用fdopen()打开描述符创建FILE*流。

我还在某处读过一次read()读取所有数据,它清空管道,这意味着我可以再次使用相同的另一个传入数据。但它不会清空管道,因为我不能再次使用同一个管道。

一旦您到达EOF(因为编写器关闭连接),read()将返回0,并且继续返回0,直到有人再次打开管道。

如果设置描述符非块,read()将始终立即返回;如果有人连接并且没有任何要读取的内容,它将返回-1,但是errno将会是== EAGAIN。见man 2 read

man fifo绝对是你应该阅读的东西;如果有什么不确定的地方,请根据这个问题提出具体的问题。

而且别忘了:修复read()调用。这是错的。 W R O N G.你的教授/助教/谁不会错过。

+0

This;我还读过read()读取所有数据的地方,它清空管道,这意味着我可以再次使用它来处理另一个传入数据。但它不会清空管道,因为我不能再次使用同一个管道。绝对不是真的。除非发送者关闭了管道的末端或接收者故意关闭了管道,否则管道不会关闭。 – user3629249

+0

其实我只是试过这个,我错了读取fd在EOF之后被解散;我已经纠正了上述情况。一旦到达EOF(因为编写器关闭了管道),read()会立即返回0 ** **但是如果另一个writer'open()'是写入的管道,则这将停止,并且您可以继续读取来自新作家。 – delicateLatticeworkFever

相关问题