基础

基础:

id:查看当前用户的信息

passwd:修改当前用户密码

whoami:显示当前用户

who:显示当前登录的所有用户

w:显示所有登录用户和正在进行的操作

hostname: 查看主机名

su:切换用户(-c string:从-c后的字符串读取 -i:实现脚本交互 -n:进行脚本的语法检查 -x:实现脚本逐条语句跟踪)

uname:查看本机信息(uname:显示操作系统–r:显示版本号–a:显示详细信息)


/etc/passwd:保存用户信息

/etc/shadow:保存用户密码

/etc/group:保存组信息

useradd:创建用户(-d:指定家目录-s:指定登录后shell -u:指定uid -g:指定组)

usermod:修改用户相关信息(-l:修改用户名-u:修改uid -d:修改家目录-g:修改所属组-L:锁定该用户-U:解锁用户)

userdel:删除用户(-r:删除用户时同时删除用户的家目录)

改变权限命令:chmod

chmod [-R] xyz 文件,其中xyz分别为三组rwx属性数值的和


pwd:显示当前工作目录(-p:显示当前路径而非link路径)

cd:切换目录(.当前目录  ..上一级目录 ~当前用户主目录  -上一个工作目录)

ls:列出目录内容(-l(long)列出目录内容细节,包括权限、所有者等  -a(all)列举目录全部文件,包括隐藏文件)

touch命令用于创建一个新的空白文件,如果文件已存在,则刷新修改日期。

file:查看文件类型

cat:查看文本文件内容

od:显示非纯文本文件内容(-t:指定输出格式  a默认字符 c是ascll字符输出 dox十进制八进制十六进制 f浮点数输出)


cp:复制文件或目录

-a:相当于-pdr的意思

-d:若源文件为链接文件,复制链接文件而不是文件本身

-i:若目标文件存在,覆盖时会询问

-p:连同文件属性一起复制,而不是使用默认属性

-r:递归复制整个目录树

-v:显示复制过程的详细信息


mv:移动或重命名文件或目录


rm:删除文件或目录   -i:交互式 -r:递归删除目录及包含内容  -f:强制删除

mkdir:创建一个目录(-m:指定权限  -p:递归创建)

rmdir:删除一个空目录(-p:将上层空目录也删除)


文件的三个时间属性

mtime:文件内容更改时会修改

ctime:文件属性(状态)更改时会修改

atime:文件内容被访问时会修改


echo:显示在命令行输入的内容

cat:显示文件内容

head:-n显示头n行

tail:-n显示尾n行、-f持续显示文件更新内容

more:翻页显示文件内容,只可向下翻页

less:翻页显示文件内容,可上下翻页


Linux查找命令:

[if !supportLists]1、  [endif]find:find【-指定目录】【-限定条件】【-指定动作】,默认搜索当前目录及子目录

使用find命令找出系统所有具有SUID权限的文件

find /bin/ –perm –u=s –o –perm –g=s

或find / -perm -4000

找出/etc目录下大于50k小于60k的文件

find /etc –size +50k –a –size -60k –exec ls–l \;

符合上述条件的非root文件

find /etc –size +50k –a –size -60k –not–user root –exec ls –l \;

(-perm:指定权限–o:表示或–a:表示并–exec:执行该参数给出的shell命令)

[if !supportLists]2、  [endif]locate:类find –name,更快,不搜索具体目录,搜索一个数据库

[if !supportLists]3、  [endif]whereis:只用于程序名的搜索,且只搜二进制文件(-b)、man说明文件(-m)、源代码文件(-s)

[if !supportLists]4、  [endif]which:在PATH变量指定路径中,搜某个系统命令的位置,返回第一个结果


fdisk 设备名:对该设备进行分区

mke2fs –t 文件系统名分区名:在指定分区创建文件系统(同mkfs分区名)

dumpe2fs 分区名:查看格式化好的文件系统

mount 要挂载的分区名挂载点目录:将设置好的分区挂载到某一个目录下

umount 分区名或挂载点名:卸载已挂载的分区

