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

下载本文档

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

文档简介

Linux操作系统下

C语言编程入门CNTLinux操作系统简介基础知识进程介绍文件操作时间概念消息管理线程操作网络编程Linux下C开发工具介绍一.Linux操作系统简介发展历史1969年,Ken

Thompson,UNIX

MINIX1991年,芬兰赫尔辛基大学

LINUS现状和前景大型计算机系统、PC、手持电脑主要特点多用户、多任务、稳定性、安全性、开放性、网络功能应用领域Internet(WEB、FTP、邮件、DNS服务器,TCP/IP路由、防火墙)、LAN、嵌入式系统、办公桌面发行版本RedHat、Debian、红旗二.基础知识源程序的编译gcc

编译器g++编译器例:gcc-o

hello

hello.cg++

-g

-o

hello.o

hello.cpp编写makefile文件对某个Project编译时,需要编写makefile文件。一般的格式是:Target

:

componentsTAB

rule(依赖关系)(规则)makefile有三个非常有用的变量,分别是:$@、$^

、$<$@—代表目标文件$^—代表所有的依赖文件$<—代表第一个依赖文件的名称Makefile实例:#This

is

the

makefileCC

=

g++CFLAG

=

-Wall

-OplcMain:

src/main.cpp

obj/com.o

obj/msgware.o

obj/process.o

obj/rtu.oobj/lmasrtu.o

obj/schedule.o

obj/rs232.o

obj/linkcheck.oobj/msgqueue.o

obj/ping.o

obj/pid.o

obj/paramfile.o$(CC)

$(CFLAG) -lpthread

-o

$@

src/main.cpp

obj/com.oobj/msgware.o

obj/process.o

obj/rtu.o

obj/lmasrtu.o

obj/schedule.oobj/rs232.o

obj/linkcheck.o

obj/msgqueue.o

obj/ping.o

obj/pid.oobj/paramfile.oobj/com.o:src/Communication.cpp$(CC)

$(CFLAG)

-c

-o

$@

$<……obj/msgware.o:src/MsgWare.cpp$(CC)

$(CFLAG)

-c

-o

$@

$<clean:rm

-fr

*.o程序的调试打印调试GDB调试头文件和系统求助man例:man

writeman

2

write“2”表示我们用的write函数是系统调用函数

“3”表示函数是C的库函数三.进程介绍进程的概念程序和进程程序是一个包含可以执行代码的文件,是一个静态的文件;而进程是一个开始执行但是还没有结束的程序的实例,就是可执行文件的具体实现。当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存、设备等等),然后进行一系列的复杂操作,使程序变成进程以供系统调用。进程的状态新建、运行、阻塞、就绪和完成进程的标志为了区分各个不同的进程,系统给每一个进程分配了一个ID。系统调用getpid函数可以得到进程的ID,而调用getppid函数可以得到父进程(创建调用该函数进程的进程)的ID。getuid可以得到进程所有者的ID,getgid可以得到组ID。进程的创建调用fork函数就可以创建一个进程的系统调用。pid_t

fork();四.文件操作文件的创建和读写int

open(const

char

*pathname,int

flags);int

open(const

char

*pathname,int

flags,mode_t

mode);open函数有两个形式。其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面);flags可以是下面的一个值或者是几个值的组合:O_RDONLY、O_WRONLY、O_RDWR、O_CREAT、O_APPEND(追加)、O_TRUNC(如果文件已经存在,则删除文件的内容)、O_NOBLOCK(非阻塞方式)*前面三个标志只能使用任意的一个*如果使用了O_CREATE标志,那么我们可以使用open的第二种形式。还要指定mode

标志,用来表示文件的访问权限。mode可以是以下情况的组合:S_IRUSR

用户可以读S_IXUSR

用户可以执行S_IWUSR

用户可以写S_IRWXU

用户可以读写执行S_IRGRP

组可以读S_IXGRP

组可以执行S_IWGRP

组可以写S_IRWXG

组可以读写执行S_IROTH

其他人可以读

S_IWOTH

