linux操作系统下c语言编程入门课件_第1页
linux操作系统下c语言编程入门课件_第2页
linux操作系统下c语言编程入门课件_第3页
linux操作系统下c语言编程入门课件_第4页
linux操作系统下c语言编程入门课件_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux操作系统下C语言编程入门CNT第1页,共37页。Linux操作系统简介基础知识进程介绍文件操作时间概念消息管理线程操作网络编程Linux下C开发工具介绍第2页,共37页。一.Linux操作系统简介发展历史 1969年,Ken Thompson ,UNIXMINIX 1991年,芬兰赫尔辛基大学 LINUS现状和前景 大型计算机系统、PC、手持电脑主要特点 多用户、多任务、稳定性、安全性、开放性、网络功能应用领域 Internet(WEB、FTP、邮件、DNS服务器,TCP/IP路由、防火墙)、LAN、嵌入式系统、办公桌面发行版本 RedHat、Debian、红旗第3页,共37页。二.

2、基础知识源程序的编译gcc 编译器g+ 编译器例:gcc -o hello hello.c g+ -g -o hello.o hello.cpp编写makefile文件对某个Project编译时,需要编写makefile文件。一般的格式是:Target : components (依赖关系)TAB rule(规则)makefile 有三个非常有用的变量,分别是:$、$ 、$ 代表目标文件$ 代表所有的依赖文件$ 代表第一个依赖文件的名称第4页,共37页。Makefile实例:#This is the makefileCC = g+CFLAG = -Wall -OplcMain: src/mai

3、n.cpp obj/com.o obj/msgware.o obj/process.o obj/rtu.o obj/lmasrtu.o obj/schedule.o obj/rs232.o obj/linkcheck.o obj/msgqueue.o obj/ping.o obj/pid.o obj/paramfile.o$(CC) $(CFLAG) -lpthread -o $ src/main.cpp obj/com.o obj/msgware.o obj/process.o obj/rtu.o obj/lmasrtu.o obj/schedule.o obj/rs232.o obj/li

4、nkcheck.o obj/msgqueue.o obj/ping.o obj/pid.o obj/paramfile.oobj/com.o:src/Communication.cpp$(CC) $(CFLAG) -c -o $ $obj/msgware.o:src/MsgWare.cpp$(CC) $(CFLAG) -c -o $ $0)ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)if(bytes_write=-1)&(errno!=EINTR) break;/*是否写完所有读的字节*/else if(bytes_write

5、=bytes_read) break;else if(bytes_write0) /*只写了一部分*/ptr+=bytes_write;bytes_read-=bytes_write;if(bytes_write=-1) break;close(from_fd); close(to_fd);第12页,共37页。文件的属性int access(const char *pathname,int mode);判断文件是否可以进行某种操作(读,写等等),mode可以是以下值的组合:R_OK 文件可以读; W_OK 文件可以写;X_OK 文件可以执行; F_OK 文件存在测试成功时,函数返回0;当有一项

6、不符合时,返回-1。要获得文件的其他属性,我们可以使用函数stat 或者 stat(const char *pathname, struct stat * buf);int fstat(int filedes, struct stat * buf);返回的文件特性保存在类型为stat的结构体中(包含设备、节点、模式、用户ID、组ID、文件字节数、最后一次访问、修改的时间等信息),参数buf指向该结构。在该结构中,我们感兴趣的成员之一是st_mode,它包含了文件类型和文件权限。第13页,共37页。目录文件的操作C库函数中提供了getcwd函数,可以得到当前工作路径。char

7、*getcwd(char *buffer , size_t size);Linux下的目录操作函数:int mkdir(const char *path,mode_t mode); /创建目录DIR *opendir(const char *path); /打开目录struct dirent *readdir(DIR *dir); /读取目录int closedir(DIR *dir); /关闭目录第14页,共37页。其他函数int unlink(const char *pathname); /删除文件int rmdir(const char *pathname); /删除目录int remo

