Solaris下C语言编程初步入门.ppt_第1页
Solaris下C语言编程初步入门.ppt_第2页
Solaris下C语言编程初步入门.ppt_第3页
Solaris下C语言编程初步入门.ppt_第4页
Solaris下C语言编程初步入门.ppt_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Solaris 10C编程,南京天石软件技术有限公司 陈锺 (QQ:31423047 MSN:cz_),Solaris软件开发环境的搭建,添加必须的路径信息到环境变量 添加如下信息到/.profile PATH=$PATH:/usr/sfw/bin:/usr/local/bin:/usr/local/lib:/usr/ccs/bin;export PATH 复制必须的lib以使gcc工作正常 执行如下命令:cp /usr/sfw/lib/libstdc+.so.6 /lib/和cp /usr/sfw/lib/libgcc_s.so.1 /lib/ 为了编译gtk软件,例如制图包和一次图: 将/

2、usr/lib/pkgconfig/gthread-2.0.pc和/usr/lib/pkgconfig/ORBit-2.0.pc 中的-mt替换成-D_REENTRANT 重新启动,SolarisSun Studio安装,安装Sun Studio11 安装包为studio11-sol-x86.tar.bz2 bzip2 -d studio11-sol-x86.tar.bz2解压 tar xf studio11-sol-x86.tar解包 ./installer进行安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,Sol

3、arisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,SolarisSun Studio安装,为Sun Studio配置环境 在/.profile文件的PATH变量赋值中加入/opt/SUNWspro/bin,Solarisgcc,在为Unix开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何 灵活运用C编译器. 目前Linux

4、下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的程序. GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等. 开放、自由和灵活是gcc的魅力所在,程序员通过它能够更好地控制整个编译过程. 各操作系统的gcc略有不同。,Solarisgcc,使用GCC编译程序时,编译过程可以被细分为四个阶段: 预处理(Pre-Processing) 编译(Compil

5、ing) 汇编(Assembling) 链接(Linking),Solaris软件开发模式,模式一 每个程序员机器上安装Solaris,使用gedit编写程序或者Sun studio集成开发。 优点:直接编写、编译、调试。 缺点:Solaris下其他辅助工具少,Solaris桌面提供的软件相对匮乏,word文档等在windows与Solaris间无法完全兼容。,Solaris软件开发模式,模式二 每个程序员机器上使用windows,在一台编程调试服务器上安装Solaris。程序员使用Xmanager登陆到服务器的Solaris进行程序编写、编译。 优点:双操作系统并存,windows资源丰富,

6、在Solaris下直接编写、编译、调试。 缺点:对调试服务器性能要求较高,否则交互速度太慢。,Solaris软件开发模式,模式三 每个程序员机器上使用windows,在一台编程调试服务器上安装Solaris。使用windows环境编写程序,通过ftp工具将代码传输到服务器的Solaris,通过telnet远程登陆编译。 优点:程序编写工具丰富。 缺点:必须经过代码传输过程,远程字符模式的编译、修改、调试。,Solarishelloworld.c,#include int main(void) printf (Hello world, Solaris programming!n); return

7、 0; gcc helloworld.c -o helloworld.o ./helloworld.o Hello world, Solaris programming!,Solarisdbx,dbx程序调试工具程序崩溃 例子:crash.c 1:#include 2:int main(void) 3: 4: char * ss=NULL; 5: sprintf(ss,helloworld!n); 6: printf(ss); 7: return 0; 8:,Solarisdbx,使用-g编译程序,以使编译出来的程序带调试环境 gcc -g crash.c o crash.o 运行crash.

8、o bash-3.00# ./crash.o 段错误 (core dumped) 怎么样快速找到问题?,Solarisdbx,bash-3.00# dbx crash.o For information about new features see help changes To remove this message, put dbxenv suppress_startup_message 7.5 in your .dbxrc Reading crash.o Reading ld.so.1 Reading libc.so.1 (dbx) run Running: crash.o (proce

9、ss id 1230) signal SEGV (no mapping at the fault address) in memchr at 0 xd27044d5 0 xd27044d5: memchr+0 x0055: cmpb (%eax),%cl Current function is main 5 sprintf(ss,helloworld!n); (dbx) quit,Solarisdbx,dbx程序调试工具内存泄露 例子:leak.c 1:#include 2:int main(void) 3: 4: int i=0; 5: printf(“pid=%dn”,getpid();

