Linux课程设计Linux环境下C语言程序设计.doc

上传人:laozhun 文档编号:2385022 上传时间:2023-02-17 格式:DOC 页数:20 大小:271KB
返回 下载 相关 举报
Linux课程设计Linux环境下C语言程序设计.doc_第1页
第1页 / 共20页
Linux课程设计Linux环境下C语言程序设计.doc_第2页
第2页 / 共20页
Linux课程设计Linux环境下C语言程序设计.doc_第3页
第3页 / 共20页
Linux课程设计Linux环境下C语言程序设计.doc_第4页
第4页 / 共20页
Linux课程设计Linux环境下C语言程序设计.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《Linux课程设计Linux环境下C语言程序设计.doc》由会员分享,可在线阅读,更多相关《Linux课程设计Linux环境下C语言程序设计.doc(20页珍藏版)》请在三一办公上搜索。

1、 课程设计报告课程名称 系统软件实践 设计题目 Linux环境下C语言程序设计 专业、班级 软件0802 学 号 080203051 2010 年 10 月 6日一、 引言(简要说明设计题目的目的、意义、内容、主要任务等)1. 目的1) 巩固和复习c语言的基础知识,进一步加深对c语言的理解和掌握2) 课程设计提供了一个既动脑又动手,独立实践的机会,将课本上得理论知识和实际3) 有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的4) 能力;5) 熟悉linux的基本操作,并且能够在linux环境下编写c语言程序、6) 培养在项目开发中团队合作精神,创新意识及能力2.

2、意义1) 综合应用c程序设计课程的理论基础和知识,掌握程序设计的一般方法,树立正 确的设计思想,培养了分析问题和解决问题的能力2) 学会了从实际的要求出发,合理的选择算法,正确的使用测试方法,培养了程序设计能力3) 学会运用帮助和查阅有关技术资料的能力。3. 内容 程序一:制作一个可供小学数学运算的程序:10以内加减法,能根据输入题数出题,判断题是否正确,最后计算分数。例如:请输入题数:21+5=2+4=由用户输入答案,程序根据答案判断正误,输出正确率(%)。并用make工程管理器编译。(注意分割文件,可参考第一题的提示。)编写makefile文件。 程序二:设计一个程序,要求新建一个文件“h

3、ello”,利用write函数将“Linux下c软件设计”字符串写入该文件。 程序三: 利用命名管道实现两个进程间的通信。 程序四: 服务器通过socket连接后,向客户端发送字符串“连接上了”。在服务器上显示客户端的IP地址或域名。4. 主要任务1) 分析题目的要求,2) 总结各个程序所涉及的相关知识点3) 各种算法的涉及4) 画出部分模块的流程图5) 程序代码的设计与实现二、 正文(课程设计的主要内容,包括实验与观测方法和结果、仪器设备、计算方法、编程原理、数据处理、设计说明与依据、加工整理和图表、形成的论点和导出的结论等。正文内容必须实事求是、客观真切、准确完备、合乎逻辑、层次分明、语言

4、流畅、结构严谨,符合各学科、专业的有关要求。)程序一: 流程图: 开始a=rand()%10b=rand()%10unsigned time time=0Srand(time)a+b=,判断正误给出正确答案x=rand()%2x=rand()%2a-b=,判断正误给出正确答案a+b=,判断正误给出正确答案a-b=,判断正误给出正确答案输出测试相关结果goto语句实现是否循环ab成立不成立 源代码: start.c文件: 该文件主要处理算法和逻辑,学生开始答题,运算逻辑的和结果 以及答题结果。#include #include void print_random(int count, int *

5、a) int ii = 1; int i=*a; a+; int j=*a; a+; int c; int total=0; int d=0; int ok = 0; printf(本题库中只有%d题,请认真答题,每题5分n,count); while(1) printf(第%d题:, ii); printf(%d , i); printf(+); printf(%d , j); printf(=?); printf(n); printf(请您输入结果:); scanf(%d,&c); d=i+j; if(c=d) printf(正确n);ok+; total+=5; elseprintf(错

6、误%dn,d); total+=0; if(ii=count) break; ii+; i=*a;a+; j=*a;a+; d=0; printf(正确率为:%dn,ok*100/count); printf(您最后的总分是:%d,total); printf(n); main.c 文件: 该文件主要包含主函数,逻辑的控制,以及学生确定题的数量 还包括生成题库的函数。 #include #include void gen_random(int count,int *a) int i; for (i = 0; i count*2; i+) *a = rand() % 10;a+;int main

7、(void)printf(请您输入数量:);int c; scanf(%d,&c);int a200; gen_random(c,a);printf(%d,a2); print_random(c,a); return 0; Makefile文件:main:start.o main.ogcc start.o main.o -o xxlxisDelta.o:start.cgcc start.c -cmain.o:main.cgcc main.c -c 运行结果图:程序二: 程序描述:此程序主要实现了文件的打开,关闭,读取和写入。1. creat 函数 creat 的作用是在目录中建立一个空文件,该