8、ve(const char *pathname); /删除文件或目录int rename(const char *oldname, const char *newname);/文件或目录更名int chmod(const char *filename, mode_t mode);int fchmod(int filedes, mode_t mode);chmod和fchmod用于改变文件的访问权限。成功则返回0,否则返回-1。第15页,共37页。五.时间概念时间表示和测量time_t time(time_t *tloc);返回自1970年1月1日0点以来的秒数char *ctime(const

9、 time_t *clock); 将秒数转化成字符串,例:Sat Dec 31 10:00:00 2005localtime 取得当地目前的时间和日期mktime 将时间结构数据转换成经过的秒数settimeofday 设置目前的时间gettimeofday 取得目前的时间,可以用作时间的测量第16页,共37页。六.消息管理POSIX 无名信号量用主要是用来保护共享资源,使得资源在一个时刻只为一个进程所拥有。信号灯(semaphore)是进程间共享的资源计数器。int sem_init(sem_t *sem,int pshared,unsigned int value);int sem_des

10、troy(sem_t *sem);/删除信号灯int sem_wait(sem_t *sem);/阻塞进程,直到信号灯值大于0,返回时自动将信号灯的值减1int sem_post(sem_t *sem);/与sem_wait相反,将信号灯的值加1,同时发出信号唤醒等待的进程int sem_trywait(sem_t *sem);/与sem_wait相似,但不阻塞int sem_getvalue(sem_t *sem); /得到信号灯的值第17页,共37页。System V 信号量System V的信号量是信号量集,可以包括多个信号灯,每个操作可以同时操作多个信号灯 ;POSIX是单个信号灯,P

11、OSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。第18页,共37页。七.线程操作线程线程是比进程更小的能独立运行的基本单位。 共享程序代码节省资源线程的创建和使用int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);pthread_create 创建一个线程,thread 是用来表明创建线程的ID,attr 指出线程创建时候的属性,我们用NULL 来表明使用缺省属性。start_routine 函数指针是线程创建成

12、功后开始执行的函数,arg是这个函数的唯一一个参数,表明传递给start_routine 的参数。第19页,共37页。例:if(pthread_create(&m_threadID,NULL,ThreadQueryData,(void*)this) != 0)if(pthread_create(&UpdateThreadId, NULL, ThreadDownLoadBaseSchedule, (void*)this) != 0)if(pthread_create(&SpanUpdateThreadId, NULL, ThreadUpdateSpanTimeTableToPlc, (void*

13、)this) != 0)第20页,共37页。void pthread_exit(void *retval);int pthread_join(pthread *thread,void *thread_return);pthread_exit 函数和exit 函数类似,用来退出线程。这个函数结束线程,释放函数的资源,并在最后阻塞,直到其他线程使用pthread_join 函数等待它,然后将*retval 的值传递给*thread_return。*多线程中共同占用某一资源时,注意信号锁机制。第21页,共37页。八.网络编程Linux 网络知识介绍1.客户端程序和服务端程序网络程序和普通的程序有一个

14、最大的区别是网络程序是由两个部分组成的客户端和服务器端。网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接。一般的来说是服务端的程序在一个端口上监听,直到有一个客户端的程序发来了请求。2.常用的命令netstat 显示网络的连接、路由表和接口等信息。telnet用于远程控制的程序,可以用来调试服务端程序。第22页,共37页。3. TCP/UDP 介绍TCP(Transfer Control Protocol)传输控制协议是一种面向连接的协议,当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的。UDP(User Datagram Protocol

15、)用户数据报协议是一种非面向连接的协议,这种协议并不能保证我们的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用TCP 协议的。第23页,共37页。初等网络函数介绍(TCP)Socket(套接字)套接字是一个通信端口,是一种使用标准UNIX文件描述字和其他程序通信的方法。从程序员的角度来看,它很象文件描述字,因为它同文件和管道一样使用write/read来读写数据。但是套接字和普通文件描述字又有不同:首先,套接字除了可以有一个地址以外,还明显包含着关于通信的3个属性域、类型和协议;其次,套接字的使用可以是非对称的,它通常明确的区分通信的两个进程为客户进程和服务进程,并且允许不同系统或机

