linux复习资料.docx
- 文档编号:7913381
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:20
- 大小:309.88KB
linux复习资料.docx
《linux复习资料.docx》由会员分享,可在线阅读,更多相关《linux复习资料.docx(20页珍藏版)》请在冰豆网上搜索。
linux复习资料
1、指令格式:
指令名称[选择项][参数列表]
选择项以-开头
通配符
*:
代表文件名中的任意长度的字符串;
?
:
代表文件名中的任一字符
[]:
代表文件名中的任一属于字符组中的字符
2、
3gcc基本选项
类型
说明
-E
预处理后即停止,不进行编译、汇编及连接
-S
编译后即停止,不进行汇编及连接
-c
编译或汇编源文件,但不进行连接
-ofile
指定输出文件file
程序的编译要经历预处理、编译、汇编以及连接4个阶段。
4、其他常用工具:
putty、makefile、Emacs编辑器
5、Linux系统中“一切皆文件”。
Linux操作系统是以文件为基础而设计的,除了常规文件以外,目录、设备、管道等都属于文件。
6、文件操作方式:
#defineO_ACCMODE0003//主要访问权限位的低两位用来测试权限用
#defineO_RDONLY00
#defineO_WRONLY01
#defeinO_RDWR02
#defineO_CREAT0100
#defineO_EXCL0200//如果存在,返回错误
#defineO_NOCTTY0400//终端控制信息
#defineO_TRUNC01000
#defineO_APPEND02000
7、文件打开与创建:
if((fd_open=open("/bin/ls",O_RDONLY))==-1)
{perror("open");exit(EXIT_FAILURE);}
if((fd_open_create=open("./tmp",O_CREAT|O_EXCL,0644))==-1){
perror("open");exit(EXIT_FAILURE);}
if((fd_create=creat("./tmp2",0644))==-1){
perror("open");exit(EXIT_FAILURE);}
8、获取文件属性stat
intstat(constchar*file_name,structstat*buf);
intfstat(intfiledes,structstat*buf);
9、opendir、closedir、readdir
DIR*opendir(constchar*name);intclosedir(DIR*dirp);
structdirent*readdir(DIR*dir);
10、进程及其状态
进程就是程序的一次执行过程。
进程至少要有三种基本状态。
这三种基本状态是:
运行态、就绪态和封锁态(或等待态)。
进程转换:
11、条件:
由于父子进程执行顺序的不确定性,当子进程先于父进程退出时,子进程会留下一些资源来记录运行的信息,以提供给父进程进行访问。
如果父进程没有调用wait或waitpid函数的话,则子进程将会一直保留这些信息,成为僵尸进程。
如果父进程调用了wait函数,子进程就不会成为僵尸进程。
孤儿进程是指因父亲进程先结束而导致一个子进程被init进程收养的进程。
12、可以通过以下方式结束进程。
<1>、调用exit或_exit。
<2>、在main函数中执行return。
<3>隐含的离开main函数。
Return与exit区别:
return退出当前函数主体,exit()函数退出当前进程,因此,在main函数里面return(0)和exit(0)完成一样的功能。
return仅仅从子函数中返回,而子进程用exit()退出,调用exit()时要调用一段终止处理程序,然后关闭所有I/O流。
13、管道(Pipe)及有名管道(namedpipe):
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区中存取数据:
管道一端的进程顺序地将数据写入缓冲区,另一端的进程则顺序地读出数据。
两个局限性:
1)支持半双工;2)只有具有亲缘关系的进程之间才能使用这种无名管道;读写特殊性:
1.当读一个写端已经关闭的管道时,在所有数据被读取之后,read函数返回值为0,以指示到了文件结束处;2.如果写一个读端关闭的管道,则产生SIGPIPE信号。
如果忽略该信号或者捕捉该信号并处理程序返回,则write返回-1,errno设置为EPIPE
14、父子进程通过无名管道通信
内核进程
用户进程
*
生命周期
(3)设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“/etc/passwd”,把文件中的内容都写入“pass”文件。
#include
#include
#include
intmain(intagrs,char*args[])
{intfd_src,fd_des,num;charbuf[10];
if((fd_des=open("pass",O_CREAT|O_WRONLY|O_TRUNC,0644))<0)
{perror("openorcreatefilefailed\n");
exit(EXIT_FAILURE);}
if((fd_src=open("/etc/passwd",O_RDONLY,0644))==-1)
{perror("openpasswdfilefailed\n");
exit(EXIT_FAILURE);}
do{num=read(fd_src,buf,10);
write(fd_des,buf,num);}
while(num>=10);close(fd_src);close(fd_des);
return0;}
(4)设计一个程序,要求新建一个目录,预设权限为d--x--x--x。
#include
#include
#include
intmain(intargc,char*argv[])
{DIR*dir;intfd;
if((fd=mkdir("/home/student/dir",0644))==-1)
{perror("directorycreatedfailed!
");
exit(EXIT_FAILURE);}
if(chmod("dir",S_IXUSR|S_IXGRP|S_IXOTH)<0)
{perror("chomd");exit(EXIT_FAILURE);}
return0;}
.实现两个进程间使用消息队列进行通信
//接受消息
#include
#include
#include
#defineBUFIZE1024structmsg_st{
longintmsg_type;
chartext[BUFIZE];};
intmain()
{intrunning=1;intmsgid=-1;
structmsg_stdata;longintmsgtype=0;
//创建消息队列
msgid=msgget((key_t)1234,0666|IPC_CREAT);
if(msgid==-1)
{fprintf(stderr,"msggetfailedwitherror:
%d\n",errno);exit(EXIT_FAILURE);}
//从队列中获取消息,直到遇到end消息为止
while(running)
{if(msgrcv(msgid,(void*)&data,BUFIZE,msgtype,0)==-1)
{fprintf(stderr,"msggetfailedwitherror:
%d\n",errno);exit(EXIT_FAILURE);}
printf("Youwrote%s\n",data.text);
//遇到end结束
if(strncmp(data.text,"end",3)==0)
{running=0;}
//删除消息队列
if(msgctl(msgid,IPC_RMID,0)==-1)
{fprintf(stderr,"msgctl(IPC_RMID)failed\n");
exit(EXIT_FAILURE);}
exit(EXIT_SUCCESS);}return0;}
//发送消息
#include
#include
#include
#defineBUFSIZE1024
structmsg_st{longintmsg_type;
chartext[MAX_TEXT];};
intmain()
{ntrunning=1;structmsg_stdata;
charbuffer[BUFSIZE];intmsgid=BUFSIZE;
//建立消息队列
msgid=msgget((key_t)1234,0666|IPC_CREAT);
if(msgid==-1)
{fprintf(stderr,"msggetfailedwitherror:
%d\n",errno);exit(EXIT_FAILURE);}
//向消息队列中写消息,直到写入end结束
while(running){
//写入数据
printf("Entersometext:
");fgets(buffer,BUFSIZE,stdin);
data.msg_type=1;strcpy(data.text,buffer);
//消息队列发送消息
if(msgsnd(msgid,(void*)&data,MAX_TEXT,0)==-1)
{fprintf(stderr,"msgsndfailedn");exit(EXIT_FAILURE);}
//输入end结束if(strncmp(buffer,"end",3)==0)
{running=0;}sleep
(1);}exit(EXIT_SUCCESS);
return0;}
—2.上机调试课件中killrecever和killsender程序。
//killrecever
#include
#include
//SIGUSR1信号处理函数
voidCbSigUsr1(intsigno)
{//输出接收到的信号信息
printf("\nreceivesignal=%d.\n",signo);}
voidmain(){
//安装SIGUSR1信号
if(signal(SIGUSR1,CbSigUsr1)==SIG_ERR)
{perror("signal");return;}
printf("mypidis%d\n",getpid());
printf("waitingforSIGUSR1...\n");
//暂停,等待信号pause();}
//killsender
#include
#include
voidfun_ctrl_c();intmain()
{(void)signal(SIGINT,fun_ctrl_c);
printf("NowI'mstarting..........\n");while
(1)
{printf("thisisanendlessloopunlessCtrl+carepressd!
\n");sleep
(2);}exit(0);}
voidfun_ctrl_c()
{printf("\tCtrl+cwerepressed!
\n");printf("\tThisisjustanexampleforsignalfunction!
\n");printf("\tresetsignalSIGINT\n");
(void)signal(SIGINT,SIG_DFL)}
1.编程实现由一个父进程产生3个子进程,并且给三个子进程传递不同的参数,收到‘a’的子进程在显示器上输出乘法口诀表;收到‘b’的子进程计算10!
;收到‘c’的进程计算1+2+3+……+19+20的结果。
//计算10!
#include
{intfac=1,i;for(i=1;i<=10;i++)
{fac*=i;if(i<10)printf("%d*",i);
Elseprintf("%d=",i);}
printf("%d\n",fac);return0;}
//乘法口诀表
#include
{inti,j,result=0;for(i=1;i<=9;i++)
{or(j=1;j<=i;j++){result=i*j;
printf("%d*%d=%d",i,j,result);}printf("\n");
}return0;}
//计算1+2+3+……+19+20的结果
#include
{intsum=0,i;for(i=1;i<=20;i++)
{sum+=i;if(i<20)printf("%d+",i);
Elseprintf("%d=",i);}
printf("%d\n",sum);return0;}
//主进程
#include
#include
intmain(intargc,char*argv[])
{intflag;pid_tpid;inti=1;intsum=0;intfac=1;
while(i<4){pid=fork();if(pid==-1)
{perror("fork");exit(EXIT_FAILURE);}
switch(*argv[i])
{case'a':
{if(pid==0){printf("thisis1childprocess\n");for(inti=1;i<=9;i++)
{for(intj=1;j<=i;j++)
{result=i*j;printf("%d*%d=%d",i,j,result);}
printf("\n");}}}break;
case'b':
{if(pid==0){sleep
(1);printf("thisis2childprocess\n");for(inti=1;i<=10;i++)
{fac*=i;(i<10)printf("%d*",i);else
printf("%d=",i);}printf("%d\n",fac);}}
break;case'c':
{if(pid==0){sleep
(2);
printf("thisis3childprocess\n");
for(inti=1;i<=20;i++)
{sum+=i;if(i<20)printf("%d+",i);
elseprintf("%d=",i);}printf("%d\n",sum);}}
break;default:
exit(EXIT_FAILURE);}
//if(i!
=3)return0;i++;}return0;}
2.execve函数的应用,要在程序执行时设定环境变量,路径为tmp,用户为liu,执行命令env时把这些环境变量传递给系统。
在这一函数中,参数e表示可传递新进程环境变量,参数v表示传递的参数(含命令)为构造指针数组,文件查找需给出路径。
命令env在“/bin”目录下。
把环境变量设定为:
char*envp[]={“PATH=/tmp”,”USER=liu”,NULL};
参数的构造指针数组为:
char*arg[]={“env”,NULL};
因而此函数的调用形式为:
execve(“/bin/env”,”env”,envp);
请编写程序进行调试。
#include
#include
{char*env[]={"env",NULL};
char*envp[]={"PATH=/tmp","USER=liu",NULL};
execve("/bin/env",env,envp);return0;}
使用POSIXIO实现计算文件大小
#include
#include
intmy_callen(intfd){intlen;
if(lseek(fd,0,SEEK_END)==-1)perror("lseek“);
if((len=lseek(fd,0,SEEK_CUR))==-1)perror("lseek“);returnlen;}
intmain(intargc,char**argv){intlen=-1;
intfd;if(argc<2)perror("para“);
if((fd=open(argv[1],O_RDONLY))==-1){
perror("open“);exit(EXIT_FAILURE);}
len=my_callen(fd);close(fd);
if(len<0)perror("cal“);else
printf("Thereare%dbytesinfile%s!
\n“,len,argv[1]);return0;}
列出目录下的文件信息
#include
#include
#include
if(argc<2){printf("usage:
my_getdirdirname\n“);
exit(0);}
if(my_read(argv[1])<0)exit(EXIT_FAILURE);
return0;}
intmy_read(constchar*path){
DIR*dir;structdirent*ptr;
if((dir=opendir(path))==NULL){
perror("opendir“);exit(EXIT_FAILURE);}
while((ptr=readdir(dir))!
=NULL){
printf("fileinode:
%ld\t\t“,ptr->d_ino);
printf("filename:
%s\n“,ptr->d_name);}
closedir(dir);return0;}
例:
生成多个子进程
#include
#include
pid_tpid;inti=1;while(i<9){pid=fork();
if(pid==0){printf("I'mno.%dprocess,mypidis%d.\n",i,getpid());if(i!
=1)return0;}i++;}}
由于父子进程执行顺序的不确定性,当子进程先于父进程退出时,子进程会留下一些资源来记录运行的信息,以提供给父进程进行访问。
如果父进程没有调用wait或waitpid函数的话,则子进程将会一直保留这些信息,成为僵尸进程。
如果父进程调
了wait函数,子进程就不会成为僵尸进程。
用孤儿进程是指因父亲进程先结束而导致一个子进程被init进程收养的进程。
signal的应用
#include
#include
voidfun_ctrl_c();intmain(){
(void)signal(SIGINT,fun_ctrl_c);
printf("NowI'mstarting..........\n");
while
(1){
printf("thisisanendlessloopunlessCtrl+carepressd!
\n");sleep
(2);}exit(0);}
voidfun_ctrl_c(){printf("\tCtrl+cwerepressed!
\n");
printf("\tThisisjustanexampleforsignalfunction!
\n");printf("\tresetsignalSIGINT\n");
(void)signal(SIGINT,SIG_DFL);}
创建消息队列
#include
#include
key_tkey;key=ftok(".",1);
printf("thekeyis%x\n",key);intid;
id=msgget(key+1,IPC_CREAT|0666
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 复习资料