8、函数的使用方法如下所示。 int creat(char * pathname, mode_t mode); 函数的参数 pathname 表示需要建立文件的文件名和目录名,mode 表示这个文件的权限。文件权限的设置见本章第一节所述。文件创建成功时返回创建文件的编号,否则返回-1。 使用这个函数时,需要在程序的前面包含下面三个头文件。 #include #include #include 如果创建文件不成功,可用 errno 捕获错误编号然后输出。creat 函数可能发生的错误如下所示。 EEXIST:参数 pathname 所指的文件已存在。 EACCESS:参数 pathname 所指定的

9、文件不符合所要求测试的权限。 EROFS:欲打开写入权限的文件存在于只读文件系统内。 EFAULT:参数 pathname 指针超出可存取的内存空间。 EINVAL:参数 mode 不正确。 ENAMETOOLONG:参数 pathname 太长。 ENOTDIR:参数 pathname 为一目录。 ENOMEM:核心内存不足。 ELOOP:参数 pathname 有过多符号链接问题。 EMFILE:已达到进程可同时打开的文件数上限。2. open 函数 open 的作用是打开一个文件,使文件处于可读写的状态。这个函数的使用方法如下所示。 int open(char *pathname, in

10、t flags); int open(char *pathname,int flags, mode_t mode); 在上一节所示函数的参数列表中,pathname 表示要打开文件的路径字符串。参数 flags是系统定义的一些整型常数,表示文件的打开方式。Flags 的可选值如下所示。 O_RDONLY:以只读方式打开文件。 O_WRONLY:以只写方式打开文件。 O_RDWR:以可读写方式打开文件。 上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用“|”运算符组合。 O_CREAT:若要打开的文件不存在则自动建立该文件。 O_EXCL:如果 O_CREAT 已被设置,此指令会去

11、检查文件是否存在。文件若不存 在 则建立该文件,否则将导致打开文件错误。此外,若 O_CREAT 与 O_EXCL 同时设置 时,如果要打开的文件为一个链接,则会打开失败。 O_NOCTTY:如果要打开的文件为终端机设备时,则不会将该终端机当成进程控制终 端机。 O_TRUNC:若文件存在并且以可写的方式打开时,此标志会清空文件。这样原来的文件内容会丢失。 O_APPEND:以附加的文件打开文件。当读写文件时会从文件尾开始向后移动,写入的数据会以附加的方式加入到文件后面。 O_NONBLOCK:以不可阻断的方式打开文件,也就是无论文件有无数据读取或等待操作,都会立即打开文件。 O_NDELAY

12、:O_NONBLOCK。 #include O_SYNC:以同步的方式打开文件,所有的文件操作不写入到缓存。 O_NOFOLLOW:如果参数 pathname 所指的文件为一符号链接,则会打开失败。 O_DIRECTORY:如果参数 pathname 所指的文件的目录不存在,则打开文件失败。3. wirte 函数 write 可以把一个字符串写入到一个已经打开的文件中。这个函数的使用方法如下所示。ssize_t write (int fd,void * buf,size_t count);在参数列表中,fd 是已经打开文件的文件号,buf 是需要写入的字符串,count 是一个整型数,表示需要

13、写入的字符个数。size_t 是一个相当于整型的数据类型,表示需要写入的字节的数目。将字符串写入文件以后,文件的写位置也会随之移动。如果写入成功,write 函数会返回实际写入的字节数。发生错误发生时则返回-1,可以用errno 来捕获发生的错误。可能发生的错误如下所示。 EINTR:此操作被其他操作中断。 EAGAIN:当前打开文件是不可写的方式打开的,不能写入文件。 EADF:参数 fd 不是有效的文件编号,或该文件已关闭。代码解析:#include #include #include #include /*包含头文件。*/#include main() /*定义打开的文件号。*/ int

