Linux结课作业.docx
《Linux结课作业.docx》由会员分享,可在线阅读,更多相关《Linux结课作业.docx(20页珍藏版)》请在冰豆网上搜索。
Linux结课作业
一、Shell编程 要求:
写出两个Shell程序,每个程序不少于十五行;说明程序主要功能;每行给出注释。
#MajorFunction:
simplecalculatorfor+-#/
#
#Time:
SundayMay5,2013
#
#copyright:
#!
/bin/bash
#!
/bin/sh
main()
{
echo"calculatorV1.0"
#选择操作方式helporcalulateorexit
while[1]
do
readselect
if["$select"="help"]
then
echo"1calculator"
echo"0exit"
elif["$select"="1"]
then
cal;
elif["$select"="0"]
then
break;
fi
done
}
cal()
{
readstr
#针对读入的字串,提取操作数及操作符
num1=`echo$str|cut-d''-f1`
num2=`echo$str|cut-d''-f3`
sign=`echo$str|cut-d''-f2`
#根据sign选择对应操作+-#/
case$signin
+)
sum=`expr$num1+$num2`;
echo"$num1$sign$num2=$sum";;
-)
sum=`expr$num1-$num2`;
echo"$num1$sign$num2=$sum";;
\#)
sum=`expr$num1\*$num2`;
echo"$num1*$num2=$sum";;
/)
sum=`expr$num1/$num2`;
echo"$num1$sign$num2=$sum";;
esac
}
main
#!
/bin/bash
#数字游戏
random()
{
FLOOR=0
RANGE=10
num=0
while[$num-le$FLOOR]
do
num=$RANDOM
#通过使随机数成为指定范围的随机数
let"num%=$RANGE"
done
#echo"Randomnumberbetween$FLOORand$RANGE---$number"
return
}
random
########################
D1=$num
random
D2=$num
while[$D2==$D1]
dorandom
D2=$num
done
random
D3=$num
while[$D3==$D2]||[$D3==$D1]
dorandom
D3=$num
done
random
D4=$num
while[$D4==$D3]||[$D4==$D2]||[$D4==$D1]
dorandom
D4=$num
done
#echo$D1$D2$D3$D4#########Thisisfortest
input_num()
{
#输入四个数据并判断比较对错情况返回?
A?
B
echo
echo"Pleaseinputfourdifferentnumbersbetween1~9(Justlikethis\"5214\")"
readS1S2S3S4
}
zero()
{
while[$S1==0]||[$S2==0]||[$S3==0]||[$S4==0]
doecho"zeroisnotallowd"
input_num
done
}
input_num
zero
while[$S1==$S2]||[$S1==$S3]||[$S1==$S4]||[$S2==$S3]||[$S2==$S4]||[$S3==$S4]
doecho"wronginput"
input_num
done
echo$S1$S2$S3$S4
declareA
declareB
#比较函数
compare()
{
A=0
B=0
if[$S1==$D1]
thenletA=$A+1
elif[$S1==$D2]||[$S1==$D3]||[$S1==$D4]
thenletB=$B+1
fi
if[$S2==$D2]
thenletA=$A+1
elif[$S2==$D1]||[$S2==$D3]||[$S2==$D4]
thenletB=$B+1
fi
if[$S3==$D3]
thenletA=$A+1
elif[$S3==$D1]||[$S3==$D2]||[$S3==$D4]
thenletB=$B+1
fi
if[$S4==$D4]
thenletA=$A+1
elif[$S4==$D1]||[$S4==$D2]||[$S4==$D3]
thenletB=$B+1
fi
clear
echo"$S1$S2$S3$S4$A"A"$B"B"">>~/answ.txt
/bin/cat~/answ.txt
while[$A-lt4]
doinput_num
compare
done
if[$A==4]
thenecho"Congratulation,youareverygood"
fi
return
}
compare
二、Linux操作系统配置实例 要求:
查阅资料结合实际使用情况,写出Linux操作系统使用中的一个配置的详细过程;具体配
置目标不限(自选)。
1、Linux下安装MySQL需要下面两个文件:
MySQL-server-5.1.7-0.i386.rpmmysql
2、Linux下安装MySQL
rpm文件是RedHat公司开发的软件安装包,rpm可让Linux在安装软件包时免除许多复杂的手续。
该命令在安装时常用的参数是–ivh,其中i表示将安装指定的rmp软件包,V表示安装时的详细信息,h表示在安装期间出现“#”符号来显示目前的安装过程。
这个符号将持续到安装完成后才停止。
1)安装服务器端
在有两个rmp文件的目录下运行如下命令:
[root@test1local]#rpm-ivhMySQL-server-5.1.7-0.i386.rpmMySQL-client-5.1.7-0.i386.rpm
显示如下信息。
warning:
MySQL-server-5.1.7-0.i386.rpm
signature:
NOKEY,keyID5072e1f5
Preparing... ###########################################[100%]
1:
MySQL-server ###########################################[100%]
。
。
。
。
。
。
(省略显示)
/usr/bin/mysqladmin-urootpassword'new-password'
/usr/bin/mysqladmin-uroot-htest1password'new-password'
。
。
。
。
。
。
(省略显示)
Startingmysqlddaemonwithdatabasesfrom/var/lib/mysql
如出现如上信息,服务端安装完毕。
测试是否成功可运行netstat看Mysql端口是否打开,如打开表示服务已经启动,安装成功。
Mysql默认的端口是3306。
[root@test1local]#netstat-nat
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddress ForeignAddress State
tcp 0 00.0.0.0:
3306 0.0.0.0:
* LISTEN
上面显示可以看出MySQL服务已经启动。
2)安装客户端
运行如下命令:
[root@test1local]#rpm-ivhMySQL-client-5.1.7-0.i386.rpm
warning:
MySQL-client-5.1.7-0.i386.rpm:
V3DSAsignature:
NOKEY,keyID5072e1f5
Preparing... ###########################################[100%]
1:
MySQL-client ###########################################[100%]
显示安装完毕。
用下面的命令连接mysql,测试是否成功。
3、登录MySQL
登录MySQL的命令是mysql,mysql的使用语法如下:
mysql[-uusername][-hhost][-p[password]][dbname]
username与password分别是MySQL的用户名与密码,mysql的初始管理帐号是root,没有密码,注意:
这个root用户不是Linux的系统用户。
MySQL默认用户是root,由于初始没有密码,第一次进时只需键入mysql即可。
[root@test1local]#mysql
WelcometotheMySQLmonitor. Commandsendwith;or\g.
YourMySQLconnectionidis1toserverversion:
4.0.16-standard
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>
出现了“mysql>”提示符,恭喜你,安装成功!
增加了密码后的登录格式如下:
mysql-uroot-p
Enterpassword:
(输入密码)
其中-u后跟的是用户名,-p要求输入密码,回车后在输入密码处输入密码。
注意:
这个mysql文件在/usr/bin目录下,与后面讲的启动文件/etc/init.d/mysql不是一个文件。
三、Linux操作系统应用开发实例 要求:
编写Linux下的一个应用程序。
开发语言和工具不限;给出源代码和运行结果。
关键代码部分要给出注释。
通过
Tcpserver
classTcpServer:
publicQDialog
{
Q_OBJECT
public:
explicitTcpServer(QWidget*parent=0);
~TcpServer();
voidrefused();
voidinitServer();
protected:
voidchangeEvent(QEvent*e);
private:
Ui:
:
TcpServer*ui;
qint16tcpPort;
QTcpServer*tcpServer;
QStringfileName;
QStringtheFileName;
QFile*localFile;
qint64TotalBytes;
qint64bytesWritten;
qint64bytesToWrite;
qint64loadSize;
QByteArrayoutBlock;//缓存一次发送的数据
QTcpSocket*clientConnection;
QTimetime;//计时器
privateslots:
voidon_serverSendBtn_clicked();
voidon_serverCloseBtn_clicked();
voidon_serverOpenBtn_clicked();
voidsendMessage();
voidupdateClientProgress(qint64numBytes);
signals:
voidsendFileName(QStringfileName);
};
Tcpclient
classTcpClient:
publicQDialog
{
Q_OBJECT
public:
explicitTcpClient(QWidget*parent=0);
~TcpClient();
voidsetHostAddress(QHostAddressaddress);
voidsetFileName(QStringfileName){localFile=newQFile(fileName);}
protected:
voidchangeEvent(QEvent*e);
private:
Ui:
:
TcpClient*ui;
QTcpSocket*tcpClient;
quint16blockSize;
QHostAddresshostAddress;
qint16tcpPort;
qint64TotalBytes;
qint64bytesReceived;
qint64bytesToReceive;
qint64fileNameSize;
QStringfileName;
QFile*localFile;
QByteArrayinBlock;
QTimetime;
privateslots:
voidon_tcpClientCancleBtn_clicked();
voidon_tcpClientCloseBtn_clicked();
voidnewConnect();
voidreadMessage();
voiddisplayError(QAbstractSocket:
:
SocketError);
};
实现:
chat:
:
chat(QStringpasvusername,QStringpasvuserip):
ui(newUi:
:
chat)
{
ui->setupUi(this);
ui->textEdit->setFocusPolicy(Qt:
:
StrongFocus);
ui->textBrowser->setFocusPolicy(Qt:
:
NoFocus);
ui->textEdit->setFocus();
ui->textEdit->installEventFilter(this);
a=0;
is_opened=false;
//this->is_opened=false;
xpasvusername=pasvusername;
xpasvuserip=pasvuserip;
ui->label->setText(tr("与%1聊天中对方IP:
%2").arg(xpasvusername).arg(pasvuserip));
//UDP部分
xchat=newQUdpSocket(this);
xport=45456;
//xchat->bind(xport,QUdpSocket:
:
ShareAddress|QUdpSocket:
:
ReuseAddressHint);
xchat->bind(QHostAddress:
:
QHostAddress(getIP()),xport);
connect(xchat,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
//TCP部分
server=newTcpServer(this);
connect(server,SIGNAL(sendFileName(QString)),this,SLOT(sentFileName(QString)));
connect(ui->textEdit,SIGNAL(currentCharFormatChanged(QTextCharFormat)),this,SLOT(currentFormatChanged(constQTextCharFormat)));
}
chat:
:
~chat()
{
is_opened=false;
deleteui;
}
boolchat:
:
eventFilter(QObject*target,QEvent*event)
{
if(target==ui->textEdit)
{
if(event->type()==QEvent:
:
KeyPress)//按下键盘某键
{
QKeyEvent*k=static_cast(event);
if(k->key()==Qt:
:
Key_Return)//回车键
{
on_send_clicked();
returntrue;
}
}
}
returnQWidget:
:
eventFilter(target,event);
}
//处理用户离开
voidchat:
:
participantLeft(QStringuserName,QStringlocalHostName,QStringtime)
{
ui->textBrowser->setTextColor(Qt:
:
gray);
ui->textBrowser->setCurrentFont(QFont("TimesNewRoman",10));
ui->textBrowser->append(tr("%1于%2离开!
").arg(userName).arg(time));
}
QStringchat:
:
getUserName()//获取用户名
{
QStringListenvVariables;
envVariables<<"USERNAME.*"<<"USER.*"<<"USERDOMAIN.*"
<<"HOSTNAME.*"<<"DOMAINNAME.*";
QStringListenvironment=QProcess:
:
systemEnvironment();
foreach(QStringstring,envVariables)
{
intindex=environment.indexOf(QRegExp(string));
if(index!
=-1)
{
QStringListstringList=environment.at(index).split('=');
if(stringList.size()==2)
{
returnstringList.at
(1);
break;
}
}
}
returnfalse;
}
QStringchat:
:
getIP()//获取ip地址
{
QListlist=QNetworkInterface:
:
allAddresses();
foreach(QHostAddressaddress,list)
{
if(address.protocol()==QAbstractSocket:
:
IPv4Protocol)//我们使用IPv4地址
returnaddress.toString();
}
return0;
}
voidchat:
:
hasPendingFile(QStringuserName,QStringserverAddress,//接收文件
QStringclientAddress,QStringfileName)
{
QStringipAddress=getIP();
if(ipAddress==clientAddress)
{
intbtn=QMessageBox:
:
information(this,tr("接受文件"),
tr("来自%1(%2)的文件:
%3,是否接收?
")
.arg(userName).arg(serverAddress).arg(fileName),
QMessageBox:
:
Yes,QMessageBox:
:
No);
if(btn==QMessageBox:
:
Yes)
{
QStringname=QFileDialog:
:
getSaveFileName(0,tr("保存文件"),fileName);
if(!
name.isEmpty())
{
TcpClient*client=newTcpClient(this);
client->setFileName(name);
client->setHostAddress(QHostAddress(serverAddress));
client->show();
}
}
else{
sendMessage(Refuse,serverAddress);
}
}
}
以上是主要源码未包含局域网广播ip列表获取及udp实现部分
4、linux内核源码解读
Linux信号机制
1.信号的来源
程序错误:
除零,非法内存访问…
外部信号:
终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…
显式请求:
kill函数允许进程发送任何信号给其他进程或进程组。
2.Linux下查看信号
在Linux下,可以通过以下命令查看系统所有的信号:
kill-l
可以通过类似下面的命令显式的给一个进程发送一个信号:
kill-2pid
3.信号的处理
忽略信