fuser、lsof:如果卸载失败,查看占用进程或文件


in命令用来简历硬链接(指向文件索引节点的指针)和符号链接(文件内容作为路径名去访问真正的共享文件):-f强迫建立链接–n如果new-file已存在,不创建链接–s建立一个符号链接而不是硬链接–d建立目录的硬链接 


通过type命令可以查看命令的类型


shell脚本两种执行方式:

直接命令执行:有rx权限;路径要正确

以bash进程执行:有r权限;方法为bash/sh xxx.sh


Shell脚本相关命令:

echo命令:显示变量的值 echo $变量名/${变量名}

设置变量:变量名=变量值

取消变量:unset 变量名

查看环境变量:env

set命令查看所有变量:包括环境变量和自定义变量

export命令将自定义变量转换为环境变量

read命令从键盘读取变量值(-p:接提示语句–t:接等待秒数)

declare或typeset声明变量类型(-a:数组类型–i:整型–x:声明为环境变量–r:只读)


管道命令:

cut –d 分隔符–f field或者cut –c 字符范围:将同一行数据进行分解(-d:接分隔字符,与-f一起使用–f:依据-d将一段信息分隔,-f指定去哪一段–c:以字符的单位取出固定字符区间)

grep 参数字符串 filename:按条件取出某行(-a:以text文件的方式查找–c:计算字符串次数–i:忽略大小写–n:输出行号–v:反向选择–color=auto:颜色显示)

sort:对输入内容排序

uniq:去除结果中重复行

wc:统计字、字符、行(-l:仅列出行–w:列出多少字–m:列出多少字符)


tee:双向重定向


vi操作方式:命令模式、插入模式

进入:$下键入命令vi;离开:“:wq”、“:q!”


sh/bash命令:直接执行shell脚本(-n仅检查语法–v现将scripts内容显示在屏幕–x跟踪执行进程)

source命令:执行脚本可使脚本中的变量和值在脚本完成后继续起作用


test命令:test –e /demo && echo “exist” || echo “not exist”

(-z判断是否输入–e该文件名是否存在–f该文件名是否为文件–d该文件名是否为目录–r-w-x是否可读可写可执行–eq-ne是否相等不等 test str1=str2判断字符串是否相等)

账号管理相关文件:

/etc/passwd:用户账号信息

账号名称:密码:uid:gid:用户信息:主文件夹:shell

/etc/shadow:用户密码信息(可用chage命令修改下列字段)

账号名称:密码:最近更改日期:不可被更改的天数:需要重新更改的天数:警告天数:宽限天数:失效日期:保留

/etc/group:组账号信息

组名称:组密码:gid:该用户支持的账号(不包含初始用户组的用户)

初始用户组:一个新建的用户默认隶属于和其同名的用户组及初始用户组

有效用户组:决定该用户新建文件时的相关文件属性

(groups命令查看所属用户组,第一个为有效用户组;newgrp命令修改用户的有效用户组;finger和chfn可以查看和修改用户详细属性)

/etc/gshadow:组管理级密码信息


特殊权限管理ACL

概念:用于在传统UGO模型之外进行特殊权限管理。主要功能包括针对单一用户、单一用户组进行权限设置,划定某一文件的权限范围等。

Setfacl命令和getfacl命令:setfacl –m u:software:rx acltest1

[root@locathost ~]# setfacl [-bkRd]

[{-m|-x} acl参数] 目标文件名

参数:

-m: 设置后续的acl参数给文件使用,不可以与-x合用;

-x: 删除后续的acl参数;

-b: 删除所有的acl参数;

-k: 删除默认的acl参数;

-R: 递归设置acl,包括子目录;

-d: 设置默认acl参数,只对目录有效,新建目录时引用该参数。

acl参数有三种表现形式,分别针对用户、组和有效权限(权限上限):

u:[用户账号列表]:[rwx]

g:[用户组列表]:[rwx]

m:[rwx]

getfacl命令参数和setfacl命令参数类似。


磁盘配额管理概念:是指通过系统设定的方式,限定某一用户、某一用户组、某一特定链接使用磁盘空间的最大值。

