① 如何查看errno 错误代码
首先在自己的程序中#include<errno.h>
添加打印errno的语句 printf("errno is: %d\n",errno);
根据errno的值查错。
errno的不同值的含义:
以下来自linux 2.4.20-18的内核代码中的/usr如何查看errno 错误代码 /include/asm/errno.h
#ifndef _I386_ERRNO_H
#define _I386_ERRNO_H
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Arg list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */
#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */
#define ENOSYS 38 /* Function not implemented */
#define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN /* Operation would block */
#define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG 44 /* Channel number out of range */
#define EL2NSYNC 45 /* Level 2 not synchronized */
#define EL3HLT 46 /* Level 3 halted */
#define EL3RST 47 /* Level 3 reset */
#define ELNRNG 48 /* Link number out of range */
#define EUNATCH 49 /* Protocol driver not attached */
#define ENOCSI 50 /* No CSI structure available */
#define EL2HLT 51 /* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL 54 /* Exchange full */
#define ENOANO 55 /* No anode */
#define EBADRQC 56 /* Invalid request code */
#define EBADSLT 57 /* Invalid slot */
#define EDEADLOCK EDEADLK
#define EBFONT 59 /* Bad font file format */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* Object is remote */
#define ENOLINK 67 /* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT 69 /* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */
#define EMULTIHOP 72 /* Multihop attempted */
#define EDOTDOT 73 /* RFS specific error */
#define EBADMSG 74 /* Not a data message */
#define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
#define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EUSERS 87 /* Too many users */
#define ENOTSOCK 88 /* Socket operation on non-socket */
#define EDESTADDRREQ 89 /* Destination address required */
#define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
#define ENOPROTOOPT 92 /* Protocol not available */
#define EPROTONOSUPPORT 93 /* Protocol not supported */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
#define EADDRINUSE 98 /* Address already in use */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET 102 /* Network dropped connection because of reset */
#define ECONNABORTED 103 /* Software caused connection abort */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
#define EISCONN 106 /* Transport endpoint is already connected */
#define ENOTCONN 107 /* Transport endpoint is not connected */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
#define ETIMEDOUT 110 /* Connection timed out */
#define ECONNREFUSED 111 /* Connection refused */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */
#define EALREADY 114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE 116 /* Stale NFS file handle */
#define EUCLEAN 117 /* Structure needs cleaning */
#define ENOTNAM 118 /* Not a XENIX named type file */
#define ENAVAIL 119 /* No XENIX semaphores available */
#define EISNAM 120 /* Is a named type file */
#define EREMOTEIO 121 /* Remote I/O error */
#define EDQUOT 122 /* Quota exceeded */
#define ENOMEDIUM 123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#endif
② 谁给我一个能用的杀毒软件免费的哟
08总结--国内真正免费安全软件大集合
年末总结一下国内的安全软件,下面推荐的是真正意义上的完全免费的、全功能的安全软件。
1、超级巡警:定义为辅杀,不过貌似现在翻身了,向着主杀直奔而去。
官网:http://www.sucop.com/
产品:超级巡警、畅游巡警、U盘巡警、影音巡警、暴力文件删除工具、保险箱、首页巡警……以上完全免费,效果不错,在需要时会给你带来意想不到的惊喜。
2、魔法盾:传说中的EQ,HIPS 类的软件,有耐心的朋友不妨试试看,教程在卡饭HIPS 专区有。
官网:http://www.eqsecure.com/
产品:EQSecure
3、完美卸载:卸载软件的好帮手,用过的都知道,貌似现在也有点监控功能了,不过不能算专业的安软。
官网:http://www.killsoft.cn/
产品:完美卸载完整版、简装版
4、360安全卫士:这个就不用我介绍了吧,我感觉很不错,360还有杀毒软件(有NOD32 的半年版,有BD 的监控版和绿色版)。
官网:http://www.360.cn/
产品:360安全卫士、保险箱、安全浏览器、ARP防火墙、时间保护器……太多了,自己去看吧,是系统辅助软件的不错选择。
5、墨者安全专家:我没用过,是新兴的类似360的辅助软件,其中附带的趋势完全免费。
官网:http://www.mozhe.com/
产品:墨者安全专家
6、瑞星卡卡:这个也很多人用,不用介绍了吧。
官网:http://tool.ikaka.com/
产品:瑞星卡卡上网安全助手
7、金山软件:系统辅助类软件,用过的都知道,还有免费的ARP 防火墙、金山密保、金山清理专家、WPS。
官网:http://www.ba.net/index.shtml
产品:金山清理专家、金山密保、ARP 防火墙、WPS(http://wps.kingsoft.com/ 特别推荐)
8、绿鹰:
官网:http://www.cnlvker.com/#EGhost
产品:绿鹰安全精灵、一键恢复系统……
9、windows清理助手:很不错的辅助软件。
官网:http://www.arswp.com/
产品:windows清理助手
10、中网S3:
官网:http://www.netchina.com.cn/users/0/151.html
下载:http://www.netchina.com.cn/users/0/151.html
11、瑞星谷歌专版:不知道可以免费多久。
官网:http://pack.google.com/intl/zh-cn/pack_installer.html
下载:http://pack.google.com/intl/zh-cn/pack_installer.html
12、光华反病毒:
官网:http://www.viruschina.com/
下载:http://www.viruschina.com/downs/index.htm
13、杀马:
官网:http://www.xnlab.com/zh/
下载:http://www.xnlab.com/zh/defendio/
其他国内安软:
1、费尔:极力推荐,69元终身码,谁用谁知的,官方工作认真负责,我是深有体会,有90天试用期(只能试用一次,因为会记录硬盘信息以防盗版)。
官网:http://www.filseclab.com/chs/default.htm
产品:费尔托斯特安全、费尔个人防火墙专业版(免费)、费尔网络监护专家
2、金山:免费37天,很久以前就有的规矩了,只免费使用37天,现在2009版出来了,值得期待。
官网:http://www.ba.net/index.shtml
产品:金山毒霸、金山网镖
3、瑞星:现在有免费1年的活动,不知道啥时候终止,大家想用就要快哈,以前一般是试用半年还是3个月。
官网:http://www.rising.com.cn/new2008/
产品:瑞星杀毒软件、瑞星防火墙
4、江民:一般试用30天,貌似防火墙是免费的。
官网:http://www.jiangmin.com/
产品:江民杀毒软件、江民密保、江民防火墙……
5、微点:有预升级,具体情况自己到官网看。
官网:http://www.micropoint.com.cn/
产品:微点主动防御软件
6、风云:风云防火墙实质上是一款免费软件,软件免费下载安装后没有任何实用功能限制,官方为注册用户提供软件在线升级服务(如软件的版本更新、优化、特征码库等)。您只需要花费68元,就可拥有风云终身正版升级序列号。
官网:http://www.218.cc/ (应该是这个)
产品:风云防火墙
7、彩影ARP防火墙:很有名的局域网防火墙,单机版授权方式(http://www.antiarp.com/reg.asp?ArticleID=83)
官网:http://www.antiarp.com/index.htm
产品:彩影ARP防火墙网络版、单机版
08总结--国外真正免费安全软件大集合
一、杀毒软件(antivirus)
1、PC Tools AntiVirus:有中文
官网:http://www.pctools.com/cn/
下载:http://www.pctools.com/cn/free-antivirus/
2、Avira:德国小红伞,无中文
官网:http://www.free-av.com/
下载:http://www.free-av.com/en/downlo ... free_antivirus.html
3、avast !:捷克小a,有中文
官网:http://www.avast.com/index_cns.html
下载:
http://www.avast.com/cns/download-avast-home.html (windows)
http://www.avast.com/cnt/download-avast-for-linux-edition.html (Linux)
4、AVG :无中文
官网:http://www.avg.com/
下载:http://www.avg.com/download-trial 或者 http://free.avg.com/
5、大蜘蛛绿色版:有中文,只是一个扫描器,但是确实很不错,当你的杀软被病毒搞死时,这个在安全模式下的杀毒是不二选择。
官网:http://www.drweb.com.cn/
下载:http://www.download.com/Dr-Web-CureIt-/3000-2239_4-128071.html
6、BitDefender Free Edition 8
官网:http://www.bitdefender.com/
下载:http://www.download.com/BitDefen ... 239_4-10322483.html
7、clamwin :无中文
官网:http://www.clamwin.com/
下载:http://www.clamwin.com/content/view/18/46/
二、反间谍(antispyware)
1、Ad-Aware:无中文
官网:http://lavasoft.com/
下载:http://lavasoft.com/procts/ad_aware_free.php
2、Spyware Terminator :无中文
官网:http://www.spywareterminator.com/
下载:http://www.spywareterminator.com/download/download.aspx
3、a-squared :有中文
官网:http://www.emsisoft.com/en/
下载:http://www.emsisoft.com/en/software/free/
三、主机入侵防御系统(HIPS)
1、ThreatFire:有中文
官网:http://www.threatfire.com/
下载:http://www.threatfire.com/download/
2、System Safety :有中文
官网:http://www.syssafety.com/
下载:http://www.syssafety.com/
四、防火墙(Firewall)
1、Ashampoo :有繁体中文
官网:http://www2.ashampoo.com/webcache/html/1/home_2.htm
下载:http://www2.ashampoo.com/webcache/html/1/proct_2_0050__.htm
2、Jetico :不详
官网:http://www.jetico.com/
下载:http://www.jetico.com/jpfirewall.htm
3、PC Tools Firewall Plus :有中文
官网:http://www.pctools.com/cn/
下载:http://www.pctools.com/cn/firewall/download/
4、Zonealarm:无中文
官网:http://www.zonealarm.com/store/content/home.jsp?dc=12bms&;ctry=CN〈=zh
下载:http://www.zonealarm.com/store/content/dotzone/freeDownloads.jsp
5、Online Armor :无中文
官网:http://www.tallemu.com/
下载:http://www.tallemu.com/free-firewall-protection-software.html
五、安全套装( Internet Security)
1、comodo :因为现在把防火墙和杀软组合在一起,所以以前的comodo 单纯的防火墙很难看到了(无中文)
官网:http://www.comodo.com/
下载:http://www.personalfirewall.comodo.com/index.html
补充冷门:
1、Moonsecure Antivirus
基于clamwin的引擎加自己的启发技术,开源免费,最新版本2.2.2.164beta
官网:www.moonsecure.com
2、My Free Antivirus 2.0
比较冷门的免费,简单的简介,不足的查杀率,可使用不推荐长时间使用
官网:http://smartpctools.com/free_antivirus/index.html
③ C语言中头文件errno.h是什么含义包含些什么内容
errno.h 是C语言抄C标准函式库里的标头档,定义了通过错误码来回报错误信息的宏。
errno本身是一个整型的全局变量,当使用errno的库函数,在执行出错时,只通过函数返回值返回一个表示出错的标识,如-1或NULL等,具体的出错原因会被赋值到errno中。通过查询errno可以确定具体的出错原因。
在errno.h中定义了一系列常见的宏,其形式为
#define EPERM 1 /* Operation not permitted */
可以划分为
1 定义一个宏名,以E开头;
2 定义其值,为一个正整数;
3 一个注释区域,说明该错误号出现时的具体错误内容。
errno.h中的条目因不同编译器的实现而有所区别,一般在100~128条范围内,具体内容可以在编译器的系统标准头文件夹下查看对应文件。
④ 怎样写linux下的USB设备驱动程序
写一个USB的驱动程序最 基本的要做四件事:驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)
驱动程序支持的设备:有一个结构体struct usb_device_id,这个结构体提供了一列不同类型的该驱动程序支持的USB设备,对于一个只控制一个特定的USB设备的驱动程序来说,struct usb_device_id表被定义为:
/* 驱动程序支持的设备列表 */
static struct usb_device_id skel_table [] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
{ } /* 终止入口 */
};
MODULE_DEVICE_TABLE (usb, skel_table);
对 于PC驱动程序,MODULE_DEVICE_TABLE是必需的,而且usb必需为该宏的第一个值,而USB_SKEL_VENDOR_ID和 USB_SKEL_PRODUCT_ID就是这个特殊设备的制造商和产品的ID了,我们在程序中把定义的值改为我们这款USB的,如:
/* 定义制造商和产品的ID号 */
#define USB_SKEL_VENDOR_ID 0x1234
#define USB_SKEL_PRODUCT_ID 0x2345
这两个值可以通过命令lsusb,当然你得先把USB设备先插到主机上了。或者查看厂商的USB设备的手册也能得到,在我机器上运行lsusb是这样的结果:
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 002: ID 1234:2345 Abc Corp.
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
得到这两个值后把它定义到程序里就可以了。
注册USB驱动程序:所 有的USB驱动程序都必须创建的结构体是struct usb_driver。这个结构体必须由USB驱动程序来填写,包括许多回调函数和变量,它们向USB核心代码描述USB驱动程序。创建一个有效的 struct usb_driver结构体,只须要初始化五个字段就可以了,在框架程序中是这样的:
static struct usb_driver skel_driver = {
.owner = THIS_MODULE,
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
};
探测和断开:当 一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。当驱动程序因 为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它 还把所需的任何设备相关信息保存到一个局部结构体中,
提交和控制urb:当驱动程序有数据要发送到USB设备时(大多数情况是在驱动程序的写函数中),要分配一个urb来把数据传输给设备:
/* 创建一个urb,并且给它分配一个缓存*/
urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) {
retval = -ENOMEM;
goto error;
}
当urb被成功分配后,还要创建一个DMA缓冲区来以高效的方式发送数据到设备,传递给驱动程序的数据要复制到这块缓冲中去:
buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
if (!buf) {
retval = -ENOMEM;
goto error;
}
if (_from_user(buf, user_buffer, count)) {
retval = -EFAULT;
goto error;
}
当数据从用户空间正确复制到局部缓冲区后,urb必须在可以被提交给USB核心之前被正确初始化:
/* 初始化urb */
usb_fill_bulk_urb(urb, dev->udev,
usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
buf, count, skel_write_bulk_callback, dev);
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
然后urb就可以被提交给USB核心以传输到设备了:
/* 把数据从批量OUT端口发出 */
retval = usb_submit_urb(urb, GFP_KERNEL);
if (retval) {
err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
goto error;
}
当urb被成功传输到USB设备之后,urb回调函数将被USB核心调用,在我们的例子中,我们初始化urb,使它指向skel_write_bulk_callback函数,以下就是该函数:
static void skel_write_bulk_callback(struct urb *urb, struct pt_regs *regs)
{
struct usb_skel *dev;
dev = (struct usb_skel *)urb->context;
if (urb->status &&
!(urb->status == -ENOENT ||
urb->status == -ECONNRESET ||
urb->status == -ESHUTDOWN)) {
dbg("%s - nonzero write bulk status received: %d",
__FUNCTION__, urb->status);
}
/* 释放已分配的缓冲区 */
usb_buffer_free(urb->dev, urb->transfer_buffer_length,
urb->transfer_buffer, urb->transfer_dma);
}
有时候USB驱动程序只是要发送或者接收一些简单的数据,驱动程序也可以不用urb来进行数据的传输,这是里涉及到两个简单的接口函数:usb_bulk_msg和usb_control_msg ,在这个USB框架程序里读操作就是这样的一个应用:
/* 进行阻塞的批量读以从设备获取数据 */
retval = usb_bulk_msg(dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer,
min(dev->bulk_in_size, count),
&count, HZ*10);
/*如果读成功,复制到用户空间 */
if (!retval) {
if (_to_user(buffer, dev->bulk_in_buffer, count))
retval = -EFAULT;
else
retval = count;
}
usb_bulk_msg接口函数的定义如下:
int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe,
void *data,int len,int *actual_length,int timeout);
其参数为:
struct usb_device *usb_dev:指向批量消息所发送的目标USB设备指针。
unsigned int pipe:批量消息所发送目标USB设备的特定端点,此值是调用usb_sndbulkpipe或者usb_rcvbulkpipe来创建的。
void *data:如果是一个OUT端点,它是指向即将发送到设备的数据的指针。如果是IN端点,它是指向从设备读取的数据应该存放的位置的指针。
int len:data参数所指缓冲区的大小。
int *actual_length:指向保存实际传输字节数的位置的指针,至于是传输到设备还是从设备接收取决于端点的方向。
int timeout:以Jiffies为单位的等待的超时时间,如果该值为0,该函数一直等待消息的结束。
如果该接口函数调用成功,返回值为0,否则返回一个负的错误值。
usb_control_msg接口函数定义如下:
int usb_control_msg(struct usb_device *dev,unsigned int pipe,__u8 request,__u8requesttype,__u16 value,__u16 index,void *data,__u16 size,int timeout)
除了允许驱动程序发送和接收USB控制消息之外,usb_control_msg函数的运作和usb_bulk_msg函数类似,其参数和usb_bulk_msg的参数有几个重要区别:
struct usb_device *dev:指向控制消息所发送的目标USB设备的指针。
unsigned int pipe:控制消息所发送的目标USB设备的特定端点,该值是调用usb_sndctrlpipe或usb_rcvctrlpipe来创建的。
__u8 request:控制消息的USB请求值。
__u8 requesttype:控制消息的USB请求类型值。
__u16 value:控制消息的USB消息值。
__u16 index:控制消息的USB消息索引值。
void *data:如果是一个OUT端点,它是指身即将发送到设备的数据的指针。如果是一个IN端点,它是指向从设备读取的数据应该存放的位置的指针。
__u16 size:data参数所指缓冲区的大小。
int timeout:以Jiffies为单位的应该等待的超时时间,如果为0,该函数将一直等待消息结束。
如果该接口函数调用成功,返回传输到设备或者从设备读取的字节数;如果不成功它返回一个负的错误值。
这两个接口函数都不能在一个中断上下文中或者持有自旋锁的情况下调用,同样,该函数也不能被任何其它函数取消,使用时要谨慎。
我们要给未知的USB设备写驱动程序,只需要把这个框架程序稍做修改就可以用了,前面我们已经说过要修改制造商和产品的ID号,把0xfff0这两个值改为未知USB的ID号。
#define USB_SKEL_VENDOR_ID 0xfff0
#define USB_SKEL_PRODUCT_ID 0xfff0
还 有就是在探测函数中把需要探测的接口端点类型写好,在这个框架程序中只探测了批量(USB_ENDPOINT_XFER_BULK)IN和OUT端点,可 以在此处使用掩码(USB_ENDPOINT_XFERTYPE_MASK)让其探测其它的端点类型,驱动程序会对USB设备的每一个接口进行一次探测, 当探测成功后,驱动程序就被绑定到这个接口上。再有就是urb的初始化问题,如果你只写简单的USB驱动,这块不用多加考虑,框架程序里的东西已经够用 了,这里我们简单介绍三个初始化urb的辅助函数:
usb_fill_int_urb :它的函数原型是这样的:
void usb_fill_int_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buff,
int buffer_length,usb_complete_t complete,
void *context,int interval);
这个函数用来正确的初始化即将被发送到USB设备的中断端点的urb。
usb_fill_bulk_urb :它的函数原型是这样的:
void usb_fill_bulk_urb(struct urb *urb,struct usb_device *dev,
unsigned int pipe,void *transfer_buffer,
int buffer_length,usb_complete_t complete)
这个函数是用来正确的初始化批量urb端点的。
usb_fill_control_urb :它的函数原型是这样的:
void usb_fill_control_urb(struct urb *urb,struct usb_device *dev,unsigned int pipe,unsigned char *setup_packet,void *transfer_buffer,int buffer_length,usb_complete_t complete,void *context);
这个函数是用来正确初始化控制urb端点的。
还有一个初始化等时urb的,它现在还没有初始化函数,所以它们在被提交到USB核心前,必须在驱动程序中手工地进行初始化,可以参考内核源代码树下的/usr/src/~/drivers/usb/media下的konicawc.c文件。