收藏 分享(赏)

Linux实验报告_大三上.doc

上传人:精品资料 文档编号:8502104 上传时间:2019-06-30 格式:DOC 页数:32 大小:229.07KB
下载 相关 举报
Linux实验报告_大三上.doc_第1页
第1页 / 共32页
Linux实验报告_大三上.doc_第2页
第2页 / 共32页
Linux实验报告_大三上.doc_第3页
第3页 / 共32页
Linux实验报告_大三上.doc_第4页
第4页 / 共32页
Linux实验报告_大三上.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、实验三 普通文件和目录编程1.编写程序mycp.c,实现从命令行读入文件的复制功能,用原始文件系统调用。实验流程图:判断输入main 函数参数个数argcargc!=3noExit(0)fd1=Open(argv1,O_RDONLY);fd2=open(argv2,O_RDWR|O_CREAT);1read(fd1,buf,bufsize);write(fd2,buf,i);if(i!=bufsize)break;实验程序代码:/mycp.c#include #include #include #include #define bufsize 5int main(int argc,char *

2、 argv)int fd1,fd2;int i;char bufbufsize;if(argc!=3)printf(“argument errorn“);exit(1);fd1=open(argv1,O_RDONLY);if(fd1=-1)printf(“file %s can not openedn“,argv1);exit(1);fd2=open(argv2,O_RDWR|O_CREAT);if(fd2=-1)printf(“Can not open file %sn“,argv2);exit(1);while(1)i=read(fd1,buf,bufsize);write(fd2,buf

3、,i);if(i!=bufsize) break;close(fd1);close(fd2);return 0;Linux环境下 运行情况如下:roadubuntu:/桌面/work$ gcc -o cp cp.croadubuntu:/桌面/work$ ./cpargument errorPlease use:cp file1 file2roadubuntu:/桌面/work$ ./cp a b其中,a为一文件, b为空文件。2.编写程序mycat.c ,实现文件内容的显示,用原始文件系统调用实现。实验流程图:No 重新输入命令行不等于1报错通过main 函数从键盘输入命令行Argc=2 ?

4、fd=open(argv1,O_RDONLY)while(num=read(fd,buffer,99)0)实验源代码如下:/mycat.c#include#include#include#include#includeint main(int argc,char* argv)int fd;char buffer100;int num;if(argc!=2)printf(“usage : %s filenamen“,argv0);return 1;if(fd=open(argv1,O_RDONLY)=-1)perror(“cannot open the file“);return 1;while

5、(num=read(fd,buffer,99)0)buffernum=0;printf(“%s“,buffer);close(fd);return 0;Linux环境下 运行情况如下:roadubuntu:/桌面/work$ gcc -o mycat mycat.croadubuntu:/桌面/work$ ./mycatbuffernum=0;printf(“%s“,buffer);usage : ./mycat filenameroadubuntu:/桌面/work$ ./mycat aiamroad!roadubuntu:/桌面/work$其中,a为一个文件名。3.1用流文件系统函数重新编