10、6: while(i100) 7: 8: char *ss=malloc(sizeof(char)*64); 9: sprintf(ss,helloworld!n); 10: usleep(100000); 11: i+; 12: 13: return 0; 14:,Solarisdbx,使用-g编译程序,以使编译出来的程序带调试环境 gcc -g leak.c -o leak.o 运行leak.o bash-3.00# ./ leak.o pid=1325 使用prstat -p 1325 1命令查看leak.o进程状态,怎么SIZE(占用的虚拟内存)和RSS(内存)不断增长? 怎么样快速找

11、到内存泄露问题?,Solarisdbx,bash-3.00# dbx leak.o For information about new features see help changes To remove this message, put dbxenv suppress_startup_message 7.5 in your .dbxrc Reading leak.o Reading ld.so.1 Reading libc.so.1 (dbx) dbxenv rtc_mel_at_exit verbose开启结束后显示详细信息 (dbx) check -leaks开启内存泄露选项 lea

12、ks checking - ON (dbx) run,Solarisdbx,Running: leak.o (process id 1329) Reading rtcapihook.so Reading libdl.so.1 Reading rtcaudit.so Reading libmapmalloc.so.1 Reading libgen.so.1 Reading libm.so.2 Reading rtcboot.so Reading librtc.so RTC: Enabling Error Checking. RTC: Running program. pid=1329,Solar

13、isdbx,Checking for memory leaks. Actual leaks report (actual leaks: 100 total size: 6400000 bytes) Memory Leak (mel): Found 100 leaked blocks with total size 6400000 bytes At time of each allocation, the call stack was: 1 main() at line 8 in leak.c Possible leaks report (possible leaks: 0 total size

14、: 0 bytes) execution completed, exit code is 0 (dbx) quit,Solarisdbx,小结 dbx包含在Sun Studio中。 编译时必须使用-g才能在dbx显示出与源代码相关的调试结果信息。 守护进程在调试前,请先使其成为普通进程。 调试网络程序时,在dbx调试时使用ignore SIGPIPE来避免网络信号导致调试中断。,Solaris常用调试手段,直接在终端中输出信息 如果是守护进程写调试信息文件 使用dbx 使用sunix系统的web调试平台,Solaris时间函数,char *ctime(const time_t *clock);

15、 struct tm *localtime(const time_t *clock); struct tm *gmtime(const time_t *clock); char *asctime(const struct tm *tm);-以上非MT-Safe char *ctime_r(const time_t *clock, char *buf, int buflen); struct tm *localtime_r(const time_t *restrict clock, struct tm *restrict res); struct tm *gmtime_r(const time_

16、t *restrict clock, struct tm *restrict res); char *asctime_r(const struct tm *restrict tm, char *restrict buf, int buflen);-以上为MT-Safe 推荐,Solaris解析传递给程序的参数,如何在程序中使用执行时传递过来的参数? 例如:./arguments.o debug hello=1。 带有参数的main()函数头格式如下: int main(int argc, char * argv) 其中,第一个参数argc是int型的,它用来存放命令行参数的个数,实际上argc

17、所存放的数值比命令行参数的个数多1,即将命令字(可执行文件名)也计算在内。第二个参数argv是一个一维的一级指针数组,它是用来存放命令行中各个参数和命令字的字符串的,并且规定: argv0存放命令字 argv1存放命令行中第一个参数 argv2存放命令行中第二个参数 这里,argc的值和argv各元素的值都是系统自动组赋值的。,Solaris解析传递给程序的参数,程序范例 #include stdio.h int main(int argc, char *argv) int i=0; printf(The number of command line arguments is:%dn,argc

18、); printf(The program name is:%sn,argv0); printf(The command line arguments:n); for (i=1; iargc; i+) printf(argv%d:%sn,i,argvi); return 1; rootserver1/skystone #./arguments.o debug hello=1 The number of command line arguments is:3 The program name is:./arguments.o The command line arguments: argv1:d

19、ebug argv2:hello=1,Solaris守护进程,守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Unix的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则会出现错误的。,Solaris守护进程,fo

20、rk的含义 进程A调用int pid=fork()之后,实际上是克隆出来一个子进程B。 进程A是进程B的父进程;进程B是进程A的子进程。 进程B与进程A在堆栈、环境、状态方面在fork的时候是一样的。 在进程A即父进程fork()的返回值非0,返回的是子进程的pid;在进程B即子进程fork()返回的是0。根据返回值,主子进程按照自己的不同逻辑执行下去。,Solaris守护进程,Solaris下守护进程实现函数 int sux_init_daemon(void) /返回值 !=2 退出程序 int pid; int i; pid=fork();/派生一个进程 if (pid0) return

