这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » VxWorks的文件描述符bug!?

共8条 1/1 1 跳转至

VxWorks的文件描述符bug!?

菜鸟
2003-08-04 20:21:34     打赏
在VxWorks中,用户文件描述符数目可以自己定的,其中0,1,2号文件描述符是为系统保留的标准输入、输 出和错误流。它不在用户的文件描述符表中,而用户文件描述表的大小为NUM_FILES个,所以用户的文件 描述符索引范围为从3开始一直到NUM_FILES+2。 按理说,用户可以得到系统分配的NUM_FILES个文件描述符,现在将设备可打开的文件个数设置为512个。 在configTms.h中将宏NUM_FILES的值设置为512。 然后试着先打开10个管道文件,再打开512个socket。原先预料的结果是socket所返回的文件描述符会一 直正确的返回到514,结果在创建到描述符值为512时便开始出错。这样便与其VxWorks文档中所说的不一 致了。因为它实际能使用的描述符个数只有NUM_FILES个(包含0,1,2),而不是NUM_FILES+2个。 在VxWorks 5.4.3中运行下附代码,使用devs查看当前所使用的设备,使用iosFdShow查看当前所使用的文 件描述符。 通过iosFdShow可以看到系统所维护的文件描述符表索引是从3到514。但512,513,514并不是成功创建的描述符,它们的设备号是一个错误值。 我想这是VxWorks中的bug。请大家验证一下,如果不是bug,还请高人解惑。 void abcdefghijklmnopq() { int sck = 0; int i=0; int sckCnt = 0; int pipeFd = 0; int pipeFdCnt = 0; printf("\ntry to open additional 10 pipes\n"); pipeDevCreate ("/pipe/filetest", 10, 100); for(i=0; i<10; i++) { pipeFd = open("/pipe/filetest", O_RDONLY, 0); if(pipeFd != -1) { printf("successfully open pipe /pipe/filetest, get fd %d\n", pipeFd); pipeFdCnt++; } else { printf("failed to open pipe /pipe/filetest in loop %d\n", i); } } printf("*****************************\n"); printf("TOTAL PipeFd Opened%d\n", pipeFdCnt); printf("*****************************\n"); printf("try to open 512 sockets!\n"); for (i=0; i<512; i++) { sck = socket( AF_INET, SOCK_DGRAM, 0); if(sck != -1) { printf("successfully open socket %d\n", sck); sckCnt++; } else { printf("failed to open socket in loop %d\n", i); } } printf("*****************************\n"); printf("TOTAL SOCKET OPENED %d\n", sckCnt); printf("*****************************\n"); } 这是设备及描述符查看结果。 -> devs drv name 0 /null 1 /tyCo/0 1 /tyCo/1 3 /tffs/ 5 host: 6 /vio 7 /tgtsvr 2 /pipe/snmpNotify 2 /pipe/dot1x 2 /pipe/dhcp 2 /pipe/timeout 2 /pipe/filetest value = 25 = 0x19 -> iosFdShow fd name drv 3 /tyCo/0 1 in out err 4 (socket) 4 5 (socket) 4 6 /pipe/dot1x 2 7 /pipe/dhcp 2 8 /pipe/timeout 2 9 (socket) 4 10 (socket) 4 11 /pipe/snmpNotify 2 12 (socket) 4 13 /pipe/filetest 2 14 /pipe/filetest 2 15 /pipe/filetest 2 ……………… ……………… 509 (socket) 4 510 (socket) 4 511 (socket) 4 512 (unknown) 8610 513 (unknown) 8610 514 (unknown) 8610 value = 33 = 0x21 = '!' [align=right][color=#000066][此贴子已经被作者于2003-8-6 14:55:23编辑过][/color][/align]



关键词: VxWorks     文件     描述     socket    

菜鸟
2003-08-05 00:55:00     打赏
2楼
下沉的帖子自己救三次。

菜鸟
2003-08-05 18:34:00     打赏
3楼
“所以用户的文件描述符索引范围为从2开始一直到NUM_FILES+2”,这句话出自何处?我怎么没有印象?vxworks的文档我通读过几遍,真的不记得哪儿讲过。

菜鸟
2003-08-06 22:51:00     打赏
4楼
参见Tornado Training Workshop Chapter 11-8。

菜鸟
2003-08-06 22:54:00     打赏
5楼
The first three file descriptors are predefined by the system and are never reassigned by the system. These three file descriptors (0 - 2) are never returned by creat( ) or open( ). Mappings for the standard file descriptors 0, 1, and 2 are actually maintained outside of the file descriptor table. The file descriptor table starts at index 3 and extends to index NUM_FILES + 2. Global assignments may be changed after system start-up using …………

菜鸟
2003-08-07 07:18:00     打赏
6楼
这里应该是文档有错误,在bootConfig.c和usrConfig.c文件的void usrRoot函数中,都调用了设置同时打开的最大文件数目的函数iosInit (NUM_DRIVERS, NUM_FILES, "/null");,这里函数的参数为NUM_FILES,所以同时打开的最大文件数就是NUM_FILES,而不是NUM_FILES + 2。

菜鸟
2003-08-07 17:15:00     打赏
7楼
那个不是tornado的文档,是培训教材,我觉得写错了。不能算是vxworks的bug。

菜鸟
2003-08-08 02:56:00     打赏
8楼
不过iosFdShow确实是显示出了512,513,514这三个不成功创建的文件描述符的啊。 不过这个是小问题,一般我们也不会耗光系统描述符。

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]