限制方式:限制inode(限制文件数量)和限制block(限制磁盘空间大小)。限制值:sofe+hard的方式。

流程:通过脚本创建范例所需组及用户和密码》文件系统支持》新建quota配置文件》quota启动、关闭与限制值的设定。

(df命令:显示磁盘相关信息)


gcc命令:c语言编辑器(-o选项用于指定编译后的文件名,不指定则默认生成a.out。

 ./用于指定路径)


Linux程序设计5个调用函数

write():size_t write(int fildes, const void *buf, size_t nbytes);  将缓冲区buf的前n个字节写入文件描述符fildes关联的文件中,返回实际写入的字节数

read():size_t read(int fildes, void *buf, size_t nbytes);  从文件描述符fildes关联的文件中读入n个字节并放入缓冲区buf中,返回实际读入的字节数

open():open(const char *path, int flags); 创建一个新的文件描述符,如果调用成功则返回一个可以被read、write等调用使用的文件描述符

close():int close(int fildes) 

iotcl():int iotcl(int fildes, int cmd,…) 为了向用户提供统一的接口,设备驱动程序封装了所有与硬件相关的特性,硬件的特有功能一般通过iotcl来完成


Linux程序设计环境

向程序传递参数:

main():int main(int argc, char *argv[]) argc保存参数个数,argv保存参数值

getopt():int getopt(int argc, char *const argv[], const char *optstring);

环境变量:putenv()和getenv()

获取底层时间值:time()

计算两个时间之间的差距:difftime()

设定时间的特定格式:gmtime()

tmpnam():用于生成一个唯一的文件名

tmpfile():需要立刻使用临时文件时,给其命名的同时将其打开

getuid()、getlogin():获取用户的相关信息

getpwuid()、getpwnam();获取用户信息的编程接口

gethostname()和uname():获取主机信息的编程接口

syslog():向日志文件添加日志信息

资源和限制:

系统策略的限制一般在头文件limits.h中

资源操作方面的限制一般定义在头文件resource.h中

work()函数将一个字符串写入临时文件10000次,然后通过一些算术运算形成CPU负载

main()函数调用work()函数,然后用getrusage()函数来获取程序耗费的CPU时间,并在屏幕上显示

main()函数调用getpriority()getrlimit(),来获取当前优先级和文件限制大小


C语言链接MySQL数据库的两个步骤:1、初始化一个连接句柄2、建立连接

进程特征:

进程状态:

  TASK_RUNNING:可执行状态/运行状态。进程在运行 ( 是系统的当前进程 ) 或者准备运行(等待被安排到系统的一个CPU上)。进程控制块有一个run_list成员,所有处于TASK_RUNNING状态的进程都通过该成员链在一起,称之为可运行队列。

 TASK_INTERRUPTIBLE:可中断的睡眠状态。进程处于某个等待队列中,它能够被信号(signal)或中断唤醒。等待资源的请求满足时,也被唤醒。

  TASK_UNINTERRUPTIBLE:不可中断的睡眠状态。进程处于某个等待队列中,不能被信号或中断唤醒,只有等待的资源被满足时才被唤醒。例如当进程打开一个设备文件时,使用TASK_UNINTERRUPTIBLE

 TASK_ZOMBIE:僵尸进程,退出状态。进程已经停止,但还没有释放进程控制块

 TASK_STOPPED:暂停状态。可能是被特定的信号终止,也可能是受其它进程的跟踪调用而暂时将CPU交给跟踪它的进程。

 TASK_TRACED (2.6):暂停状态。

 TASK_DEAD (2.6)


ps命令:查看系统中运行的进程的属性(报告进程状态)

top命令:实时监视CPU的活动状态。并允许你交互地控制这些进程

kill命令:终止PID的进程

在命令后面加&操作符:使该命令在后台操作

fg命令:使后台进程转到前台

bg命令:使被挂起的命令转到后台

ctrl-z:挂起一个前台进程

jobs:显示所有挂起的(停止的)和后台进程的作业号,确定哪一个是当前进程

suspend:挂起当前shell进程

ctrl-c:终止一个前台进程

终止后台进程方法:kill命令(软中断);先使用fg转到前台,再ctrl-c


计划任务:指由系统在某一时间或周期性自动执行的程序或应用(常用计划任务:日志轮替、日志分析、重建文件索引、删除临时文件、web分析)。

可以分为两种类型

例行性任务(crontab):按照设定的周期自动循环多次执行的工作。依赖于crond服务,通过crontab命令实现:

[root@www ~]# crontab [-u username][-l|-e|-r]

参数:

-u:给指定用户设置计划任务

-e:编辑计划任务内容

-l:查看计划任务内容

-r:删除所有计划任务

单词计划任务(at):按照设定的某一时间只执行一次的工作。依赖于atd服务,通过at命令实现:

[root@www ~]# at [-mldv] TIME

[root@www ~]# at -c

选项:

-m:当at工作完成后,以email通知用户计划任务完成情况

-l:相当于atq命令,列出目前系统上的所有at任务

-d:相当于atrm命令,可以取消一个at任务

-v:用时间格式列出at任务列表

-c:列出at任务的实际命令内容

参数:

TIME参数支持Linux中的兼容的时间格式


SELinux概念:

SELinux是为解决Linux系统权限管理缺陷导致的“内部员工误用”问题。这一缺陷的核心问题是:权限管理主要针对用户和文件,而真正运行的却是进程。

传统Linux权限管理机制——DAC,自主访问控制

Discretionary Access Control,即根据进程的所有者与文件的rwx权限来控制。

SELinux权限管理机制——MAC,强制访问控制

Mandatory Access Control,即针对特定的进程和特定的文件进行专门的权限控制。

SELinux机制:

SELinux安全上下文:


系统服务:Linux中系统服务是通过守护进程daemon来实现的。

守护进程根据功能可以分为两大类:

stand_alone:指可以独立启动并运行的守护进程。

super daemon:超级守护进程,指通过该进程去启动一系列其他进程的守护进程。


日志功能是Linux系统中非常重要的功能,是Linux管理员和使用者必须要熟练使用的功能。

Linux系统的日志功能是每个发行版都具备的功能,一般由下面三个系统服务(守护进程)来实现:

syslogd:完成系统与网络等常用日志功能;

klogd:完成与内核相关的日志功能;

logrotate:完成日志文件的轮替功能。

Linux系统中常用的日志文件有:

/var/log/cron:记录计划任务crontab的相关信息;

/var/log/messages:记录系统发生错误或异常等重要信息;

/var/log/httpd/*:记录Web服务器相关信息。

例如:mail.info /var/log/maillog_info

#这个配置指定mail服务产生的大于info等级的信息,记录在文件/var/log/maillog_info


Linux系统的启动流程为:

BIOS:硬件启动(基本输入输出系统,一般保存在主板的ROM中)

MBR:Master Boot Record(Linux启动过程中执行MBR中的前446个字节)

GRUB:操作系统引导程序(/boot/grub/grub.conf配置文件

使用dmesg命令可以查看系统引导过程中的相关信息

加载内核

init:第一个进程(主要功能包括:调用/etc/rc.d/rc.sysinit文件对系统进行初始化;挂载文件系统;根据运行级别启动相关服务和程序)

runlevel:相关应用程序


Linux的运行级别(通过/etc/inittab修改默认运行级别;每个级别对应的启动服务保存在/etc/rc.d/*.d中;使用runlevel命令可以查看当前和上一次运行级别;使用init命令可以改变当前运行级别):

0:关机

1:单用户模式

2:不带网络模式的多用户

3:普通多用户模式

4:未使用

5:图形化界面

6:重新启动


软件源管理器:



简答题:

[if !supportLists]1、  [endif]MBR和GPT的特点,MBR的分区流程

MBR是建立在BIOS技术基础上的传统分区机制,支持32位和64位系统,支持分区数量有限,寻址空间为32位,最大支持大小为2TB的硬盘。GPT是建立在UEFI技术基础上的新分区机制,解决MBR机制的缺陷,支持超过2TB的硬盘,必须使用64位系统,向后兼容MBR。

MBR分区步骤(文件系统管理):使用fdisk命令(/分区工具)进行磁盘管理。对分区指定文件系统(即mke2fs命令在指定分区上创建文件系统)。挂在文件系统(mount命令)。

2、dbm基本概念。属于什么库?与MySQL的区别?适用场景?优缺点?

Dbm数据库是一个基于索引的文件系统,并不是严格意义上基于关系的数据库系统;而MySQL数据库是一个开源的、基于关系的典型数据库系统。

在Linux环境下的软件开发中,dbm数据库适用于数据存储量不大、访问效率要求高,平台相关性不大的系统中,比如RPM、LDAP、Apache等软件中。而MySQL适用于一般的软件应用系统,使用MySQL必须安装其DBMS系统。

优缺点:dbm数据库查询和取出速度非常快,但是存入或修改通常较慢。

3、RAID概念、种类及适用场景

RAID是指一种通过将多个较小的磁盘整合成为一个大磁盘的技术。

RAID-0等量模式,性能最佳。需要速度,不需要安全,是要求最高速度和最大容量的用户的理想选择,如暂存盘或swap。(将磁盘先切除等量的区块,然后当一个文件要写入RAID时,文件会依据区块大小切割好,依序放入各个磁盘)

RAID-1映像模式,完整备份。更注重安全性而非速度的情况。(让同一份文件完整保存在凉快磁盘上面)

RAID-0+1 性能为主,兼具高安全性。(先让两个磁盘组成RAID-0,再将两组RAID-0组成RAID-1)

RAID-1+0 并发需要高效能及高安全性,如图像编辑。(与上相反)

RAID-5 空间、性能和安全的平衡,如独立存储;适合那些追求性能并要求持续访问数据的用户(如视频编辑人员)使用。(写入类似RAID-0,不过在循环写入过程中,在每个磁盘加入一个同为检查数据parity,记录其他磁盘的备份数据,用于磁盘损毁时的数据恢复)


4、Linux C程序设计的特点

Linux只需少量函数就可以实现对文件和设备的访问和控制,并且硬件、内核到系统都可以访问到。

(百度)Linux系统下编程的特点是直观且清晰,相比非Linux系统而言,你在制作程序的时候考虑的是具体调用哪些库中的什么内容,对应权限下可以执行到的地步,相当于在编程过程中了解系统结构与知识,可以制作出更加底层的对话。这与其它非Linux系统编程不同,非Linux对系统的编程多是表现在对封装后的API进行的调用,可以发挥想象力的地方都有一定的局限性。



大编程:

[if !supportLists]1、  [endif]新建进程

(1)两个进程,子进程打印10遍,父进程打印5遍,父进程等待子进程结束再结束

#include

int main()

{

         pid_tpid;

         char*message;

         intn;

         intexit_code;

         printf("forkprogram starting\n");

         pid= fork();

         switch(pid)

         {

         case-1:

                   perror("forkfailed");

                   exit(1);

         case0:

                   message= "child";

                   n= 10;

                   exit_code= 1;

                   break;

         default:

                   message= "parent";

                   n= 5;

                   exit_code= 0;

                   break;

         }

         for(; n > 0; n--)

         {

                   puts(message);

                   sleep(1);

         }

         if(pid != 0)

         {

                   intstat_val;

                   pid_tchild_pid;


                   child_pid= wait(&stat_val);

                   printf("childfinshed\n");

         }

         exit(exit_code);

}


(2)编写一段C程序完成:父进程创建一个子进程,父进程对子进程设置一个报警信号,然后父进程等待子进程的结束,如果此时报警信号先到,就终止子进程。

#include

#include

#include

#include

#include

#include


void killchild(int pid_child);

void killchild(int pid_child){

printf("killing  child process   /n");

  //调用wait函数

  int pidxx;

  pidxx=wait(NULL);

  printf("killed the child process, whose pid is %d /n",pidxx);

  exit(0);

}


void killyourself(int ownid);

void killyourself(int ownid){

//printf("killing  child process %d  /n",pid_child);

printf("parent sent signal, childprocess killed itself  /n");

 exit(0);

}


int main(){

  //要捕捉的信号

 (void)  signal(SIGALRM,killchild);

  intpid_child=0;

  intpid = fork();

 if(pid==-1){

 perror("fork failed/n");

// exit(1);

  exit(EXIT_FAILURE);

  }

 if(pid==0){

 //子进程

 pid_child=getpid();

   //子进程也signal一个信号

    (void)  signal(SIGHUP,killyourself);

 sleep(10);

 kill(getppid(),SIGALRM);


 }else{

 //父进程

 //等待

// pause();

 sleep(6);

    kill(pid_child,SIGHUP);

 exit(0);

  }

}


(3)编写一段程序,适用系统调用fork( )创建两个新的子进程,此程序运行使系统中有三个活动进程存在。控制让一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和字符“c”。试观察屏幕上的显示结果,并对输出结果进行分析。在实验报告中写出说明和分析。

#include

main()

{

  int p1,p2;

  while((p1=fork())= =-1);

  if(p1==0)

    putchar('b');

  else

{

while((p2=fork())==-1);

if(p2= =0)

  putchar('c');

else putchar('a');

}

}

运行

运行结果:root@localhost ~]# gcc -o lsj lsj.c

[root@localhost ~]# ./lsj

bca[root@localhost ~]# ./lsj

bca[root@localhost ~]# ./lsj

bca[root@localhost ~]# ./lsj

ba[root@localhost ~]# c./lsj

bca[root@localhost ~]# ./lsj

bca[root@localhost ~]# ./lsj

bca[root@localhost ~]# ./lsj

ca[root@localhost ~]# b

分析原因:①从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。

②由于函数printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。


(4)编写一段程序实现父进程创建一个子进程,通过系统调用使子进程和父进程执行不同的任务。(提示:利用system(), exec系列函数)

试思考,怎样实现进程间的同步?

#include

#include

#include"stdlib.h"

void execCreate()

{

   int pid;

   pid=fork();

   switch(pid)

    {

       case -1:

           printf("子进程创建失败...\n");

           exit(0);

       case 0:

           execl("/bin/ps", "ls", "-l", NULL);

           printf("exec系统调用失败...\n");

           exit(0);

        default:

           wait(9000);

           printf("查询进程情况成功...\n");

           exit(0);

    }

}

void main()

{

   execCreate();

}



2、进程与同步

管道读

#include

#include

#include

#include


int main()

{

 FILE*read_fp;

char buffer [BUFSIZ + 1];

int chars_read;

memset(buffer,‘\0', sizeof(buffer));

read_fp=popen(“uname –a”,”r”);

if(read_fp!=NULL)

{

chars_read=fread((buffer,sizeof(char),BUFSUZ,read_fp);

if(chars_read>0)

{

printf(“Output was:\n%s\n,buffer);

}

pclose(read_fp);

exit (EXIT_SUCCESS);

}

exit(EXIT_FAILURE);

}


管道写

#include

#include

#include

#include


int main()

{

 FILE*write_fp;

char buffer [BUFSIZ + 1];

sprintf(buffer,"Once upon a time,therewas...\n");

write fp = popen("od-c","w");

if(write_fp!=NULL)

{

fwrite((buffer,sizeof(char),strlen(buffer),write_fp);

pclose(write_fp);

exit (EXIT_SUCCESS);

}

exit(EXIT_FAILURE);

}


3、编写一个Linux C语言程序,接受输入一个任意长度的字符串并输出

(提示:内存管理,实验malloc函数和realloc函数)

#include

#include

#define CHUNKSIZE 100

int main()

{

   char *string;

   int i=0,c;

   string=malloc(sizeof(char)*CHUNKSIZE+1);

   if(string==NULL)

    {

       printf("out of memory");

       return 1;

    }

   while((c=getchar())!=EOF)

    {

       string[i]=c;

       i++;

       if(i%CHUNKSIZE==0)

       {

           string=realloc(string,sizeof(char)*CHUNKSIZE*(i/CHUNKSIZE+1)+1);

           if(string==NULL)

           {

                printf("out ofmemory");

                return 1;

           }

       }

    }

   printf("\n\norgin string is:\n%s\n",string);

   free(string);

   return 0;

}


小编程:

1、shell编程

(1)输入四个数,输出总和,求最大、最小数(shell)

read max

min = $max

sum = $max

i = 1

while[$i - lt 4]

         do

         readx

                   sum= $(($sum + $x))

         if[$max- lt $x]

                   then

                   max= $x

         fi

         if[$x- lt $max]

                   then

                   min= $x

         fi

                   i= $(($i + 1))

         done

echo "sum:$sum  max:$max min:$min"


(2)shell脚本:从命令行输入100个数,输出总和、最大值、最小值。

#!/bin/sh

for i in `seq 100 `

do

 read  var

 echo $var >> tempfile.tmp

done

echo "max number is :"`sort-n  tempfile.tmp |head -n1 `

echo "min number is :"`sort-rn  tempfile.tmp |head -n1 `

echo "sum of all number:"`awk '{a+=$0}END{ print a}' tempfile.tmp `

rm tempfile.tmp


(3)编写一个shell脚本,从命令行输入10个数,当输入的数中包含0或负数时输出’error’,同时将错误信息保存在/tmp/err文件;否则,输出这十个数的乘积。

#!/bin/bash

all=$*

if [ $# -ne 10 ];then

       echo error|tee -a /tmp/err

       exit 1

fi

sum=1

for i in $all

do

       if [ $i -le 0 ];then

                echo error|tee -a /tmp/err

                exit 1

       else

                sum=`expr $sum \* $i`

       fi

done

echo $sum

(4)shell脚本范例

首先说明下列脚本的功能,然后假设用户 输入的inputname为tmp,当前日期为2015/06/24 15:00:00,描述脚本的最终运行结果。


[if !supportLists]5、  [endif]进程5个调用

案例1:

/*预先准备好文件file.in,大小不超过1MB*/

