linux实验报告_大三上Word格式.doc
《linux实验报告_大三上Word格式.doc》由会员分享,可在线阅读,更多相关《linux实验报告_大三上Word格式.doc(32页珍藏版)》请在冰点文库上搜索。
exit
(1);
}
fd1=open(argv[1],O_RDONLY);
if(fd1==-1)
file%scannotopened\n"
argv[1]);
exit
(1);
}
fd2=open(argv[2],O_RDWR|O_CREAT);
if(fd2==-1)
Cannotopenfile%s\n"
argv[2]);
while
(1)
i=read(fd1,buf,bufsize);
write(fd2,buf,i);
if(i!
=bufsize)break;
close(fd1);
close(fd2);
return0;
Linux环境下运行情况如下:
road@ubuntu:
~/桌面/work$gcc-ocpcp.c
~/桌面/work$./cp
argumenterror
Pleaseuse:
cpfile1file2
~/桌面/work$./cpab
其中,a为一文件,b为空文件。
2.编写程序mycat.c,实现文件内容的显示,用原始文件系统调用实现。
通过main函数从键盘输入命令行
Argc=2?
No重新输入命令行
fd=open(argv[1],O_RDONLY)
不等于1报错
while((num=read(fd,buffer,99))>
0)
buffer[num]='
\0'
;
printf("
%s"
buffer);
实验源代码如下:
//mycat.c
#include<
unistd.h>
intmain(intargc,char*argv[])
intfd;
charbuffer[100];
intnum;
if(argc!
=2)
{
printf("
usage:
%sfilename\n"
argv[0]);
return1;
}
if((fd=open(argv[1],O_RDONLY))==-1)
perror("
cannotopenthefile"
while((num=read(fd,buffer,99))>
buffer[num]='
close(fd);
return0;
~/桌面/work$gcc-omycatmycat.c
~/桌面/work$./mycat
./mycatfilename
~/桌面/work$./mycata
iamroad!
!
~/桌面/work$
其中,a为一个文件名。
3.1用流文件系统函数重新编写上面的程序。
用main命令输入命令行:
fcpfilename1filename2
不为3,提示
fd1=fopen(argv[1],"
r"
打开第一个文件读出数据
fd2=fopen(argv[2],"
w"
打开第二个文件写入数据
fread(&
buffer,sizeof(char),1,fd1);
fwrite(&
buffer,sizeof(char),1,fd2);
把第一个文件写入第二个文件
关闭两个文件描述符
用流文件写的文件复制功能函数:
//fcp.c
FILE*fd1,*fd2;
charbuffer[20];
{
printf("
%sfilename1filename2\n"
return1;
}
fd1=fopen(argv[1],"
if(fd1==NULL)
printf("
return1;
fd2=fopen(argv[2],"
return1;
while(!
feof(fd1))
fread(&
}
fclose(fd1);
fclose(fd2);
return0;
运行情况如下:
~/桌面/work$gcc-ofcpfcp.c
fcp.c:
Infunction‘main’:
25:
warning:
comparisonbetweenpointerandinteger
~/桌面/work$./fcpab
3.2用流文件编写显示函数:
流程图:
用main函数键入命令行:
myfcatfilename
argc=2?
NO
重新输入
Yes
打开文件以备读入数据
while(!
不满足条件
fscanf(fd1,"
%c"
&
buffer);
显示文件内容
关闭文件并退出
源程序代码:
//myfcat.c
FILE*fd1;
charbuffer;
printf("
return1;
printf("
return1;
fscanf(fd1,"
fclose(fd1);
~/桌面/work$gcc-omyfcatmyfcat.c
~/桌面/work$./myfcata
程序把文件a的内容显示出来了:
4.调用目录函数,编写程序myls.c,实现按下面格式显示当前目录文件列表:
文件名 文件大小文件创建时间
注意研究文件创建时间的转换,注意研究asctime()函数和ctime()函数的用法。
流程图如下:
用main函数输入命令行:
myls
dp=opendir("
./"
打开当前目录
dp!
=NULL
继续
while(ep=readdir(dp))
读出当前目录的文件
stat(ep->
d_name,&
dup);
获得详细信息
puts(ep->
d_name);
%u"
dup.st_size);
%s"
ctime(&
dup.st_atime));
打印出文件名、文件大小、创建时间
程序代码如下:
//myls.c
stddef.h>
dirent.h>
intmain(void)
DIR*dp;
structdirent*ep;
structstatdup;
dp=opendir("
if(dp!
=NULL)
{
while(ep=readdir(dp))
{puts(ep->
stat(ep->
printf("
}
closedir(dp);
else
puts("
Couldn'
topenthedirectory.\n"
return0;
运行结果:
列出了当前目录的所有文件的名称、大小和创建时间
~/桌面/work$gcc-omylsmyls.c
myls.c:
18:
format‘%u’expectstype‘unsignedint’,butargument2hastype‘__off_t’
19:
format‘%s’expectstype‘char*’,butargument2hastype‘int’
~/桌面/work$./myls
server2.c~
947SatJan917:
422010
pipol.c
324FriJan822:
47:
212010
newls.c
498FriJan822:
getip.c~
635FriJan822:
38:
402010
network1.c
1552SatJan915:
28:
092010
server2
8493SatJan917:
132010
程序打印出了当前目录所有文件的名称、文件大小和创建时间。
实验四进程实验
1.编写程序,显示所有环境变量的名称和值。
程序源代码:
//environ.c
stdlib.h>
intmain()
char**ch;
externchar**environ;
ch=environ;
while(*ch)
{
printf("
%s\n"
*ch);
ch++;
return0;
2.*编写程序,模仿讲义上的mysystem程序,实现输入命令的执行。
mysystemshell
pid=fork();
创建进程
execl(SHELL,SHELL,"
-c"
command,NULL);
用Shell命令替换父进程
waitpid(pid,&
status,0)
子进程等待
//mysystem.c
sys/wait.h>
#defineSHELL"
/bin/sh"
intmysystem(constchar*command)
intstatus;
pid_tpid;
pid=fork();
if(pid==0)
execl(SHELL,SHELL,"
_exit(EXIT_FAILURE);
elseif(pid<
status=-1;
else
if(waitpid(pid,&
status,0)!
=pid)
status=-1;
returnstatus;
mysystem(argv[1]);
其中用了Shell中的ls命令,列出了当前目录的所有文件
~/桌面/work$gcc-omysystemmysystem.c
~/桌面/work./mysystemls
a fifo_channel4 mycat.c~myls.c~ netsever.cread.c
a~ fmycat.c myfcat my_sg_get netsever.c~server
b getip.c myfcat.cmy_sg_get.c networkserver2
b~ getip.c~ myfcat.c~my_sg_get.c~network1server2.c
close.cipop.c myfifo.cmysystem network1.cserver2.c~
cp kill.c~ mykill mysystem.c network1.c~server.c
cp.c ls.c mykill.cmysystem.c~ network.cserver.c~
cp.c~ my mykill.c~netclt network.c~showev.c
fcp my.c mylist.cnetclt.c newls.ctcpk.txt
fcp.c mycat myls netclt.c~ open.ctcp.txt
fcp.c~ mycat.c myls.c netsever pipol.cwrite.c
~/桌面/work$
实验五命名管道实验
1.研究mkfifo命令,在当前目录下创建一个myfifo的命名管道。
在终端中输入:
mkfifofifo_channel,然后用ls命令查看当前目录是否产生了名为fifo_channel的管道。
~/桌面/work$mkfifofifo_channel
~/桌面/work$ls
afifo_channelmycat.c~myls.c~netsever.cread.c
a~fmycat.cmyfcatmy_sg_getnetsever.c~server
bgetip.cmyfcat.cmy_sg_get.cnetworkserver2
b~getip.c~myfcat.c~my_sg_get.c~network1server2.c
close.cipop.cmyfifo.cmysystemnetwork1.cserver2.c~
cpkill.c~mykillmysystem.cnetwork1.c~server.c
cp.cls.cmykill.cmysystem.c~network.cserver.c~
cp.c~mymykill.c~netcltnetwork.c~showev.c
fcpmy.cmylist.cnetclt.cnewls.ctcpk.txt
fcp.cmycatmylsnetclt.c~open.ctcp.txt
fcp.c~mycat.cmyls.cnetseverpipol.cwrite.c
2.用mkfifo()函数实现相同的功能。
//mk_fifo.c
#defineFIFO_CHANNEL"
./fifo_channel1"
//创建命名管道
if(mkfifo(FIFO_CHANNEL,0777)==-1)
cannotcreatFIFOchannel"
用ls命令查看可知产生了fifo_channel1的管道。
~/桌面/work$gcc-omk_fifomk_fifo.c
~/桌面/work$./mk_fifo
afifo_channel1mycatmyls.cnetsever.cserver
a~fmycat.cmycat.cmyls.c~netsever.c~server2
bgetip.cmycat.c~my_sg_getnetworkserver2.c
b~getip.c~myfcatmy_sg_get.cnetwork1server2.c~
close.cipop.cmyfcat.cmy_sg_get.c~network1.cserver.c
cpkill.c~myfcat.c~mysystemnetwork1.c~server.c~
cp.cls.c