21、0;/派生失败 if(pid!=0) exit(0);/是父进程,结束父进程 /是第一子进程,后台继续执行 setsid();/第一子进程成为新的会话组长和进程组长 并与控制终端分离 signal( SIGHUP, SIG_IGN );/忽略SIGHUP pid=fork();/再次派生一个进程 if (pid0) return 0;/派生失败 if(pid!=0) exit(0);/是第一子进程,结束第一子进程 /是第二子进程,继续 第二子进程不再是会话组长 for(i=0;i getdtablesize();i+)/关闭打开的文件描述符 close(i); chdir(/tmp);/改变工

22、作目录到/tmp umask(0);/重设文件创建掩模 return 2; ,Solaris文件访问,打开文件 FILE * fp=fopen(filename,“mode); mode:r文本方式读打开 w文本方式生成并写打开(原文件信息丢失) a文本方式打开文件追加 rb二进制方式读打开 wb二进制方式生成并写打开(原文件信息丢失) ab二进制方式打开文件追加 r+b二进制方式读/写打开文件 w+b二进制方式生成读/写打开文件(原文件信息丢失) a+b二进制方式读/写打开文件 以读写方式打开文件时,读操作与写操作(无先后顺序)之间必须有下列函数之一:fflush(),fseek(),fse

23、tpos(),rewind(),Solaris文件访问,关闭文件 int fclose(FILE* fp) 重要函数 int fflush(FILE *fp) 如果文件写打开,应调用fflush()将输出缓冲区中的内容物理写入文件。,Solaris文件访问,例一:读文本文件 char readbuf512; FILE *fp=fopen(filename,rt); if (fp=NULL) if (errno=ENOENT) return 2;/文件不存在 return -1; while (!feof(fp) if (fscanf(fp,%511sn,readbuf)!=1) continu

24、e; if (fp!=NULL) fclose(fp); fp=NULL; ,Solaris文件访问,例二:写文本文件-日志文件 void handleftplog(char * s1)/写日志 s1中已经有n struct tm nowtm;time_t nowtime;char log1024; char filename128;struct timeval ntv; gettimeofday( ,SolarisPosix共享内存,Posix标准 由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作

25、系统界面(POSIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵 循POSIX标准。 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。,SolarisPosix共享内存,打开、创建共享内存 int shm_open(const char *name, int oflag, mode_t mode); name:共享内存名称,共享内存唯一标示,为兼容性考虑,一般以/开头 oflag:O_RDONLY读方式打开 O_RDWR读写方式打开

26、 O_CREAT如果不存在则创建 O_EXCL如果O_CREAT同时被设置,那么共享内存如果已存在,就返回失败 O_TRUNC如果共享内存被正确可读写打开,那么该共享内存被重置为0长度,SolarisPosix共享内存,mode一般设置为S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH,表示共享内存的访问权限。 返回值: 成功返回句柄=0 失败返回-1错误码 errorno,SolarisPosix共享内存,关闭共享内存 int close(int fd); 设置共享内存大小 int ftruncate(int fd,off_t size); 成功

27、 返回0失败 返回-1 errno 得到共享内存大小 int fstat(int fd, struct stat * buf); 成功 返回0失败 返回-1 errno 内存大小=buf-st_size;,SolarisPosix共享内存,映射内存地址 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t off); addr:指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。 len:是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算

28、起。 prot :参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。 flags:通常为MAP_SHARED 。 fd:为即将映射到进程空间的文件描述字,一般由open()返回。 off:参数一般设为0,表示从文件头开始映射。 成功 返回指针失败 返回-1,SolarisPosix共享内存,关闭映射 int munmap(void *addr, size_t len); addr:mmap映射的指针 len:mmap映射的大小 返回成功 0失败-1 删除共享内存 i

29、nt shm_unlink(const char *name); name:共享内存名 返回成功 0失败-1,SolarisPosix共享内存,头文件 #include #include #include #include #include #include #include #include #include #include #include #include #include 编译时加上-lrt gcc createshm.c -o createshm.o -lrt,int main(int argc,char * argv)/createshm.c printf(usage:%s sh

30、mname stringn,argv0); if (argc!=3) return 0; size_t size=(strlen(argv2)+1)*sizeof(char); shm_unlink(argv1); int fd; fd=shm_open(argv1,O_RDWR|O_CREAT|O_EXCL , S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if (fd=-1) printf(shm_open failed err:%d%sn,errno,strerror(errno); return 0; if (ftruncate(f

31、d,size)=-1) printf(ftruncate failed err:%d%sn,errno,strerror(errno); char * p=NULL; p=(char *)mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if (int)p=-1) printf(mmap failed err:%d%sn,errno,strerror(errno); memcpy(p,argv2,size); munmap(p,size); close(fd); printf(okn); ,int main(int argc,char

32、* argv)/readshm.c printf(usage:%s shmnamen,argv0); if (argc!=2) return 0; size_t size;struct stat statbuf; int fd; fd=shm_open(argv1,O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if (fd=-1) printf(shm_open failed err:%d%sn,errno,strerror(errno); return 0; if (fstat(fd, ,SolarisPosix共享内存,

33、#gcc createshm.c -o createshm.o -lrt #gcc readshm.c -o readshm.o -lrt #./createshm.o /tshm helloworld! usage:./createshm.o shmname string ok #./readshm.o /tshm usage:./readshm.o shmname readshm:helloworld! ok,SolarisPosix信号量,信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 打开、创建信号量 sem_t *sem_open(const cha

34、r *name, int oflag,/* unsigned long mode, unsigned int value */); name:信号量名称,信号量唯一标示,为兼容性考虑,一般以/开头 oflag:O_RDWR读写方式打开 O_CREAT如果不存在则创建 O_EXCL如果O_CREAT同时被设置,那么信号量如果已存在,就返回失败,SolarisPosix信号量,mode一般设置为S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH,表示共享内存的访问权限。 value:信号量初值 返回值: 成功返回句柄 失败返回SEM_FAILED错误码

35、errorno 打开信号量时mode,value参数不需要,SolarisPosix信号量,关闭信号量 int sem_close(sem_t *sem); 返回成功 0 失败-1 等待信号量(死等) int sem_wait(sem_t *sem); 返回成功 0 失败-1 等待信号量(立即返回) int sem_trywait(sem_t *sem); 返回成功-等到信号量 0 失败-1(如果errno = EAGAIN,表示没等到信号量),SolarisPosix信号量,等待信号量(带绝对时间超时) int sem_timedwait(sem_t *restrict sem, const

36、 struct timespec *restrict abs_timeout); 返回成功-等到信号量0 失败-1(如果errno=ETIMEDOUT表示没等到) abs_timeout:绝对时间,等待超过这个时间就返回。 等待信号量(带相对时间超时)-与Linux不兼容 int sem_reltimedwait_np(sem_t *restrict sem, const struct timespec *restrict rel_timeout);,SolarisPosix信号量,释放信号量 int sem_post(sem_t *sem); 返回成功 0 失败-1 删除信号量 int se

37、m_unlink(const char *name); 返回成功 0 失败-1,SolarisPosix共享内存与信号量,一般应用 主程序:创建共享内存(一定要用memset将内存区清0),信号量 其他程序:链接共享内存,链接信号量,等待信号量,处理共享内存,释放信号量 释放共享内存,释放信号量,SolarisPosix共享内存与信号量,Posix共享内存的重要特性 Posix共享内存支持在被其他人映射的前提下,改变共享内存的大小。 要点:步进式增加或缩小 在共享内存中含有该共享内存的大小信息 所有程序等待到信号量之后,如果共享内存与自己映射的发生改变,则需要重新映射,SolarisPosix

38、共享内存与信号量,在SCADA通讯管理机中的实际意义 共享内存的可伸缩性与无参数的通讯管理机相匹配。 通讯管理机真正做到可伸缩性。 思考题 程序一:创建共享内存,信号量。 程序二:将用户添加的字符串添加到共享内存后面。 程序三:每5秒钟将共享内存的信息输出出来。,SolarisTCP/IP编程,I/O模式 阻塞模式 非阻塞模式 服务器模式 单进程I/O复用 多线程 多进程 编译 gcc mysocket.c o mysocket.o -lsocket -lnsl -lresolv,SolarisTCP/IP编程,阻塞模式 所有的I/O函数都是同步返回的。 包括客户端的connect 服务端的a

39、ccept,connect 客户端、服务端的send,recv 会造成程序在某个I/O操作时挂起。 I/O效率低。,SolarisTCP/IP编程,非阻塞模式 所有的I/O函数都是异步立即返回的。 包括客户端的connect 服务端的accept,connect 客户端、服务端的send,recv 程序不会阻塞在任何I/O操作上。 I/O效率高。,SolarisTCP/IP编程,初始化socket int initsocket(int * fd,struct sockaddr_in * mybind,char * ip,int port,char * sockname,int canliste

40、n)/初始化socket int opt; int bufsize=20480; int flags; if (*fd=socket(AF_INET,SOCK_STREAM,0)=-1) return -1; opt=1;/ SO_REUSEADDR; if (setsockopt(*fd,SOL_SOCKET,SO_REUSEADDR,SolarisTCP/IP编程,/设置接收缓冲区 if (setsockopt(*fd,SOL_SOCKET,SO_RCVBUF,(char *),SolarisTCP/IP编程,if (canlisten=1) if(listen(*fd,128)=-1)

41、close(*fd);*fd=-1;return -1; flags=fcntl(*fd,F_GETFL,0); fcntl(*fd,F_SETFL,flags|O_NONBLOCK); if (port=0) struct sockaddr_in sa; int ll=sizeof(sa); if (getsockname(*fd, ,SolarisTCP/IP编程,关闭socket int releasesocket(int *fd)/释放socket if (*fd)=-1) return 1; shutdown(*fd),SHUT_RDWR); close(*fd); (*fd)=-1

42、; return 1; ,SolarisTCP/IP编程,非阻塞实现重要函数select int select(int nfds, fd_set *restrict readfds, fd_set *res-trict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout); nfds:检测句柄范围,通常为maxfd+1 readfds, writefds, errorfds:判断可读、可写、出错的句柄集合 timeout:超时时间 返回成功=0 返回满足条件的句柄数 失败 -1,SolarisTCP/IP编

43、程,客户端连接服务器流程 char hint512; int co,cook=-1; clientlen=sizeof(client); client.sin_family=AF_INET; client.sin_port=htons(m_serverport); inet_aton(serverip,(struct in_addr *) ,SolarisTCP/IP编程,if(co=-1) ,SolarisTCP/IP编程,处理连接好的socket读写与异常 tm.tv_sec=0; tm.tv_usec=10000; FD_ZERO(,if (recvnum=-1) /处理数据 ,Sola

44、risTCP/IP编程,SolarisTCP/IP编程,if (m_fd!=-1) ,SolarisTCP/IP编程,TCP-Server编程模型 单进程I/O复用:一个进程管理所有连接,程序复杂度较高,多应用于实时数据的服务。 多线程:每个线程对应一个连接,注意线程间互斥。 多进程:每个进程对应一个连接,连接之间关联度小。,SolarisTCP/IP编程,单进程I/O复用模型 FD_ZERO( if(FD_ISSET(m_fd, pid_t pid;/进程ID pid=fork();/创建一个进程的系统调用 if(pid0)/主进程 g_status=0; close(connectfd);

45、 connectfd=-1; if(pid=0)/产生新进程子进程 g_status=1; close(g_lis_fd); /关闭监听套接口 g_lis_fd=-1; g_con_fd=connectfd; if (pid0)/出错了 g_con_fd=connectfd; close(g_con_fd); g_con_fd=-1; ,SolarisUDP广播编程,初始化socket if (m_fd=socket(AF_INET,SOCK_DGRAM,0)=-1) bzero( if (bind(m_fd,(struct sockaddr *) m_aim.sin_port=htons(m

46、_port); m_aim.sin_addr.s_addr=htonl(INADDR_BROADCAST); inet_aton(m_broadcastip,SolarisUDP广播编程,要点 UDP是基于报文格式的,收发都是一包一包的。 UDP非阻塞的,写成功代表写入缓冲区。 UDP不保证接收到的数据的完整、顺序。 UDP广播经常采用连发3次(每次之间有间隔),接收端过滤的模式防止丢包。,Solaris共享库编程,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本

47、身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。 Unix的动态链接库不仅有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是Unix系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。(在LINUX下,静态函数库是以.a作后缀的),Solaris共享库编程,共享库编程 头文件mylib.h #include dlfcn.h #include pthread.h typedef void (*lib_addtick)(); typedef int (*lib_gettick)(); typedef void (*lib_init)(); typedef void (*lib_release)(); typedef struct lib_init pinit; lib_release prelease; lib_addtick paddtick; lib_gettick pget

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论