其他人可以写S_IXOTH其他人可以执行S_IRWXO

其他人可以读写执行S_ISUID

设置用户执行ID

S_ISGID

设置组的执行ID

例:fd=open(“mnt/mtd/tb.data”

,

O_RDWR|O_CREAT|O_TRUNC

);fd=open(“temp”

,

O_CREAT,

S_IRUSR

|

S_IWUSR

|

S_IXUSR

|S_IRGRP

|

S_IWGRP

|

S_IXGRP

|

S_IROTH

|

S_IXOTH);文件打开以后,我们就可以调用write和read函数对文件进行读写操作了。ssize_t

read(int

fd,

void

*buffer,size_t

count);ssize_t

write(int

fd,

const

void

*buffer,size_t

count);fd是我们要进行读写操作的文件描述符,buffer是我们要写入文件内容或读出文件内容的内存地址,count是我们要读写的字节数。read

从指定的文件fd

中读取count字节到buffer缓冲区中,同时返回count。当读到了文件的结尾或者被一个信号所中断,返回值会小于count;如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR;当程序读到了文件结尾的时候,read会返回0。write

从buffer

中写count字节到文件fd

中,成功时返回实际所写的字节数。关闭文件时,只要调用close函数就可以了。while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){if((bytes_read==-1

)&&(errno!=EINTR))

break;else

if(bytes_read>0){ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)){if((bytes_write==-1)&&(errno!=EINTR))

break;/*是否写完所有读的字节*/else

if(bytes_write==bytes_read)

break;else

if(bytes_write>0)

/*只写了一部分*/{ptr+=bytes_write;bytes_read-=bytes_write;}}if(bytes_write==-1)

break;}close(from_fd);

close(to_fd);}文件的属性int

access(const

char

*pathname,int

mode);判断文件是否可以进行某种操作(读,写等等),mode可以是以下值的组合:R_OK

文件可以读;

W_OK

文件可以写;X_OK

文件可以执行;

F_OK

文件存在测试成功时,函数返回0;当有一项不符合时,返回-1。要获得文件的其他属性,我们可以使用函数stat

或者fstat。int

stat(const

char

*pathname,struct

stat

*

buf);int

fstat(int

filedes,

struct

stat

*

buf);返回的文件特性保存在类型为stat的结构体中(包含设备、

节点、模式、用户ID、组ID、文件字节数、最后一次访问、修改的时间等信息),参数buf指向该结构。在该结构中,我们感兴趣的成员之一是st_mode,它包含了文件类型和文件权限。目录文件的操作C库函数中提供了getcwd函数,可以得到当前工作路径。char

*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);//打开目录//读取目录//关闭目录其他函数int

unlink(const

char

*pathname);

//删除文件int

rmdir(const

char

*pathname);

//删除目录int