6、写上面的程序。实验流程图:不为3,提示用main命令输入命令行:fcp filename1 filename2argc!=3fd1=fopen(argv1,“r“);打开第一个文件读出数据fd2=fopen(argv2,“w“);打开第二个文件写入数据fread( fwrite(把第一个文件写入第二个文件关闭两个文件描述符用流文件写的文件复制功能函数:/fcp.c#include #include #include #include int main(int argc,char * argv)FILE *fd1,*fd2;char buffer20;if(argc!=3)printf(“arg

7、ument errorn“);printf(“usage : %s filename1 filename2n“,argv0);return 1;fd1=fopen(argv1,“r“);if(fd1=NULL)printf(“file %s can not openedn“,argv1);return 1;fd2=fopen(argv2,“w“);if(fd2=-1)printf(“Can not open file %sn“,argv2);return 1;while(!feof(fd1)fread(fwrite(fclose(fd1);fclose(fd2);return 0;运行情况如下

8、:roadubuntu:/桌面/work$ gcc -o fcp fcp.cfcp.c: In function main:fcp.c:25: warning: comparison between pointer and integerroadubuntu:/桌面/work$ ./fcp a b3.2用流文件编写显示函数:流程图:NO 重新输入Yes不满足条件用main函数键入命令行:myfcat filenameargc=2 ?fd1=fopen(argv1,“r“);打开文件以备读入数据while(!feof(fd1)fscanf(fd1,“%c“,printf(“%c“,buffer)

9、;显示文件内容关闭文件并退出源程序代码:/myfcat.c#include #include #include #include int main(int argc,char * argv)FILE *fd1;char buffer;if(argc!=2)printf(“argument errorn“);return 1;fd1=fopen(argv1,“r“);if(fd1=NULL)printf(“file %s can not openedn“,argv1);return 1;while(!feof(fd1)fscanf(fd1,“%c“,printf(“%c“,buffer);fcl

10、ose(fd1);return 0;运行情况如下:roadubuntu:/桌面/work$ gcc -o myfcat myfcat.croadubuntu:/桌面/work$ ./myfcat aiamroad!程序把文件a 的内容显示出来了: iamroad!4.调用目录函数,编写程序myls.c,实现按下面格式显示当前目录文件列表:文件名 文件大小 文件创建时间注意研究文件创建时间的转换,注意研究asctime()函数和ctime()函数的用法。流程图如下:dp!=NULL继续程序代码如下:/myls.c#include #include 用main函数输入命令行:mylsdp=open

11、dir(“./“);打开当前目录while(ep=readdir(dp)读出当前目录的文件stat(ep-d_name,获得详细信息puts(ep-d_name);stat(ep-d_name,printf(“%u “,dup.st_size);printf(“%s “,ctime(打印出文件名、文件大小、创建时间#include #include #include int main(void)DIR *dp;struct dirent *ep;struct stat dup;dp=opendir(“./“);if(dp!=NULL)while(ep = readdir(dp) puts(ep

12、-d_name);stat(ep-d_name,printf(“%u “,dup.st_size);printf(“%s “,ctime(closedir(dp);elseputs(“Couldnt open the directory .n“);return 0;运行结果:列出了当前目录的所有文件的名称、大小和创建时间roadubuntu:/桌面/work$ gcc -o myls myls.cmyls.c: In function main:myls.c:18: warning: format %u expects type unsigned int, but argument 2 has

13、 type _off_tmyls.c:19: warning: format %s expects type char *, but argument 2 has type introadubuntu:/桌面/work$ ./mylsserver2.c947 Sat Jan 9 17:25:42 2010pipol.c324 Fri Jan 8 22:47:21 2010newls.c498 Fri Jan 8 22:47:21 2010getip.c635 Fri Jan 8 22:38:40 2010network1.c1552 Sat Jan 9 15:28:09 2010server2

14、8493 Sat Jan 9 17:19:13 2010程序打印出了当前目录所有文件的名称、文件大小和创建时间。实验四 进程实验1. 编写程序,显示所有环境变量的名称和值。程序源代码:/environ.c#include#include#includeint main()char *ch;extern char*environ;ch=environ;while(*ch) printf(“%sn“,*ch);ch+;return 0;2. *编写程序,模仿讲义上的mysystem程序,实现输入命令的执行。流程图:用main函数输入命令行:mysystem shellpid=fork();创建进程

15、execl(SHELL,SHELL,“-c“,command,NULL);用Shell命令替换父进程waitpid(pid,pid_t pid;pid=fork();if(pid=0)execl(SHELL,SHELL,“-c“,command,NULL);_exit(EXIT_FAILURE);else if(pid#include#include#include#include#define FIFO_CHANNEL “./fifo_channel1“int main(int argc,char* argv)/创建命名管道if(mkfifo(FIFO_CHANNEL,0777)=-1)pe

16、rror(“cannot creat FIFO channel“);return 1;return 0;运行结果:用ls命令查看可知产生了 fifo_channel1 的管道。roadubuntu:/桌面/work$ gcc -o mk_fifo mk_fifo.croadubuntu:/桌面/work$ ./mk_fiforoadubuntu:/桌面/work$ lsa fifo_channel1 mycat myls.c netsever.c servera fmycat.c mycat.c myls.c netsever.c server2b getip.c mycat.c my_sg_

17、get network server2.cb getip.c myfcat my_sg_get.c network1 server2.cclose.c ipop.c myfcat.c my_sg_get.c network1.c server.ccp kill.c myfcat.c mysystem network1.c server.ccp.c ls.c myfifo.c mysystem.c network.c showev.ccp.c mk_fifo mykill mysystem.c network.c tcp k.txtfcp mk_fifo.c mykill.c netclt ne

18、wls.c tcp.txtfcp.c mk_fifo.c mykill.c netclt.c open.c write.cfcp.c my mylist.c netclt.c pipol.cfifo_channel my.c myls netsever read.c3.编写一个服务器程序server.c ,实现从管道myfifo中读取内容,并在终端中显示出来。打开一个命令行终端,运行server,然后打开另一个命令行终端,使用“cp 文件1 myfifo”命令把文件1的内容输出到myfifo,测试server.c的功能。程序流程图:失败提示失败提示失败提示用main函数输入命令行:server

19、mkfifo(FIFO_CHANNEL,0777)创建命名管道fd=open(FIFO_CHANNEL,O_RDONLY);打开管道读出数据read(fd,r_msg,BUFSIZ)读出数据到缓存printf(“Receive message from FIFO: %sn“,r_msg);打印输出程序源代码:/server.c#include#include#include#include#include#define FIFO_CHANNEL “./fifo_channel4“int main(int argc,char* argv)int fd;char r_msgBUFSIZ;/创建命名

20、管道if(mkfifo(FIFO_CHANNEL,0777)=-1)perror(“cannot creat FIFO channel“);return 1;/打开管道读出数据fd=open(FIFO_CHANNEL,O_RDONLY);if(fd=-1)perror(“cannot open the FIFO“);if(read(fd,r_msg,BUFSIZ)=-1)perror(“process cannot read data from FIFO“);return 1;elseprintf(“Receive message from FIFO: %sn“,r_msg);return 0

21、;运行结果:在一个终端中运行server客户端程序。roadubuntu:/桌面/work$ gcc -o server server.cRoadubuntu:/桌面/work$ ./server等待重新打开一个终端输入命令,将文件a的内容写到fifo_channel4 管道中:roadubuntu:/桌面/work$ cp a fifo_channel4则上面相应的等待处将出现文件a中的内容:Receive message from FIFO: iamroad!4.编写客户机程序,实现把指定文件输出到myfifo的功能,从而实现和服务器程序的通信。测试该程序的功能。程序流程图:不等重新输入不

22、满足提示不满足提示不满足提示用main函数提示输入命令行:server2 filenameargc=2 ?mkfifo(FIFO_CHANNEL,0777)创建命名管道fd=open(FIFO_CHANNEL,O_WRONLY);打开管道等着写入数据fd1=open(argv1,O_RDONLY)打开要写入管道的文件不满足提示程序源代码:/server2.c#include#include#include#include#include#define FIFO_CHANNEL “./fifo_channel4“int main(int argc,char* argv)int fd,fd1;in

23、t num;char r_msgBUFSIZ;char buffernum;if(argc!=2)printf(“Command: %s filenamen“,argv0);return 1;/write the message to the FIFO/创建命名管道/ if(mkfifo(FIFO_CHANNEL,0777)=-1)/ / perror(“cannot creat FIFO channel“);/ return 1;/ /打开命名管道写入数据fd=open(FIFO_CHANNEL,O_WRONLY);if(fd=-1)write(fd,buffer,num)向管道中写入数据p

24、error(“cannot open the FIFO“);/打开要写入的文件if(fd1=open(argv1,O_RDONLY)=-1)perror(“cannot open the filen“);return 1;num=read(fd1,buffer,99);buffernum=0;/向管道中写入数据if(write(fd,buffer,num)=-1)perror(“process cannot write data to FIFO“);return 1;elseprintf(“send message: %sn“,buffer);return 0;注意,上面的程序中的加绿部分,如

25、果上面得server程序已经创建过相关的管道,则次部分将不需要;如果上面的server没有创建该管道,则需要。执行的情况如下:首先打开一个终端,运行server客户端,运行之后它会等待用户向管道写入数据,然后打印出来。roadubuntu:/桌面/work$ gcc -o server server.croadubuntu:/桌面/work$ ./server等待。重新打开一个终端,运行server2程序,运行可执行文件后,server2下将出现:send message: iamroad!语句。roadubuntu:/桌面/work$ gcc -o server2 server2.croad

26、ubuntu:/桌面/work$ ./server2 asend message: iamroad!server下的等待处将出现下列语句。Receive message from FIFO: iamroad!实验六 信号实验1.研究kill命令,掌握通过kill命令发送信号的方法。先在终端中用:ps a 命令查看当前的进程。roadubuntu:/桌面/work$ ps aPID TTY STAT TIME COMMAND1121 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty41123 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty

27、51135 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty21136 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty31138 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty61270 tty7 Ss+ 2:08 /usr/bin/X :0 -br -verbose -auth /var/run/gdm/auth-fo1593 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty12193 pts/0 Ss 0:00 bash2223 pts/1 Ss+ 0:00 bash3261

28、 pts/1 T 0:00 ./server2 a3346 pts/0 R+ 0:00 ps a接着用:kill -9 3261命令发送就一个杀死进程的信号将3261进程杀死。roadubuntu:/桌面/work$ kill -9 3261roadubuntu:/桌面/work$ pe ape: command not found重新查看进程,发现3261进程已被杀死。roadubuntu:/桌面/work$ ps aPID TTY STAT TIME COMMAND1121 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty41123 tty5 Ss+ 0:00

29、/sbin/getty -8 38400 tty51135 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty21136 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty31138 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty61270 tty7 Rs+ 2:08 /usr/bin/X :0 -br -verbose -auth /var/run/gdm/auth-fo1593 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty12193 pts/0 Ss 0:00 bash2223

30、 pts/1 Ss+ 0:00 bash3349 pts/0 R+ 0:00 ps a2.编写程序,通过定义信号处理函数来截获user消息。在消息处理函数中,设置标志变量,而主程序中通过系统调用pause()等待消息,如果消息是 user,则在终端窗口上显示信息。打开命令行窗口,运行这个程序。打开另一个命令行窗口,通过ps命令获得2中程序的进程号,用 kill命令给该进程发送user消息,观察其输出。程序流程图:错误提示用main函数提示输入命令行:my_sg_getsignal(SIGUSR1,sigusr1)信号处理函数void sigusr1(int sig)k=1;printf(“go

31、t the SIGUSR1 signal.nlabel is:%dn“,k);exit(0);打印获得信号的提示语句和标志变量的值便于比较。printf(“Waitting signal from user1.nlabel is:%dn“,k);打印等待信号提示语句和标志变量的初值程序源代码:/my_sg_get.c#include#include#include#include volatile sig_atomic_t k =0;void sigusr1(int sig)k=1;printf(“got the SIGUSR1 signal.nlabel is:%dn“,k);exit(0)

32、;int main(void)printf(“Waitting signal from user1.nlabel is:%dn“,k);if(signal(SIGUSR1,sigusr1)=SIG_ERR)perror(“cannot reset the SIGUSR1 signal handler“);return 1;pause();return 0;运行结果:在终端中运行my_sg_get信号处理程序,运行后将出现:pause();等待信号到来Waitting signal from user1.label is:0两条提示语句,提示等待信号到来和标识变量的值0.roadubuntu:/

33、桌面/work$ gcc -o my_sg_get my_sg_get.croadubuntu:/桌面/work$ ./my_sg_getWaitting signal from user1.label is:0打开一个新的终端,用:ps a命令查看该信号处理函数的进程号。roadubuntu:/桌面/work$ ps aPID TTY STAT TIME COMMAND1121 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty41123 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty51135 tty2 Ss+ 0:00 /sbin/

34、getty -8 38400 tty21136 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty31138 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty61270 tty7 Ss+ 2:24 /usr/bin/X :0 -br -verbose -auth /var/run/gdm/auth-fo1593 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty12193 pts/0 Ss 0:00 bash2223 pts/1 Ss 0:00 bash3406 pts/1 S+ 0:00 ./my_sg_get3

35、417 pts/0 R+ 0:00 ps a用:kill -SIGUSR1 -3406给my_sg_get信号处理程序发送SIGUSR1信号。roadubuntu:/桌面/work$ kill -SIGUSR1 -3406相应的my_sg_get信号处理程序下将出现:got the SIGUSR1 signal.label is:1提示获得了该信号,并且处理了,将标识变量变为了1.roadubuntu:/桌面/work$ ./my_sg_getWaitting signal from user1.label is:0got the SIGUSR1 signal.label is:1实验七 域名

36、解析实验1.研究nslookup命令的用法,并通过该命令获得常用的著名网络服务器的ip地址。在终端中输入 :nslookup 将获得相关的主机名和IP地址。roadubuntu:/桌面/work$ nslookup Server: 202.106.0.20Address: 202.106.0.20#53Non-authoritative answer: canonical name = .Name: Address: 202.108.22.141Name: Address: 202.108.22.52.编写程序,从命令行读入任意域名,解析出相关的ip 指针和别名等,并和上面的结果进行比较。实验

37、流程图:NO 重新输入不满足提示int main(int argc, char *argv)键入命令行:getip 域名argc=2 ?gethostbyname(argv1)获得域名信息herror(“gethostbyname“);提示并退出进程 exit(1);printf(“Host name : %sn“, h-h_name);printf(“Host aliases : %sn“,h-h_aliases);printf(“IP Address: %sn“,inet_ntoa(*(struct in_addr *)h-h_addr);打印主机名、别名和IP地址程序源代码:/getip

38、.c/ getip.c - a hostname lookup demo#include #include #include #include #include #include #include #include int main(int argc, char *argv)struct hostent *h;if (argc != 2) fprintf(stderr,“usage: getip addressn“);exit(1);if (h=gethostbyname(argv1) = NULL) / get the host infoherror(“gethostbyname“);exi

39、t(1);printf(“Host name : %sn“, h-h_name);printf(“Host aliases : %sn“,h-h_aliases);printf(“IP Address: %sn“,inet_ntoa(*(struct in_addr *)h-h_addr);return 0;运行结果:运行:getip可执行文件。运行查看的信息。roadubuntu:/桌面/work$ gcc -o getip getip.croadubuntu:/桌面/work$ ./getip Host name : Host aliases : IP Address: 202.108.2

40、2.141实验八 网络服务器和客户机1.编写一个网络服务器程序server.c ,实现打开TCP 端口5000,并监听该端口,如果有连接发生,接收每一行输入,并加入“you said:”字符串后原样输出。打开一个终端窗口,运行该程序。2.用telnet程序测试。从新打开另一个终端窗口,用telnet 程序连接该服务器,通过观察输入和输出验证服务器程序的功能。程序流程图:NO重新输入不满足提示int main(int argc,char *argv)输入命令行:net_sev 端口号argc=2 ?listen_fd = socket(PF_INET, SOCK_STREAM, 0);创建套接字

41、用于服务器的监听bind(listen_fd, (struct sockaddr *)将服务器与端口绑定memset(srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);srv_addr.sin_port=htons(port);参数设置不满足提示不满足提示程序源代码:/net_sev.c#include #include #include #include #include #include #include #include #include int main(int argc,char *

42、argv)int listen_fd;int ret;int len;int comfd;int num;int port;static char recv_buf1024;struct sockaddr_in srv_addr;accept(listen_fd,(struct sockaddr*)与服务器连接printf(“n=information from client=n“);memset(recv_buf,0,1024);num=read(comfd,recv_buf,sizeof(recv_buf);printf(“You said: %s“,recv_buf);打印客户端输入的字

43、符struct sockaddr_in clt_addr;if(argc!=2)printf(“Usage: %s portn“,argv0);return 1;port=atoi(argv1);listen_fd = socket(PF_INET, SOCK_STREAM, 0);if(listen_fd0)perror(“cannot creat listening socket“);return 1;memset(srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);srv_addr.sin

44、_port=htons(port);ret=bind(listen_fd, (struct sockaddr *)if(ret=-1)perror(“cannot bind server socket“);close(listen_fd);return 1;ret=listen(listen_fd,1);if(ret=-1)perror(“cannot listen the client connect request“);close(listen_fd);return 1;len=sizeof(clt_addr);comfd=accept(listen_fd,(struct sockaddr*)if(comfd0)perror(“cannot accept the client connect request“);

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报