该函数调用iosWrite函数将几段分散的数据写入到fd设备中。
14. STATUS ioFullFileNameGet (
char * pathName, DEV_HDR ** ppDevHdr, char * fullFileName )
通常来说,一个完整的文件的路径包括两部分,该文件所在的设备路径,以及该文件在该设备上的相对路径,这两部分组合得到了一个完整的路径。这个函数的作用就是根据参数pathName制定的路径名,这个路径名可以是相对(相对麽默认的路径ioDefPath)路径名或者绝对路径名。函数ioFullFileNameGet的作用个就是根据提供的路径名找到该文件坐在的设备及其相对于该设备的路径。其中设备名结构变量指针的指针保存在DEV_HDR ** ppDevHdr参数中返回,相对于设备的文件名则存放在参数char * fullFileName中保存。
举例来说当前默认路径为“/dev/sd1/x/”,相对路径名为“y.txt”,该函数将会找到设备“/dev/sd1/”对应的DEV_HDR ** ppDevHdr指针返回,并将fullFileName设置为\返回。
15. STATUS ioDefPathSet (
char *name )
设定默认路径,并将其复制到全局变量ioDefPath中,注意name必须是一个绝对路径,也就是说name指定的路径必须包含一个有效的设备(即从iosDevList中能够搜索到的设备)。
16. void ioDefPathGet (
char *pathname )
将ioDefPath复制到pathname中返回。
17. STATUS chdir (
char *pathname )
这个函数等价于函数ioDefPathSet(),可以认为是ioDefPathSet()函数的一个别名。
18. char *getcwd (
char *buffer, int size )
ioDefPathGet()函数的别名。只是如果参数size指定的空间太小的话将返回ERROR。
19. char *getwd (
char *pathname )
ioDefPathGet()函数的别名。
20. STATUS ioDefPathCat (
char *name )
修改默认的路径。如果name是一个包含设备路径的一个绝对路径名,那么它就成为了一个新的默认路径。否则name将会被连接到当前默认路径从而更新了新的默认路径。
例如:如果默认路径为\,name=\,则默认路径修改为\;如果name=\,则默认路径修改为\
21. void ioDefDevGet (
char *devName )
获取默认路径所属的设备的名称。
22. void ioDefDirGet (
char *dirName )
这个函数在新的版本中将会删除。它的主要作用就是获取默认路径相对于所属设备的相对路径。
如设备名为\,默认路径为\,则ioDefDevGet()函数获取了\设备,而函数ioDefDirGet()则获取了相对路径。
23. void ioGlobalStdSet (
int stdFd, int newFd )
文件ioLib中定义了一个数组LOCAL int ioStdFd [3],该数组表明标准文件描述符。这三个标准的文件描述符主要是:标准输入0、标准输出1、错误输出2。这个函数的作用,就是设置这个数组中某个元素的文件描述符。
stdFd:指的是ioStdFd数组中元素的下标,0~2有效。 newFd:数组中元素的数值。
24. int ioGlobalStdGet (
int stdFd )
获取数组ioStdFd中某个元素的数值,即文件描述符的数值。
25. void ioTaskStdSet
(
int taskId, int stdFd, int newFd
)
对VxWorks系统来说,并不是每个任务的标准输入、标准输出、错误输出都是相同的,多数任务的标准输入是键盘,标准输出是显示器等,但是对某些串口监控的任务来说,可以把它的标准输入设置为串口等等。
每个任务描述符中都有一个数组taskStd,表明这个任务的标准输入、标准输出以及错误输出,这个函数的功能,就是设置一个任务的标准输入、标准输出、错误输出。
26. int ioTaskStdGet (
int taskId, int stdFd )
获取一个任务的标准输入、标准输出、错误输出
27. BOOL isatty (
int fd /* file descriptor to check */ )
判断一个文件描述符是否是一个tty。最初的计算机没有键盘和显示器,输入输出都比较麻烦,后来有Teletype公司生产了一种字符型终端设备,因此有很多计算机操作系统都把字符型终端设备叫做tty设备。 关于文件路径的进一步详细操作可以参考函数库pathLib。
2.3.2 函数库iosLib
函数库iosLib是库ioLib的底层实现,它负责将各个硬件设备及其驱动组织起来,从而使得用户只需要调用ioLib库就可以通过类似于文件IO的访问方式来访问各个硬件设备。在对iosLib库函数进行分析的过程中我们将主要分析系统是如何将这些设备以及驱动组织起来,以及如何为ioLib库提供接口的。
在函数库iosLib中定义了一个通用的接口结构DRV_ENTRY,它为ioLib库提供了一个通用过的接口,使得ioLib无需了解具体的设备类型就可以对硬件设备进行访问;另一方面它又通过继承的方法,将不同类型的设备保存在链表中进行统一管理(参见图2.8)。下面对设备的管理函数进行详细分析。
1. static STATUS nullWrite (
int dummy, char * pBuf, int nBytes )
空函数。
2. STATUS iosInit (
int max_drivers,
int max_files, char *nullDevName )
iosLib函数库初始化,该函数的主要作用是动态创建了一个FD_ENTRY结构数组和一个DRV_ENTRY结构数组,并进行了初始化。
3. int iosDrvInstall (
FUNCPTR pCreate, FUNCPTR pDelete, FUNCPTR pOpen, FUNCPTR pClose, FUNCPTR pRead, FUNCPTR pWrite, FUNCPTR pIoctl )
从DRV_ENTRY结构数组中找到一个空闲的DRV_ENTRY结构变量,将参数指定函数指针填充到该。注意由于最开始的一个元素即drvTable[0]中填充的是一个空设备,因此查找空闲的元素是从下表1开始查找的。如图2.10。该函数返回下标i。
图2.10 函数iosDrvInstall的操作
正是这个步骤才使得一类设备的特殊访问方法与通用的接口连接起来。
4. STATUS iosDrvRemove (
int drvnum, BOOL forceClose )
函数iosDrvInstall的逆过程,将DRV_ENTRY结构数组中的下表为drvnum的元素清空。如果forceClose参数为TRUE则需要强制关闭该设备已经打开的文件。如果forceClose为FALSE但是该设备有打开的文件,则返回错误。
注意:一个设备可能对应多个打开的文件。
相关推荐: