(3)管道的例子ls-l|more
(4)HelloWorld例子:
#!
/bin/bash#!
用来指明shell程序本身所在的位置
#Itisaverysimpleexample#表示行注释
echoHellotheWorldecho是bash中的一个指令,显示
(5)shell程序的执行:
a:
在shell中输入指令bashhello
b:
在shell中输入指令chmod755hello./hello
(6)交互式输入readSTR:
运行该指令后,shell会停止等待输入,以回车键结束,
此时不需要加引号,即使包含空格;如果加了引号,则引号将作为变量值的一部分。
(7)bash的变量:
bash中的变量不需要事先定义类型;默认为字符串,特殊标记为整型,
没有浮点型;字符串含空格时必须使用双引号,不含空格可不用;赋值符号前后不能
有空格;引用时,加${变量名},花括号可省略。
bash的变量(eg2_1)
#!
/bin/bash
STR=Helloecho$STR
echo$STRSTR=7+5
STR=“Helloworld”echo$STR
echo$STRechoSTR
STR=Helloworld
(8)引号的作用:
参数值中包含空白符号,就需要使用引号;如果双引号中含有以$开头的
变量的引用,则需要使用变量值;如果是单引号中含有$的变量引用,则使用元符号,
而不是变量值;也可以在$前添加\,也是不展开变量,只使用元符号。
变量引用的例子(eg2_2):
#!
/bin/bash
X=“Hithere”
echo$X
echo“itisdoublequotes$X”
echo‘itissinglequotes$X’
echoitisslash\$X
(9)bash整数运算:
使用let命令;使用expr命令;使用((……))形式。
let(必须使用紧凑形式):
(10)bash中有两种条件指令:
test或者[…]当使用中括号时,括号两边必须有空格;你可以把括号想象成普通的字符单词,而不是一个可区分的运算符。
条件式:
字符串的比较,算术比较,文件的条件判断
ifcondition
then
语句
else
语句
fi
(11)参数传递及返回值:
函数使用$1、$2、$*等传递参数;使用return返回数值
环境变量:
$0:
shell指令本身
$1:
shell指令的第一个参数
$2:
shell指令的第二个参数
……
$*:
除了$0的上述所有参数连成一个单一变量,每个参数之间用${IFS}分开
$@:
同$*,但每个参数之间用空格分开
$IFS:
inputfieldseparator,默认为空格,也可以为tab或者换行符,可以更改
(12)函数:
函数名(){语句们}
(13)冒号指令:
冒号指令就是一条空指令,并且始终表示true
exit指令:
0:
表示成功
1-125:
表示错误,可以自行定义
126:
文件不是一个可执行文件
127:
该指令不存在
128及以上:
发出一个信号
(14)export指令:
export将某个变量以及它的值对某次shell环境可见
(15)shift指令:
移动参数;$2变成$1、$3变成$2……;原来的$1被扔掉;$0保持不变;
$*、$@等发生相应的变化
(16)find指令:
查找文件;在shell中输入指令:
find/-nametest-print;在根目录中查找名为test的文件;find[path][options][tests][actions]
(17)grep指令:
generalregularexpressionparser;find用来在系统中寻找文件;grep用来在文件中寻找字符串;grep[options]PATTERN[FILES]
3.Linux进程间通信的方法有哪些?
答:
1、管道(pipe)
2、有名管道(namedpipe)
3、信号量
4、消息队列
5、信号
6、共享内存
7、套接字
4.设计一个带2参数的shell程序,最后输出参数的和差积商
答:
#!
/bin/bash
echo"请输入两个数,格式n1n2:
"
readn1n2
num1=$(($n1+$n2))
echo"两数之和为:
$num1"
num2=$(($n1-$n2))
echo"两数之差为:
$num2"
num3=$(($n1*$n2))
echo"两数之积为:
$num3"
if["$n2"-ne"0"]
then
num4=$(($n1/$n2))
echo"两数之商为:
$num4"
else
echo"两数之商非法"
fi
5.编写一个具有cp功能的C程序。
答:
#include
#include
#include
#include
#definePERMS0666
#defineDUMMY0
#defineBUFFERSIZE1024
intmain(intargc,char*argv[])
{
intsource_fd,target_fd,num;
chariobuffer[BUFFERSIZE];
if(argc!
=3)
{
printf("usage:
copysourcefiletargetfile\n");
return1;
}
if((source_fd=open(*(argv+1),O_RDONLY,DUMMY))==-1)
{
printf("opensourcefileerror\n");
return2;
}
if((target_fd=open(*(argv+2),O_WRONLY|O_CREAT,PERMS))==-1)
{
printf("targetfileopenerror\n");
return3;
}
while((num=read(source_fd,iobuffer,BUFFERSIZE))>0)
{
if(write(target_fd,iobuffer,num)!
=num)
{
printf("targetfilewriteerrorn\n");
return4;
}
}
close(source_fd);
close(target_fd);
return0;
}
6.编写一个安装指定信号如SIGINT的程序
答:
#include
#include
voidfun(ints){
printf("U'dpressedCtrl+C\n");
}
intmain(){
signal(SIGINT,fun);
while
(1){
printf("Haha\n");
sleep
(2);
}
return0;
}
7.编写一个子线程程序,正确安排子线程的创建、退出
答:
第一种:
函数pthread_join用来等待一个线程的结束。
#include
#include
#include
#include
voidprint_message(char*ptr)
{
inti;
for(i=0;i<10;i++)
printf("%s",ptr);
}
intmain()
{
pthread_tthread1,thread2;
void*retval;
char*msg1="hello\n";
char*msg2="world\n";
pthread_create(&thread1,NULL,(void*)(&print_message),(void*)msg1);
pthread_create(&thread2,NULL,(void*)(&print_message),(void*)msg2);
pthread_join(thread1,&retval);
pthread_join(thread2,&retval);
return0;
}
第二种:
线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。
这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。
#include
#include
#include
#include
voidprint_message(char*ptr)
{
intretval;
printf("ThreadID:
%lx\n",pthread_self());
printf("%s",ptr);
pthread_exit(&retval);
}
intmain()
{
pthread_tthread1,thread2;
void*retval;
char*msg1="hello\n";
char*msg2="world\n";
pthread_create(&thread1,NULL,(void*)(&print_message),(void*)msg1);
pthread_create(&thread2,NULL,(void*)(&print_message),(void*)msg2);
sleep
(1);
return0;
}
8.编写一个子进程的程序,正确安排子进程的创建、返回
答:
#include
#include
#include
intmain()
{
pid_tpid;
char*message;
printf("forkprogramstarting\n");
pid=fork();
if(pid<0)
{
printf("forkerror\n");
}
elseif(pid==0)
{
printf("ID=%dThisisthechild!
\n",pid);
exit(0);
}
else
{
sleep
(2);
printf("ID=%dThisistheparent!
\n",pid);
exit(0);
}
return0;
}
9.分别编写TCP服务器端、客户端程序
答:
服务器端:
#include
#include
#include
#include
#include
#include
#defineLISTENQ5
#defineMAXLINE512
intmain()
{
intlistenfd,connfd;
socklen_tlen;
structsockaddr_inservaddr,cliaddr;
charbuff[MAXLINE];
time_tticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
printf("socketcreatedfailed.\n");
return-1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bindfailed.\n");
return-1;
}
printf("listenning...\n");
listen(listenfd,LISTENQ);
while
(1)
{
len=sizeof(cliaddr);
connfd=accept(listenfd,(structsockaddr*)&cliaddr,&len);
printf("connectfrom%s,port%d\n",
inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
ticks=time(NULL);
sprintf(buff,"%.24s\r\n",ctime(&ticks));
printf("time:
%s\n",buff);
write(connfd,buff,strlen(buff));
close(connfd);
}
return0;
}
客户端:
#include
#include
#include
#include
#defineMAXBUFFSIZE256
#defineHOST_ADDR"127.0.0.1"
intmain()
{
intsockfd,n;
charrecvbuff[MAXBUFFSIZE];
structsockaddr_inservaddr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("socketcreatedfailed.\n");
return-1;
}
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
printf("conneting...\n");
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("connectserverfailed");
return-1;
}
while((n=read(sockfd,recvbuff,MAXBUFFSIZE))>0)
{
recvbuff[n]=0;
fputs(recvbuff,stdout);
}
if(n<0)
{
printf("readfailed!
\n");
return-2;
}
return0;
}