remove(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。五.时间概念时间毛表示宏和测捷量time_呀ttime(time_t*tloc);返回自1970年1月1日0点以来的秒数char*ctime骗(co君nsttime_t*clock)孤;将秒数馆转笼化成南字符串,例:SatDec3110:00:锄002005local弹time取得当地目前的时间和日期mkti手me将时间结构数据转换成经过嘉的秒数settimeof批day设置目前的时间gettimeofday取得目前的时间,可以用作时间的测量六.消息管理POSIX恭无名信号量用主要是伐用来享保护共享资源,使得资源在一接个时绳刻只鱼为一个进程所拥有颠。信号灯(semaphore)是进程间共享的资源计数器。intse狠m_init(兽sem_t*sem,intpshared,uns蚀ignedintvalue);int暴se凶m_destroy(完sem_t*sem);//删除信号灯intse骨m_wait(sem_t*se晚m);//阻塞廊进程,直到信号灯值大于0,返回时自动将信号灯的值减1int自se带m_post(sem_t*sem);//与sem_wait相反纲,将序信号灯的值加1,同时发出信号唤丹醒等待的进程int斤se望m_trywait(sem_t葡*sem);//与sem_wait相似,但不阻塞

int密se秧m_getvalue(sem_t*sem);//得到信号灯的值SystemV信号然量Syst辫emV的信最号量是信号量集,可以包括多个声信号灯,每个操作可以同时操作多个信号灯;POSIX是单撕个信号灯,

POSIX有名信号灯支持进程间通信,无是名信号灯放在共享跳内存中时可以用于进程间通信。七.线程操作线程线程是比进程传更小的能独立运行的基本单位。共享程序夜代码节省资源线程牧的创帐建和轿使用intpthr物ead_c熔reate(划pthre祝ad_t*thread衔,pthread_at幻玉tr_t*att沟r,voi符d*(*start_routine)(void*),void*arg泉);pthread_create创建一个线程,thread是用来表明创建线程的ID,attr指出线程创建时候趴的属性,峡我们用NULL来表明使用缺省属性。start_routine函数指针是线程创建成功后开始执行的函数,arg是这个函数的唯一一个参数,表明传递给start_routine结的参数。例:if(pt就hread雨_create(&m_threadID,NU步LL,ThreadQueryData,勿(void*thi元s)!=0约)if(蔑pt牺hr摆ead蚂_create(&Update墓Thr搬eadId杰,NULL,ThreadDown慌LoadBas顽eSchedule,(void*)this)!=矮0)if(迅pt厨hread洽_create(&SpanUpdate药Thr采eadId,NULL,ThreadUpdateS谨panT站imeT象ableToPlc,(void*)this未)!=0)voidpth涂read_exi懒t(等void*retval);intpthr椒ead_j撤oin(pt办hre妖ad*thr亦ead,void**thread_return);pthread_exi谈t函数和exit函数盘类似于,用来退出线程。这个函数结束线程,释放函数的烈资源,并在最后阻塞,直到其他线程使用pth旋read_join函数等待它,然后将*retval的值传递给**thread_return。*多线程中共同占蛇用某棵一资源时,注意信号剪锁机制奶。八.网络编程Linux雹网络知识介绍客户端程陷序和番服务端程序网络程序和普通的程序有一适个最稍大的区别是网络程序是由两个部分组成的—客户端和服务器端。网络程序是先有服务器程序液启动,等待客户端的程序运行并建立连接。一般的间来说季是服务端的程序在一个端口上监听,直到有一个客反户端最的程序发来了请求。常用的命令netstat锣显示辜网络的连接、路由表和接口等信锅息。tel萌net用于棚远程控制的程序,可以孙用来厦调试佛服务端程序。3.TCP删/UDP滴介绍TCP(TransferCon毙trolProtocol)传输控制协议是一种面向连接的协议,当我们的网亚络程议序使用这个协议的时

候,网络可以保证我们的客幕户端和服务端的连接是可靠的,安全的。UDP(UserDatagramProtocol)用户数据报协议是一种非面向连接的协议,这种协议话并不能保证我们的网络程序的连接是可靠的,所以我们从现在碍编写的程序一般是采用

TCP协议的。初等网络函数介绍(TCP)Socke篮t(套接字)套接字是一个通信端口,是一种使用标准UNI代X文件描述

字和其他程序通信的方法。从程序员的角度来看,它很象文件描述字,因为它同文件和管道一样使用write/read来读写数据。但是套接字和普通文件描述字又有不同:首先,套接字除了可以有一个地址以外,还明显包含着关于通信的3个属话性—域、类型和协议;其次,套接字的使用可以是非对称的,它通常明确的区

分通信的两个进程为客户进程和服务进程,并且允许不同系统或机器上的多个客户与单个服务相连;最后,套接字的创建和各种操作与文件描述字也有所不同。socket(创建套接字)intso阳cket(in臣tdomain,int站type,intpro邪tocol)你;domai没n:说明网络程序所在的主机采用的通信协议族(AF_UN干IX(UNIX域)和AF_INET(Internet域)等);ty聪pe:网络程序所采用的通讯协议(SOCK皮_STREAM、SOCK_DGRA叠M等),SOCK_STR高EAM表示侦我们使用的是

TCP协议,SOC鼓K_DGRAM表示我们使用乘的是UDP协议。pro粥toco杂l:TCP/UDP,由于已指定协议,这里塘设置为0。soc泰ket调用成功时,返回值为0;否则返回-1。例:skConnectSocket=socket(AF_INET,SOCK_D奔GRAM,0);bind(命名烂套接字)intbind(父intsockfd,structsockad泊dr*my田_addr,intadd使rl母en傻);sockfd:是由socket调用返回宅的文茄件描述符.my_addr:是一个指向结构类型sockaddr对象的指针,该对象包含了要指定给socket的地址。addlen:socketaddr结构对象的长度。函数调用成功时返回0,否则返回-1。list悉en(创建连接队列)intlisten(intsockf扩d,intbacklog);soc威kfd:是bind返回的文件描稻述符糕。backl丘og:设置请求排队割的最大长坏度。lis说ten函数将bind的文件描述符变为监听套接字,返回的情况和bind一样使。accept(创建新的面向特定客户的套接字)intac喘cept(in鲁tsockf址d,structso伪ckaddr*addr,int*addrlen);sockfd:是listen后的文件描述符。addr,addrlen缠是用来给客户端的程序填写的,服务器端只要传递指针就可以了。bi固nd、listen和accept服务器端用的函数,accept调用

时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。accep近t成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该带描述自符写信息了,失败时返回-1。connect(与服务器建立连接)int弃connect(intsockfd,structsockad饿dr*serv_addr,intaddrlen);sockfd:socket返回的、同服劳务端潜通讯的文件描述符。

serv_addr:储存了服务寨器端的连脖接信息。其中包含了服宵务端奴的地址。add曾rlen:serv_addr结构对象搜的长仁度。connect摧函数咐是客访户端用来同服务端连接苏的。枣成功炒时返回0,失扯败时返回-1。套接字连接示颗意图服务端客户端soc抓ke路t(伪)bi们nd(膝)阻塞直易到性收到锯来自客户的请数引据报lis尿te氧n丝式()soc惊ke备t(病)acc双ep扫t(酷)con普n树ect贴()wri烦te默()巧rea很d(记)进程请孤求rea壶d(驼)wri占te沈()仅rea绳d(种)clo盲se充()狂clo锅se艘()砍读写朗函数写函数writessize_twrite(intfd,淘constvoid*buf,size_tnbyt谷es);write函数将buf中的nbytes字节内容写入文件描述符

fd。成功时油返回栗写的字节数,失败时返回-1,并及设置errno变量。如果错误为EINTR,表示在写的时候黄出现了中断错误;如果为EPIPE,表示网络连接出现了问题(对方已经关闭了连接)。读函数readssize_tread(奸intfd,案void*buf,s项ize_tnbyte);read函数是负责从fd中读取内容。当读成功时,read返回实际所读的字节数,如举果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为

EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。数据的传递/*客户妥端向服务端写*/structmy_structmy_st免r抽uct_client;write(fd,(void*)&my_struct_c壶lient,幼sizeof(structmy权_struct);/*服务执端的读*/cha轿rbuffer[舱sizeof和(struc炒tmy静_struct)];struct*my_struct_server;rea头d(fd,(voi匠d*)buf胁fer,si渐zeof柴(s勇truc骨tmy_struct));my_st礼ruct_serve谜r=(structmy_str备uct*)狠buffer;用户数据报发送(UDP)委两个常用的函数intrecvfrom(intso鸭ckfd,void*buf,intlen,unsign盲edint障fl我ags列,s拉tr德u手ctso祥ckaddr*fr盘om,int*fromlen);intse督ndto(intsockfd,c架onstvoi膏d*msg,int刷len,unsignedintfl禁ags,纷structso夹ckaddr*to,int回tolen);sockfd,buf,肥l畏en的意义和read、write一样,分别表示套接字描述符、发送或接收的望缓冲景区及大小。recvfrom负

温馨提示

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

评论

0/150

提交评论