16、器上的多个客户与单个服务相连;最后,套接字的创建和各种操作与文件描述字也有所不同。第24页,共37页。socket (创建套接字)int socket(int domain, int type, int protocol);domain: 说明网络程序所在的主机采用的通信协议族(AF_UNIX(UNIX域) 和AF_INET(Internet域) 等);type:网络程序所采用的通讯协议(SOCK_STREAM、SOCK_DGRAM等) ,SOCK_STREAM表示我们使用的是TCP协议, SOCK_DGRAM表示我们使用的是UDP协议。protocol: TCP/UDP,由于已指定协议,这里

17、设置为0。socket调用成功时,返回值为0;否则返回-1。例:skConnectSocket = socket(AF_INET,SOCK_DGRAM,0); 第25页,共37页。bind (命名套接字)int bind(int sockfd, struct sockaddr *my_addr, int addrlen);sockfd: 是由socket 调用返回的文件描述符.my_addr: 是一个指向结构类型sockaddr 对象的指针,该对象包含了要指定给socket的地址。addlen: socketaddr结构对象的长度。函数调用成功时返回0,否则返回-1。listen (创建连接队

18、列)int listen(int sockfd,int backlog);sockfd: 是bind返回的文件描述符。backlog: 设置请求排队的最大长度。listen 函数将bind 的文件描述符变为监听套接字,返回的情况和bind 一样。第26页,共37页。accept (创建新的面向特定客户的套接字)int accept(int sockfd, struct sockaddr *addr,int *addrlen);sockfd: 是listen 后的文件描述符。addr, addrlen 是用来给客户端的程序填写的,服务器端只要传递指针就可以了。bind、listen和accept

19、 服务器端用的函数,accept 调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。accept 成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1。第27页,共37页。connect (与服务器建立连接)int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);sockfd:socket返回的、同服务端通讯的文件描述符。serv_addr:储存了服务器端的连接信息。其中包含了服务端的地址。addrlen:serv_addr结构对象的长度。connect 函数是客户端用来

20、同服务端连接的。成功时返回0,失败时返回-1。第28页,共37页。套接字连接示意图服务端客户端socket()bind()accept()listen()阻塞直到收到来自客户的数据报socket()connect()建立连接write()read()数据(请求)read()进程请求write()数据(回答)read()close()close()文件结束第29页,共37页。读写函数写函数writessize_t write(int fd,const void *buf,size_t nbytes);write 函数将buf中的nbytes字节内容写入文件描述符fd。成功时返回写的字节数,失败时

21、返回-1,并设置errno 变量。如果错误为EINTR,表示在写的时候出现了中断错误;如果为EPIPE,表示网络连接出现了问题(对方已经关闭了连接)。第30页,共37页。读函数 readssize_t read(int fd,void *buf,size_t nbyte) ;read 函数是负责从fd 中读取内容。当读成功时,read返回实际所读的字节数,如果返回的值是0 表示已经读到文件的结束了,小于0表示出现了错误。如果错误为EINTR 说明读是由中断引起的, 如果是ECONNREST 表示网络连接出了问题。第31页,共37页。数据的传递/* 客户端向服务端写 */struct my_st

22、ruct my_struct_client;write(fd,(void *)&my_struct_client,sizeof(struct my_struct);/* 服务端的读*/char buffersizeof(struct my_struct);struct *my_struct_server;read(fd,(void *)buffer,sizeof(struct my_struct);my_struct_server=(struct my_struct *)buffer;第32页,共37页。用户数据报发送(UDP)两个常用的函数int recvfrom(int sockfd,vo

23、id *buf,int len,unsigned int flags,struct sockaddr * from, int *fromlen);int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to, int tolen);sockfd,buf,len 的意义和read、write 一样,分别表示套接字描述符、发送或接收的缓冲区及大小。recvfrom 负责从sockfd 接收数据,如果from不是NULL,那么from 里面存储了信息来源的情况;如果对信息的来源不感兴趣,可以将from 和fromlen 设置为NULL。sendto 负责向to 发送信息,此时在to 里面存储了收信息方的详细资料。例: int iRetVal = sendto(skConnectSocket, ps

温馨提示

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

评论

0/150

提交评论