14、 fd; /*定义要写入文件的路径*/ char path=hello; char s=Linux下c软件设计; /*定义要写入的字符串。*/ /*使用错误号。*/ extern int errno;1) /*用 creat 函数创建一个文件*/if(creat(path,0766)=-1) /*不能创建文件。*/ printf(cantt create the file %s.n,path); printf(errno:%dn,errno); /*显示错误号。*/ printf(ERR :%sn,strerror(errno); /*显示错误信息。*/ /*另一种情况。*/else /*显示

15、创建成功。*/ printf(created file %s.n,path); /*打开文件。*/ fd=open(path,O_WRONLY|O_CREAT); /*打开文件是否成功。*/ if(fd!=-1) /*文件打开成功。*/ printf(opened file %s .n,path); else /*文件打开不成功。*/ printf(cantt open file %s.n,path); printf(errno:%dn,errno); /*显示错误号。*/ printf(ERR :%sn,strerror(errno); /*显示错误信息。*/ /*将内容写入到文件。*/ w

16、rite(fd,s,sizeof(s); /*关闭文件。*/ close(fd); /*显示信息。*/ pintf(Done); 程序运行结果图: 程序三: 程序描述:主要完成进程的应用,实现进程间的通信问题 #include #include #include #include int main() int pipe_fd2; pid_t pid; char r_buf4; char* w_buf256; int childexit=0; int i; int cmd; memset(r_buf,0,sizeof(r_buf); if(pipe(pipe_fd)0) /parent: sen

17、d commands to child close(pipe_fd0); w_buf0=003; w_buf1=005; w_buf2=777; w_buf3=000; for(i=0;i4;i+) write(pipe_fd1,w_bufi,4); close(pipe_fd1); return 0;/下面是子进程的命令处理函数(特定于应用):int handle_cmd(int cmd)if(cmd256)/suppose child only support 256 commands printf(child: invalid command n); return -1; printf(

18、child: the cmd from parent is %dn, cmd);return 0; 程序运行结果图: 程序四: 方法描述:请求连接函数 connet所谓请求连接,指的是客户机向服务器发送信息时,需要发送一个连接请求。connect 函数可以完成这项功能,这个函数的使用方法如下所示。int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);在参数列表中,sockfd 表示已经建立的 socket,serv_addr 是一个结构体指针,指向一个sockaddr 结构体,这个结构体存储着远程服务器的 IP 与端口

19、信息,Addrlen 表示 sockaddr 结构体的内存长度,可以用 sizeof 函数来获取。sockaddr 结构体的定义见前面节中的 bind 函数所述。函数会将本地的 socket 连接到 serv_addr 所指定的服务器 IP 与端口。如果连接成功,返回值为 0,连接失败则返回-1。函数可能发生下面的错误,可以用 error 来捕获发生的错误。EBADF:参数 sockfd 不是一个合法的 socket。EFAULT:参数 serv_addr 指针指向了一个无法读取的内存空间。ENOTSOCK:参数 sockfd 是文件描述词,而不是一个正常的 socket。EISCONN:参数

20、 sockfd 的 socket 已经处于连接状态。ECONNREFUSED:连接要求被服务器拒绝。ETIMEDOUT:需要的连接操作超过限定时间仍未得到响应。ENETUNREACH:无法传送数据包至指定的主机。EAFNOSUPPORT:sockaddr 结构的 sa_family 不正确。EALREADY:socket 不能阻断,但是以前的连接操作还未完成。如果需要使用这个函数,需要在程序的最前面包含下面的头文件。#include#include数据接收函数 recv函数 recv 可以接收远程主机发送来的数据,并把这些数据保存到一个数组中。该函数的使用方法如下所示。int recv(int

21、 s,void *buf,int len,unsigned int flags);在参数列表中,s 表示已经建立的 socket,buf 是一个指针,指向一个数组,接收到的数据会保存到这个数组上,len 表示数组的长度,可以用 sizeof 函数来取得,flags 一般设置为 0,其他可能的赋值与含义如下所示。MSG_OOB:接收以 out-of-band 送出的数据。MSG_PEEK:返回来的数据并不会在系统内删除,如果再调用 recv 时会返回相同的数据内容。MSG_WAITALL:强迫接收到 len 大小的数据后才能返回,除非有错误或信号产生。MSG_NOSIGNAL:此操作被 SIGP

22、IPE 信号中断。recv 函数如果接收到数据,会把这些数据保存在 buf 指针指向的内存中,然后返回接收到字符的个数。如果发生错误则会返回-1。函数可能发生下面这些错误,可以用 errno 来捕获错误。EBADF:参数 s 不是一个合法的 socket。EFAULT:参数中的指针指向了无法读取的内存空间。ENOTSOCK:参数 s 是文件描述词,而不是一个 socket。EINTR:被信号中断。EAGAIN:此动作会阻断进程,但参数 s 的 socket 不可阻断。ENOBUFS:系统的缓冲内存不足。ENOMEM:核心内存不足EINVAL:参数不正确。使用这个函数前,需要在程序的最前面包含下

23、面的头文件。#include #include 信息发送函数 send用 connect 函数连接到远程计算机以后,可以用 send 函数将信息发送到对方的计算机。这个函数的使用方法如下所示。int send(int s,const void * msg,int len,unsigned int flags);在参数列表中,s 表示已经建立的 socket,msg 是需要发送数据的指针,len 表示需要发送数据的长度。这个长度可以用 sizeof 函数来取得,参数 flags 一般设置为 0,可能的赋值与含义如下所示。 MSG_OOB:传送的数据以 out-of-band 的方式送出。 MSG

24、_DONTROUTE:取消路由表查询。 MSG_DONTWAIT:设置为不可阻断传输。 MSG_NOSIGNAL:此传输不可被 SIGPIPE 信号中断。如果发送数据成功,函数会返回已经传送的字符个数,否则会返回-1。函数可能发生下面这些错误,可以用 errno 来捕获函数的错误。EBADF:参数 s 不是一个正确的 socket。 EFAULT:参数中的指针指向了不可读取的内存空间。 ENOTSOCK:参数 s 是一个文件,而不是一个 socket。 EINTR:被信号中断。 EAGAIN:此操作会中断进程,但 socket 不允许中断。 ENOBUFS:系统的缓冲内存不足。 ENOMEM:

25、核心内存不足。 EINVAL:传给系统调用的参数不正确。 在使用这个函数前,需要在程序的最前面包含下面的头文件。 socket在进行网络连接前,需要用 socket 函数向系统申请一个通信端口。这个函数的使用方法如下所示。int socket(int domain, int type, int protocol);在参数表表中,domain 指定使用何种的地址类型,可能的值是下面这些系统常量。 PF_UNIX,PF_LOCAL,AF_UNIX,AF_LOCAL:这些是 UNIX 进程通信协议。 PF_INET,AF_INET:Ipv4 网络协议。 PF_INET6,AF_INET6:Ipv6

26、网络协议。 PF_IPX,AF_IPX:IPX-Novell 协议。 PF_NETLINK,AF_NETLINK:核心用户接口装置。 PF_X25,AF_X25、ITU-T X.25:ISO-8208 协议。 PF_AX25,AF_AX25:业余无线 AX.25 协议。 PF_ATMPVC,AF_ATMPVC:存取原始 ATM PVCs。 PF_APPLETALK,AF_APPLETALK:DDP 网络协议。 PF_PACKET,AF_PACKET:初级封包接口。 type 参数的作用是设置通信的协议类型,可能的取值如下所示。 SOCK_STREAM:提供面向连接的稳定数据传输,即 TCP 协

27、议。 OOB:在所有数据传送前必须使用 connect()来建立连线状态。 SOCK_DGRAM:使用不连续不可靠的数据包连接。 SOCK_SEQPACKET:提供连续可靠的数据包连接。 SOCK_RAW:提供原始网络协议存取。 SOCK_RDM:提供可靠的数据包连接。 SOCK_PACKET:与网络驱动程序直接通信。参数 protocol 用来指定 socket 所使用的传输协议编号。这一参数通常不具体设置,一般Linux 系统下 C 程序开发详解设置为 0 即可。在使用这个函数建立套接字前,需要在程序的最前面包含下面的头文件。 #include #include 如果建立套接字成功,则返回

28、这个套接字的编号。如果不成功,则返回-1。这个函数可能发生的错误如下所示。EPROTONOSUPPORT:参数 domain 指定的类型不支持参数 type 或 protocol 指定的协议。 ENFILE:核心内存不足,无法建立新的 socket 结构。 EMFILE:进程文件表溢出,无法再建立新的套接字。 EACCESS :权限不足,无法建立 type 或 protocol 指定的协议。 ENOBUFS、ENOMEM:内存不足。 EINVAL:参数不合法。 程序描述:实现网络通信,通过套接字实现服务器端和客户端的链接,以及实现传送数据。服务器端:#include #include #inc

29、lude #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */#define BACKLOG 10 /* 最大同时连接请求数 */int main()int sock_fd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */socklen_t sin_size;struct sockaddr_in my_addr; /* 本机地址信息 */struct sockaddr_in remote_add

30、r; /* 客户端地址信息 */if(sock_fd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket创建出错!); exit(1);my_addr.sin_family=AF_INET;my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) = -1)

31、 perror(bind出错!); exit(1); if(listen(sock_fd, BACKLOG) = -1) perror(listen出错!); exit(1); while(1) sin_size = sizeof(struct sockaddr_in);if(client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size) = -1) perror(accept出错);continue; printf(received a connection from %sn,inet_ntoa(remote_a

32、ddr.sin_addr); if(!fork() /* 子进程代码段 */ if(send(client_fd, Hello, you are connected!n, 26, 0) = -1) perror(send出错!); close(client_fd); exit(0); close(client_fd); return 0; 客户端: #include #include #include #include #include #include #include #include #include #define SERVPORT 3333#define MAXDATASIZE 10

33、0 /*每次最大数据传输量 */int main(int argc, char *argv) int sock_fd, recvbytes; char bufMAXDATASIZE; struct hostent *host; struct sockaddr_in serv_addr; if(argch_addr); bzero(&(serv_addr.sin_zero),8); if(connect(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr) =-1) perror(connect出错!); exit(1); if(recvbytes=recv(sock_f

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号