#include

#include

#include

#include

int main() {

         charc;

         intin, out;

         in= open(“file.in”, O_RDONLY);

         out= open(“file.out”, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);                       

         while(read(in,&c,1)== 1)

                   write(out,&c,1);

         exit(0);

}

结果:

$ TIMEFORMAT=”“ time ./copy_system

4.67user 146.90system 2:32.57elapsed 99%CPU

...

$ ls -ls file.in file.out

1029 -rw-r---r- 1 neil users 1048576 Sep 1710:46 file.in

1029 -rw------- 1 neil users 1048576 Sep 1710:51 file.out


案例2:

#include

#include

#include

#include

int main() {

         charblock[1024];

         intin, out;

         intnread;

         in= open(“file.in”, O_RDONLY);

         out= open(“file.out”, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);

         while((nread= read(in,block,sizeof(block))) > 0)

                   write(out,block,nread);

         exit(0);

}


案例3:

#include

#include

int main() {

         intc;

         FILE*in, *out;

         in= fopen(“file.in”,”r”);

         out= fopen(“file.out”,”w”);

         while((c= fgetc(in)) != EOF)

                   fputc(c,out);

         exit(0);

}



5、makefile文件

列出下面makefile文件中的目标和依赖关系,然后列出当b.h文件修改时的输出


6、例行计划任务

例:假设女朋友生日是5月2日,你想要在5月1日23:59发一封email给她,这封信内容已经写在/ home/dmtsai/lover.txt 内了。

59 23 1 5 * mail kiki <

/home/dmtsai/lover.txt(< 标准输入流)

例:每五分钟需要执行/home/dmtsai/test.sh一次。

*/5 * * * * /home/dmtsai/test.sh

例:每星期六都与朋友有约,那么想要每星期五下午4:30告诉朋友星期六的约会不要忘记。

30 16 * * 5 mail friend@***.com


4、编写一个Linux C语言程序,查看当前系统的shell环境和java环境

(提示:Linux程序设计环境——环境变量)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容