首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
Linux内核学习笔记,输出设备基本操作
发布时间:2019-12-30 04:28
浏览次数:

DirectSound是DirectX组件之生龙活虎,提供了对音频设备的抓获和播音技能,同一时间它也是唯黄金时代多少个协理Xp系统的节拍技巧之黄金时代。 DirectSound主要有以下特点:

 

  进度调用 exit(卡塔尔国 退出试行后,棉被服装置为僵死状态,那时父进程能够经过 wait4(卡塔尔国系统调用查询子进度是或不是截至,之后再扩充最后的操作,彻底剔除进度所占用的内部存款和储蓄器财富。 wait4(卡塔尔 系统调用由 linux 内考验现,linux 系统平常提供了 wait(State of Qatar、waitpid(卡塔尔国、wait3(State of Qatar、wait4(State of Qatar那三个函数,三个函数的参数分歧,语义也可能有细微的差异,可是都回去关于截止进度的情状消息。

shell函数

优点:

在Linux中,有广大限令或工具查看内部存款和储蓄器使用项境,明日我们来拜见怎么样查看进度消耗、占用的内部存款和储蓄器意况,Linux的内部存储器管理和血脉肖似概念要比Windows复杂一些。以前,大家需求通晓一下Linux系统上面关于内部存储器的专项使用名词和职业术语概念:

1、wait() 函数:

为何要使用shell函数

linux其余的职能

  1. [root@lamp ~]# alias

  2. alias cp='cp -i'

  3. alias l.='ls -d .* --color=auto'

  1. alias ll='ls -l --color=auto'

  2. alias ls='ls --color=auto'

  3. alias mv='mv -i'

  4. alias rm='rm -i'

  5. alias vi='vim'

  6. alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

安装别称与运用

  1. [root@lamp ~]# alias cdone='cd /'
  1. [root@lamp ~]# alias

  2. alias cdone='cd /'

  3. alias cp='cp -i'

  4. alias l.='ls -d .* --color=auto'

  1. alias ll='ls -l --color=auto'

  2. alias ls='ls --color=auto'

  3. alias mv='mv -i'

  4. alias rm='rm -i'

  5. alias vi='vim'

  6. alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

  7. [root@lamp ~]# cdone

  8. [root@lamp /]# pwd

  9. /

函数也会有所和别称相像的效应。函数的效果与利益正是把程序里往往调查斟酌相似的代码部分概念成黄金年代份,然后为那生机勃勃份代码起个名字,别的具有的重新调用那黄金时代部分代码都只用调用那些名字就可以。当须求改过那某些双重代码时,只必要更换函数体内的大器晚成份代码就能够兑现调用纠正。

选拔函数的优势:

1、把相仿的程序段定义成函数,能够减掉整个程序的代码量。

2、扩大程序的可读性,以致便于管理。

3、可完成程序功效模块化,不一致的次第选择函数模块化。

4、让程序代码布局更清楚。

  • 广播音频低延迟
  • 硬件能源调控
  • 同时播放多个声音。
  • 决定硬件缓冲区的应用优先级(DirectSound使用缓冲区来播音音频)。
  • 模拟3D节奏环境。
  • 动态更动音效(回声、和声等)。
  • 抓获音频输入设备声音位wav(多为PCM数据,未经压缩)。

 

  wait(卡塔尔 函数的原型是:

shell函数语法

语法格式:

  1. 简易语法格式

  2. 函数名(){

  3.   指令...

  4.   return n

  5. }

  6. 行业内部语法格式

  7. function 函数名(){

  8.   指令...

  9.   return n

  10. }

注意:shell的重返值是exit,函数里用return输出重临值。

缺点:

 

#include <sys/types.h>        // 提供类型 pid_t 的定义
#include <sys/wait.h>

pid_t wait(int *status);

shell函数的施行

调用函数

1)直接施行函数名就可以(不带括号)。

函数名

小心:1、试行函数时,函数后的小括号没有须求。2、函数定义及函数体必需在要推行的函数名的先头定义,shell的实施从上到下按行实践。

2)带参数的函数施行形式。

函数名 参数1 参数2

留心:函数的传参和本子的传参形似,只是本子名换到函数名就能够。

函数后接的参数表达:1、shell的地点参数($1、$2、$3、$4、$5、$#、$*、$?、$@)都足以是函数的参数。2、这个时候父脚本的参数有的时候地被函数参数所覆盖或隐蔽。3、$0比较非凡,它仍为父脚本的名号。4、当函数达成时,原本的吩咐行脚本的参数即恢复生机。5、在shell函数里面,return命令功能与shell里的exit相似,作用是跳出函数。6、在shell函数体里使用exit会退出整个shell脚本,并不是退出shell函数。7、return语句会重临二个脱离值(重临值)给调用函数的顺序。8、函数的参数变量是在函数体里面定义,如若是惯常变量,日常采纳local i定义。

  • 一定要播放wav音频文件。

大意内部存款和储蓄器和设想内部存储器

  当进度调用 wait(卡塔尔 时,会搁浅方今路程的实践(即阻塞),由 wait()来自动解析是或不是当前历程的某部子进度已经淡出,若是找到了这样多少个曾经造成活死人进度的子进度,wait 就能征集那个子进度的音讯,并将其到底灭亡后回到;若无找到这么贰个子经过,wait 就能够直接不通在这里边,直到现身尸鬼进程。

shell函数模范

支出脚本创建五个简易函数并调用施行。

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. test_fun(){

  4.   echo "i am shell fun."

  5. }

  6. test_fun

  7. [root@lamp /]# sh fun01.sh

  8. i am shell fun.

调用其余脚本文件中的函数。

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. . /fun02.sh

  4. test_fun(){

  5.   echo "i am shell fun."

  6. }

  7. test_fun

  8. test_fun02

  9. [root@lamp /]# cat fun02.sh

  10. #!/bin/bash

  11. test_fun02(){

  12.   echo "i am shell fun02."

  13. }

  14. [root@lamp /]# sh fun01.sh

  15. i am shell fun.

  16. i am shell fun02.

传参

  1. [root@lamp /]# cat fun01.sh

  2. #!/bin/bash

  3. . /fun02.sh

  4. test_fun(){

  5.   echo "i am shell fun."

  6. }

  7. test_fun

  8. test_fun02 $1

  9. [root@lamp /]# cat fun02.sh

  10. #!/bin/bash

  11. test_fun02(){

  12.   echo "i am shell $1."

  13. }

  14. [root@lamp /]# sh fun01.sh golden

  1. i am shell fun.

  2. i am shell golden.

函数字传送参转成参数命令行传输,对私下钦点url判定是还是不是丰盛。

  1. [root@lamp /]# curl -I -m 3 -o /dev/null -s -w %{http_code} www.baidu.com

-I 仅测试HTTP头

-m 3 最多询问3秒

-o /dev/null 屏蔽原有输出消息

-s silent 格局,不出口任何事物

-w %{http_code} 调整额外输出

  1. [root@lamp ~]# cat check_url.sh
  1. #!/bin/bash

  2. [ -f /etc/init.d/functions ]&& . /etc/init.d/functions

  3. usage(){

  4.   echo "USAGE:$0 url."

  5.   exit 1

  6. }

  7. RETVAL=0

  8. check(){

  9.   wget -I 10 --spider -t 2 $1 &>/dev/null

  10.   RETVAL=$?

  11.   if [ $RETVAL -eq 0 ];then

  12.     action "$1 url" /bin/true

  13.   else

  1.     action "$1 url" /bin/false

  2.   fi

  3.   return $RETVAL

  4. }

  5. main(){

  6.   if [ $# -ne 1 ];then

  7.     usage

  8.   fi

  9.   check $1

  10. }

  11. main $*

  12. [root@lamp ~]# sh check_url.sh www.baidu.com

  13. www.baidu.com url [ OK ]

  14. [root@lamp ~]# sh check_url.sh www.baiduxxxx.com

  15. www.baiduxxxx.com url [FAILED]

给字符串加颜色。

  1. [root@lamp ~]# cat color.sh

  2. #!/bin/bash

  3. RED_COLOR='E[1;31m'

  4. GREEN_COLOR='E[1;32m'

  5. YELLOW_COLOR='E[1;33m'

  6. BLUE_COLOR='E[1;34m'

  7. PINK='E[1;35m'

  8. RES='E[0m'

  9. echo -e "$RED_COLOR red $RES"

  10. echo -e "$GREEN_COLOR GREEN $RES"

  11. echo -e "$YELLOW_COLOR YELLOW $RES"

  12. echo -e "$BLUE_COLOR BLUE $RES"

  13. echo -e "$PINK PINK $RES"

输出结果。

图片 1

传2个参数,颜色名称和剧情,输出带颜色的剧情。

  1. [root@lamp ~]# cat color_str.sh
  1. #!/bin/bash

  2. RED='E[1;31m'

  3. GREEN='E[1;32m'

  4. YELLOW='E[1;33m'

  5. BLUE='E[1;34m'

  6. PINK='E[1;35m'

  7. RES='E[0m'

  8. usage(){

  9.   echo "USAGE:$0 color contents."

  10.   exit 1

  11. }

  12. color(){

  13.   if [ "$1" = "red" ];then

  14.     echo -e "${RED}$2 $RES"

  15.   elif [ "$1" = "green" ];then

  16.     echo -e "${GREEN}$2 $RES"

  17.   elif [ $1 = "yellow" ];then

  18.     echo -e "${YELLOW}$2 $RES"

  19.   elif [ "$1" = "blue" ];then

  20.     echo -e "${BLUE}$2 $RES"

  21.   elif [ "$1" = "pink" ];then

  22.     echo -e "${PINK}$2 $RES"

  23.   else

  1.     echo "$2"

  2.   fi

  3. }

  4. main(){

  5.   if [ $# -ne 2 ];then

  6.     usage

  7.   fi

  8.   color $1 $2

  9. }

  10. main $*

出口结果。

图片 2

那边大家说说设备操作那生机勃勃道。

 

  参数 status 保存着子进度退出时的意气风发部分情形(包括task_struct、thread_info及内核栈等)它是叁个针对性 int 类型的指针;假使不留意子进度的终止状态值,只想把这一个活死人进度消灭掉(实际上,大非常多时候都以这么做的),则能够将这么些参数设为 NULL,即:

case结构条件句

1. 输出设备操作

在DirectSound中,一个装备对象就意味着一个音频设备,播放设备对象对应播放设备,输入设备对象对应输入设备。因为DirectSound使用COM合同,由此种种设备对象都用接口来代表。这里IDirectSound8以此接口就代表了三个输出设备对象,应用程序能够对同一个音频设备开创八个配备对象来开展音频输出操作。旧版本的DirectSound使用的是IDirectSound接口,相比前面三个少了有些效应。

大要内部存款和储蓄器:就是系统硬件提供的内部存款和储蓄器大小,是的确的内部存款和储蓄器,通常叫做内部存款和储蓄器条。也叫随机存取存款和储蓄器(random access memory,RAM)又称之为“随机存款和储蓄器”,是与CPU直接沟通数据的中间存款和储蓄器,也叫主存(内部存款和储蓄器State of Qatar。

pid = wait(NULL);        // 不管子进程的结束状态,直接杀死进程

case构造条件句语法

case语句实在正是专门的学业的多分支if语句。

  1. case "字符串变量" in

  2.   值1) 指令1...

  3. ;;

  4.   值2) 指令2...

  5. ;;

  6.   *) 指令3...

  7. esac

1.1 枚举

HRESULT WINAPI DirectSoundEnumerateW(In LPDSENUMCALLBACKW pDSEnumCallback, In_opt LPVOID pContext);
typedef BOOL (CALLBACK *LPDSENUMCALLBACKW)(LPGUID, LPCWSTR, LPCWSTR, LPVOID);

我们经过DirectSoundEnumerateW那个函数来枚举,该函数必要传入一个回调函数(原型见上),当枚举到一个器械时该回调会被调用。如若大家想世袭枚举,供给在这里个回调用中回到TRUE来告诉系统,不然再次回到FALSE。另三个参数pContext同意客户传入额外的参数,传入回调函数的结尾四个实参就是其风姿浪漫pContext。枚举时,DirectSound会将暗中同意也认作叁个独门的设施来对待,由此暗许设备会被再一次枚举一遍。当设备被当作默许设备枚举时,它的GUID和设备描述字符串都为空,要求当心处理,这里作者平素跳过了该次枚举:

if (DirectSoundEnumerateW(enumerateCallback, nullptr) != DS_OK) {
    ...
}

BOOL CALLBACK DirectSoundBasic::enumerateCallback(LPGUID guid,
                                              LPCWSTR deviceDescription,
                                              LPCWSTR deviceDriverModule,
                                              LPVOID context)
{
    Q_UNUSED(context);

    //  if primary device, skip it
    if (guid == nullptr)        return TRUE;

    ...
}

 

  如果 wait(卡塔尔调用成功,则会重临被搜集子进程的经过ID;若是被调用进程没有子进度,则调用战败,重临-1

case布局条件句轨范

听大人说客商的输入剖断是哪些数字。如若客户输入数字输出对应输入的数字,如若是其他内容重返不得法。

  1. [root@lamp ~]# cat case.sh

  2. #!/bin/bash

  3. usage(){

  4.   echo "USAGE:$0 number."

  5.   exit 1

  6. }

  7. case_fun(){

  8.   case $1 in

  9.     [1-3])

  10.       echo $1

  11.   ;;

  12.     *)

  13.       echo "input error."

  14.   esac

  15. }

  16. main(){

  17.   case $# in

  18.     1) case_fun $1

  19.   ;;

  20.     *) usage

  21.   esac

  22. }

  23. main $*

出口结果。

  1. [root@lamp ~]# sh case.sh

  2. USAGE:case.sh number.

  3. [root@lamp ~]# sh case.sh 1

  4. 1

  5. [root@lamp ~]# sh case.sh 2

  6. 2

  7. [root@lamp ~]# sh case.sh 3

  8. 3

  9. [root@lamp ~]# sh case.sh 4

  10. input error.

执行脚本打字与印刷贰个水果菜单:

1、apple

2、pear

3、banana

4、cherry

当客户筛选水果的时候,打字与印刷选择水果是哪些,并给水果单词加上颜色。

  1. [root@lamp ~]# cat fruit.sh

  2. #!/bin/bash

  3. RED='E[1;31m'

  4. GREEN='E[1;32m'

  5. YELLOW='E[1;33m'

  6. BLUE='E[1;34m'

  7. PINK='E[1;35m'

  8. RES='E[0m'

  9. FLICKER='E[31;5m'

  10. usage(){

  11.   echo -e "${FLICKER}Pls select the exist num behind. ${RES}"

  12.   exit 1

  13. }

  14. choice(){

  15.   case $num in

  16.     1) echo -e "${BLUE}apple${RES}"

  17.   ;;

  18.     2) echo -e "${GREEN}pear${RES}"

  19.   ;;

  20.     3) echo -e "${YELLOW}banana${RES}"

  21.   ;;

  22.     4) echo -e "${RED}cherry${RES}"

  23.   ;;

  24.     *) usage

  25.   esac

  26. }

  27. main(){

  28.   choice $num

  29. }

  30. echo "

  31.   1、apple

  32.   2、pear

  33.   3、banana

  34.   4、cherry"

  35. read -t 10 -p "Pls input a num:" num

  36. main $num

echo输出字符串展现分化颜色。

  1. [root@lamp ~]# echo -e "33[30m 黑色 33[0m"

  2. [root@lamp ~]# echo -e "33[31m 红色 33[0m"

  3. [root@lamp ~]# echo -e "33[32m 绿色 33[0m"

  4. [root@lamp ~]# echo -e "33[33m 黄色 33[0m"

  5. [root@lamp ~]# echo -e "33[34m 蓝色 33[0m"

  6. [root@lamp ~]# echo -e "33[35m 紫色 33[0m"

  7. [root@lamp ~]# echo -e "33[36m 天蓝色 33[0m"

  8. [root@lamp ~]# echo -e "33[37m 白色 33[0m"

图片 3

  1. [root@lamp ~]# echo -e "33[40;37m 黑底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[Linux内核学习笔记,输出设备基本操作。41;37m 红底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[42;37m 绿底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[43;37m 黄底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[44;37m 蓝底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[45;37m 紫底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[46;37m 铁锈红底白字 33[0m"
  1. [root@lamp ~]# echo -e "33[47;30m 白底黑字 33[0m"

图片 4

越来越多文字颜色及背景象查看:man console_codes

nginx运营脚本。

  1. [root@lamp ~]# cat nginx_control.sh
  1. #!/bin/bash

  2. [ -f /etc/init.d/functions ] && . /etc/init.d/functions

  3. nginx=/application/nginx/sbin/nginx

  1. profile=/application/nginx/logs/nginx.pid
  1. state() {

  2.   RETVAL=$?

  3.   if [ $RETVAL -eq 0 ];then

  4.     action "Nginx is $1" /bin/true

  5.   else

  1.     action "Nginx is $1" /bin/false

  2.   fi

  3.   return $RETVAL

  4. }

  5. start() {

  6.   if [ -f $pidfile ];then

  7.     echo "Nginx is running"

  8.   else

  1.     $nginx

  2.     RETVAL=$?

  3.     state started

  4.   fi

  5.   return $RETVAL

  6. }

  7. stop() {

  8.   if [ ! -f $pidfile ];then

  9.     echo "nginx is not running."

  10.   else

  1.     $nginx -s stop

  2.     state stoped

  3.   fi

  4.   return $RETVAL

  5. }

  6. reload() {

  7.   if [ -f $pidfile ];then

  8.     echo "Can't open $pidfile,no such file or directory."

  9.   else

  1.     $nginx -s reload

  2.     state reload

  3.   fi

  4.   return $RETVAL

  5. }

  6. case "$1" in

  7.   start)

  8.     start

  9.     RETVAL=$?

  10.     ;;

  11.   stop)

  12.     stop

  13.     RETVAL=$?

  14.     ;;

  15.   restart)

  16.     stop

  17.     sleep 2

  18.     restart

  19.     RETVAL=$?

  20.     ;;

  21.   reload)

  22.     reload

  23.     RETVAL=$?

  24.     ;;

  25.   *)

  26.     echo "USAGE:$0 {start|stop|reload|restart}"

  1. esac

  2. exit $RETVAL

case总结:

1、case语句就一定于多分支的if语句。case语句优势是更标准、易读。

2、case语句切合变量的值少,且为固定的数字或字符串集结。(start、stop、restart)。

3、系统服务运转脚本传参的剖断多用case语句。

1.2 创设设备对象

HRESULT WINAPI DirectSoundCreate8(In_opt LPCGUID pcGuidDevice, Outptr LPDIRECTSOUND8 *ppDS8, Pre_null LPUNKNOWN pUnkOuter);

调用DirectSoundCreate8函数,大家能够创造三个设施对象,通过传播多个枚举设备时收获的GUID,函数会返给大家叁个IDirectSound8接口代表设备对象:

IDirectSound8* directSound8;
if (DirectSoundCreate8(guid, &directSound8, NULL) != DS_OK) {
    std::wcout << L"[error] DirectSoundCreate8 call error!";
    return TRUE;    //  if error, skip this device
}

设想内部存款和储蓄器:绝对于物理内部存款和储蓄器,在Linux下还只怕有多个虚构内部存款和储蓄器的定义,虚构内部存款和储蓄器便是为着满意物理内部存款和储蓄器的供应不能满足须要而建议的计策,它是运用磁盘空间虚构出的一块逻辑内部存储器,用作设想内部存款和储蓄器的磁盘空间被可以称作调换空间(Swap Space)。Linux会在大意内部存款和储蓄器不足时,使用设想内部存款和储蓄器,内核会把一时不要的内部存款和储蓄器块音信写到虚构内部存储器,那样大意内存就获得了自由,那块儿内存就足以用来此外目标,而须求用到那几个内容的时候,这个新闻就能够被重新从虚构内部存款和储蓄器读入物理内部存款和储蓄器。

  接下去用黄金时代段代码来演示一下 wait(卡塔尔(قطر‎ 的用法:

当型循环和直到型循环

while循环职业中动用的十分的少,平常是医生和护师进度程序或少年老成味循环施行场景,此外循环总计,都会用for替换while。

1.3 设置设备对象优先级

HRESULT IDirectSound8::SetCooperativeLevel(HWND hwnd, DWORD dwLevel)

在动用设备对象创制缓冲区(用来捕获、播放音频)早先,咱们要求安装设备对象的经济合营品级。这些协作等第也便是客户对配备开展操作的优先级,分为:

  • DSSCL_EXCLUSIVE: 互斥等第。对于DirectX8.0原先版本,仅播放当下使用的韵律数据,其他应用的响声不会被广播;对于DirectX8.0级之后版本,同DSSCL_PRIORITY版本。

  • DSSCL_NORMAL: 普通等级,这种品级下的应用程序具有最坦荡的多任务和财富分享表现,不过这种使用不能够纠正主缓冲区音频数据格式,输出音频格式被限制为8位数据。在DirectSound中,次缓冲区用来填充应用程序要求播放的动静,主缓冲区会对多少个次缓冲区(大概是本金和利息用的,也大概是此外使用的)举办混音,然后用声卡输出播放。

  • DSSCL_PRIORITY: 优先等级,可以变动主缓冲区数据格式。
  • DSSCL_WRITEPRIMARY:写主缓冲区品级,应用能够直接写入主缓冲区,当时享有次缓冲区不会被广播(借使设备的驱动是DirectSound模拟出来的,则不能设置该品级)。

介意该函数要求传入七个窗口句柄,因为大家前日只介绍DirectSound的基本操作,笔者平素传入桌面窗口的句柄并设定点DSSCL_NORMAL优先级:

if (directSound8->SetCooperativeLevel(GetDesktopWindow(), DSSCL_NORMAL) != DS_OK) {
    std::wcout << L"[error] SetCooperativeLevel call error!";
    return TRUE;
}

 

  1 #include <unistd.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>                                                                    
  4 #include <sys/types.h>
  5 #include <sys/wait.h>
  6 
  7 void main(){
  8     pid_t fpid,rpid;
  9     fpid = fork();
 10     if(fpid < 0){        
 11         perror("error on forking!n");
 12     }
 13     else if(fpid == 0){
 14         printf("this is a child process! the pid is %dn",getpid());
 15         sleep(3);
 16     }
 17     else{
 18         rpid = wait(NULL);          // 如果 wait()调用成功,则返回子进程的PID;如果调用失败,则返回 -1
 19         printf("Catch the child process with pid of %dn",rpid);
 20     }
 21     exit(0);
 22 }    

当型和直到型循环语句

1、while条件句

语法:

  1. while 条件

  2.   do

  1.   指令 …

  2. done

2、until条件句

语法:

  1. until 条件

  2.   do

  1.   指令 ...

  2. done

无论条件是不是成立都会实行二次。

1.4 设备手艺

HRESULT IDirectSound8::GetCaps(LPDSCAPS pDSCaps)

不等的音频播放设备具备不一致的力量,DirectSound允许大家查询设备的本事:

  • 是还是不是因而Microsoft认证。
  • 知道还是不知道接济最小最大采集样板率之间的具备采集样板率。
  • 当未有DirectSound驱动时模拟驱动。
  • 前后相继缓冲区格式(十七人、8位)。
  • 前后相继缓冲区声道扶持(单声道、立体声即多声道)。
  • 不精准的多寡(某个声卡不协理):
    • 缓冲区(静态缓冲区、流缓冲区、3D缓冲区)最大数、空闲数。
    • 声卡上的总内部存储器数量、空闲内部存款和储蓄器数量、最大空闲块大小,

我们传给GetCaps三个DSCAPS布局体地址,然后系统就帮大家填充相应的多少,调用GetCaps前须求将DSCAPS构造体的dwSize设置为DSCAPS的尺寸:

DSCAPS deviceCapability = { sizeof(deviceCapability) };
if (directSound8->GetCaps(&deviceCapability) != DS_OK) {
    std::wcout << L"[error] GetCaps call error!";
    return TRUE;
}

 

输出结果如下:

当型和直到型基本模范

每间隔2秒显示屏输出负载值。

  1. [root@lamp ~]# cat while.sh

  2. #!/bin/bash

  3. while true

  4.   do

  1.     uptime

  2.     sleep 2

  3.   done

防范客商端施行脚本中断的方法。

1、sh while.sh &

2、nohup while.sh &

3、screen保持回话。

ctl+c:甘休试行业前剧本或职分

ctrl+z:暂停施行当前剧本或任务

bg:把当前剧本或职分归入后台实行

fg:当前剧本或职分打开前台试行,若是有多少个义务,能够fg加任务编号调出

jobs:查看当前施行的脚本或职责

经过管理命令

bg:后台运转

fg:挂开头后

jobs:展现后台程序

kill、killall、pkill:杀掉进度

crontab:设置准期

ps:查看进程

pstree:显示进度情状树

top:显示进度

nice:改造优先权

nohup:顾客退出系统将来持续做事

pgrep:查找相称原则的经过

strace:追踪贰个经过的系列调用意况(strace + pid)

ltrace:追踪进度调用库函数的动静

vmstat:报告虚构内部存款和储蓄器总括消息

while实现1到100之和。

  1. [root@lamp ~]# cat while_add.sh
  1. #!/bin/bash

  2. i=1

  3. sum=0

  4. while [ $i -le 100 ]

  5.   do

  1.     ((sum+=$i))

  2.     ((i++))

  3.   done

  4. echo $sum

在意:在专业中多选择算法,代码实践功用更加高。

动用while循环竖向打字与印刷10、9、8…

  1. [root@lamp ~]# cat while_seq.sh
  1. #!/bin/bash

  2. i=10

  3. while [ $i -gt 0 ]

  4.   do

  1.     echo "$i"

  2.     ((--i))

  3.   done

手提式有线电电话机充钱10元,每发二次短信花销0.15元,当前余额小于0.15元不能够发短信,提醒余额不足,请充值,能够允许顾客充值后持续发短信。

  1. [root@lamp ~]# cat messages.sh
  1. #!/bin/bash

  2. total=0

  3. menu='

  4. 1:充值

  5. 2:发送音信

  6. 3:退出

  7. '

  8. pay(){

  9.   read -t 10 -p "Pls input pay money:" num

  10.   expr ${num} + 1 &>/dev/null

  11.   [ $? -ne 0 ]&&{

  12.     echo "Input error"

  13.     return 1

  14.   }

  15.   if [ ${num} -gt 0 ];then

  16.     total=$(( $total + $num * 100 ))

  1.   else
  1.     echo "Input error"

  2.     return 1

  3.   fi

  4. }

  5.  

  6. send(){

  7.   if [ ${total} -gt 15 ];then

  8.     echo "send messages is ok."

  9.     total=$(( $total - 15 ))

  10.   else

  1.     echo "余额不足!"

  2.   fi

  3. }

  4.  

  5. while true

  6. do

  1.   echo "当前余额:${total}"

  2.   echo ${menu}

  3.   read -t 10 -p "Pls input a num:" choice

  4.   case ${choice} in

  5.     1) pay

  6.     ;;

  7.     2) send

  8.     ;;

  9.     3) exit 0

  10.     ;;

  11.     *)

  12.   esac

  13. done

while按行读取文件的不二诀窍。

方式一

  1. exec <FILE

  2. sum=0

  3. while read line

  4. do

  1.   cmd

  2. done

方式二

  1. cat ${FILE_PATH} | while read line

  2. do

  1.   cmd

  2. done

方式三

  1. while read line

  2. do

  1.   cmd

  2. done<FILE

估测计算apache一天的日志中全数行的各要素的拜望字节数的总额。

  1. [root@lamp ~]# cat log_cmd.sh
  1. #/bin/bash

  2. exec access.log

  3. while read line

  4. do

  1.   i=`echo $line|awk '{print $10}'`
  1.   expr $i + 1 &>/dev/null

  2.   if [ $? -ne 0 ];then

  3.     continue

  4.   fi

  5.   ((sum+=i))

  6. done

  7. [ -n "$sum" ] && echo $sum

while循环小结。

1、while循环的绝活是实行守护进度以至我们期待循环不脱离持续施行的气象,用功用低于1分钟的巡回管理,其他的while循环大概都得以被for循环替代。

2、大概具有的case语句都能够用if语句替换,日常在系统运行脚本传入一些些恒定准绳字符串,用case语句,别的日常性判别多用if。

3、职业中if和for最常用,其次while(守护进度)和case(服务运行脚本)。

读取一个文书,倒插入三个新的公文,清空原来的著作件。

  1. [root@lamp ~]# cat read_line.sh
  1. #!/bin/bash

  2. file=/root/read.sh

  3. num=`wc -l ${file}|awk -F ' ' '{print $1}'`

  4. while [ ${num} -gt 0 ]

  5. do

  1.   line=`tail -1 ${file}`

  2.   echo ${line}

  3.   echo ${line}>>/root/read_bak.sh

  4.   sed -i '$d' ${file}

  5.   num=`wc -l ${file}|awk -F ' ' '{print $1}'`

  6. done

1.5 播放器配置

HRESULT IDirectSound8::GetSpeakerConfig(LPDWORD pdwSpeakerConfig)
HRESULT IDirectSound8::SetSpeakerConfig(LPDWORD pdwSpeakerConfig)

播放器配置只可以是以下之风度翩翩:

  • DSSPEAKER_5POINT1_SURROUNDDSSPEAKER_5POINT1_BACK: 家庭影院配置,5个围绕扬声器,1个低音炮。
  • DSSPEAKER_DIRECTOUT:直接播放。
  • DSSPEAKER_HEADPHONE:头戴式耳麦。
  • DSSPEAKER_MONO:单声道扬声器。
  • DSSPEAKER_QUAD:4声道播放器。
  • DSSPEAKER_STEREO:立体声播放器。
  • DSSPEAKER_SURROUND:环绕播放器。
  • DSSPEAKER_7POINT1_WIDEDSSPEAKER_7POINT1_SURROUND:家庭影院配置,7个围绕扬声器,1个低音炮。

虽说MSDN文书档案未有写清楚,不过经过查以上宏定义大家开掘它们是按大小顺序定义的,由此不容许通过OXC60|来含有五种或然,例子中只要调用出错直接回到TRUE表示我们一而再再而三枚举设备并继续查询那几个设备技术:

DWORD deviceSpeakerConfiguration;
if (directSound8->GetSpeakerConfig(&deviceSpeakerConfiguration) != DS_OK) {
    std::wcout << L"[error] GetSpeakerConfig call error!";
    return TRUE;
}

Linux的buffers与cached

图片 5

for循环构造

2. 运作结果

此番大家用GUI分界面来彰显实例运维的结果(出于方便寻思,现在小编会用调控台来展现示例),为防止客商误操作改过突显的多少自身将多数控件都disable了:

图片 6

完全代码见链接

 

   关于 status 参数,相比较复杂,目前不做研究,能够参见这里:https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part3/index.html

for循环布局语法

1、for循环布局

语法

  1. for 变量名 in 变量取值列表

  2. do

  1.   指令…

  2. done

在那结构中"in 变量取值列表"可粗略,省略时一定于in $@,使用for i就相当于选拔for i in $@。

2、C语言型for循环布局

语法

  1. for((exp1;exp2;exp3))

  2. do

  1.   指令...

  2. done

for和while对比。

  1. [root@lamp ~]# cat for.sh

  2. #!/bin/bash

  3. for((i=1;i<=5;i++))

  4. do

  1.   echo $i

  2. done

  3.  

  4. [root@lamp ~]# cat while.sh

  5. #!/bin/bash

  6. i=1

  7. while((i<=5))

  8. do

  1.   echo $i

  2.   ((i++))

  3. done

形式生机勃勃:直接列出成分的艺术。

  1. [root@lamp ~]# cat for_02.sh
  1. #!/bin/bash

  2. for i in 1 2 3 4 5

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_02.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

办法二:使用大括号的方法

  1. [root@lamp ~]# cat for_02.sh
  1. #!/bin/bash

  2. for i in {1..5}

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_02.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

艺术三:使用命令结果。

  1. [root@lamp ~]# cat for_03.sh
  1. #!/bin/bash

  2. for i in `seq 5`

  3. do

  1.   echo ssh 192.168.1.${i}

  2. done

  3. [root@lamp ~]# sh for_03.sh

  4. ssh 192.168.1.1

  5. ssh 192.168.1.2

  6. ssh 192.168.1.3

  7. ssh 192.168.1.4

  8. ssh 192.168.1.5

多人民代表大会器晚成行显示的优化措施。

  1. [root@lamp ~]# seq 10 >a.log
  1. [root@lamp ~]# cat a.log

  2. 1

  3. 2

  4. 3

  5. 4

  6. 5

  7. 6

  8. 7

  9. 8

  10. 9

  11. 10

  12. [root@lamp ~]# cat a.log|xargs -n4

  1. 1 2 3 4

  2. 5 6 7 8

  3. 9 10

  4. [root@lamp ~]# xargs -n4 <a.log

  1. 1 2 3 4

  2. 5 6 7 8

  3. 9 10

  4. [root@lamp ~]# cat a.log|grep 3

  1. 3

  2. [root@lamp ~]# grep 3 a.log

  3. 3

来稳妥前路径的享有文件。

  1. [root@lamp ~]# cat for_04.sh
  1. #!/bin/bash

  2. for i in `ls`

  3. do

  1.   echo $i

  2. done

批量变型随机文件。

  1. [root@lamp ~]# cat for_05.sh
  1. #!/bin/bash

  2. for((i=1;i<=10;i++))

  3. do

  1.   mkdir -p ./test

  2.   touch ./test/`echo $RANDOM|md5sum|cut -c 1-8`_finished.jpg

  3. done

批量化名。

  1. [root@lamp ~]# cat for_06.sh
  1. #!/bin/bash

  2. for i in `ls /root/test`

  3. do

  1.   cd /root/test

  2.   mv $i `echo $i|sed 's#_finished.jpg#.html#g'`

  3. done

 

  1. [root@lamp test]# ls|awk -F '[_]' '{print "mv " $0,$1".html"}'|bash

 

  1. [root@lamp test]# rename "_finished.html" ".jpg" *.html

rename "改什么" "改成什么样" 对哪个人进行改进

破除关闭某服务开机自运行。

  1. [root@lamp test]# chkconfig --list|grep 3:on|awk '{print $1}'|egrep -v "rsyslog|sshd|systat"|sed -r 's#(.*)#chkconfig 1 off#g'|bash

for实现1+2+3+…+100。

  1. [root@lamp ~]# cat for_07.sh
  1. #!/bin/bash

  2. for ((i=1;i<=100;i++))

  3. do

  1.   ((sum+=$i))

  2. done

  3. echo "sum=${sum}"

 

  1. [root@lamp ~]# cat for_08.sh
  1. #!/bin/bash

  2. for i in `seq 100`

  3. do

  1.   let sum+=i

  2. done

  3. echo "sum=${sum}"

算法最快。

  1. [root@lamp ~]# echo $((100*(100+1)/2))

 

chpasswd批量更新客商口令工具。

创制指令文件passwd.txt(格式为[username:passwd])

# vi passwd.txt

username1:passwd1

username2:passwd2

将passwd.txt的内容传输到chpasswd指令来改革相应客户的密码

# chpasswd < doiido.txt

在Linux中有的时候发现没事的内部存款和储蓄器超级少,就如具备的内部存款和储蓄器都被消耗殆尽了,表面上看是内部存款和储蓄器相当不够用了,相当多新手见到内部存款和储蓄器被“消耗殆尽”特别忐忑,其实这几个是因为Linux系统将空闲的内部存款和储蓄器用来做磁盘文件数量的缓存。那一个招致你的系统看起来处于内部存款和储蓄器特别急迫的景色。不过事实上不是那样。那几个不同于Windows的内部存款和储蓄器管理。Linux会利用空暇的内部存款和储蓄器来做cached & buffers。

 

break continue exit return对比

break、continue、exit日常用来循环结构中决定循环(for、while、if)的走向。

break n:n表示跳出循环的层数,要是省略n表示跳出整个循环。

continue n:n表示退到第n层继续循环,假若省略n表示跳过本次巡回,忽略此次巡回的剩余代码,步入循环的下三次巡回。

exit n:退出当前shell程序,n为重返值。n也足以省略,再下三个shell里通过$?选取这么些n值。

return n:用于在函数里,作为函数的重临值,用于剖断函数实施是还是不是准确。

  1. [root@lamp ~]# cat for_09.sh
  1. #!/bin/bash

  2. for((i=0;i<=5;i++))

  3. do

  1.   if [ $i -eq 3 ];then

  2.   #continue

  3.   #break

  4.   exit

  5.   fi

  6.   echo $i

  7. done

  8. echo "ok"

contine生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

  5. 4

  6. 5

  7. ok

break生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

  5. ok

exit生效

  1. [root@lamp ~]# sh for_09.sh

  2. 0

  3. 1

  4. 2

 

2、waitpid() 函数:

 

  函数原型:

buffers是指用来给块设备做的缓冲大小(块设备的读写缓冲区),它只记录文件系统的metadata以致tracking in-flight pages.

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid,int *status,int options);

 

   waitpid(State of Qatar 函数的机能与 wait(卡塔尔(قطر‎ 的机能相近,然则,它比 wait(卡塔尔(قطر‎函数多了多少个参数:

Buffers are associated with a specific block device, and cover caching of filesystem metadata as well as tracking in-flight pages. The cache only contains parked file data. That is, the buffers remember what's in directories, what file permissions are, and keep track of what memory is being written from or read to for a particular block device. The cache only contains the contents of the files themselves.

1)参数 pid 为欲等待的子进程的识别码:

 

  pid < -1 ;等待历程组 ID 为 pid 相对值的进度组中的任何子进度;

  

  pid = -1 ;等待任何子进度,那个时候 waitpid(卡塔尔(قطر‎ 也正是wait(State of Qatar。实际上,wait()就是 pid = -1、options = 0 的waitpid(), 且有:

cached是用作page cache的内存, 文件系统的cache。你读写文件的时候,Linux内核为了增加读写品质与进程,会将文件在内部存款和储蓄器中张开缓存,那有些内存便是Cache Memory(缓存内部存储器卡塔尔。即便你的程序运营截止后,Cache Memory也不会活动释放。那就能产生你在Linux系统中等射程序往往读写文件后,你会发觉可用物理内部存款和储蓄器会很少。其实那缓存内部存款和储蓄器(Cache Memory卡塔尔国在你要求采纳内存的时候会自行释放,所以你不用顾忌未有内部存储器可用

static inline pid_t wait(*status){
    return waitpid(-1,*status,0);  
}

 

  pid = 0 ;等待进程组 ID 与当下历程相近的任何子进度(也正是伺机同一个进程组中的任何子进度);

Cached is the size of the page cache. Buffers is the size of in-memory block I/O buffers. Cached matters; Buffers is largely irrelevant.

  pid > 0 ;等待其余子进度 ID 为 pid 的子进程,只要钦点的子进度还没曾结束,waitpid(State of Qatar 就能直接等下去。

 

2)参数 options 提供一些外加的选项来支配 waitpid(卡塔尔:

Cached is the size of the Linux page cache, minus the memory in the swap cache, which is represented by SwapCached (thus the total page cache size is Cached + SwapCached). Linux performs all file I/O through the page cache. Writes are implemented as simply marking as dirty the corresponding pages in the page cache; the flusher threads then periodically write back to disk any dirty pages. Reads are implemented by returning the data from the page cache; if the data is not yet in the cache, it is first populated. On a modern Linux system, Cached can easily be several gigabytes. It will shrink only in response to memory pressure. The system will purge the page cache along with swapping data out to disk to make available more memory as needed.

  WNOHANG;若无别的已经收尾了的子进度,则立时赶回,不等待;

Buffers are in-memory block I/O buffers. They are relatively short-lived. Prior to Linux kernel version 2.4, Linux had separate page and buffer caches. Since 2.4, the page and buffer cache are unified and Buffers is raw disk blocks not represented in the page cache—i.e., not file data. The Buffers metric is thus of minimal importance. On most systems, Buffers is often only tens of megabytes.

  WUNTRACED;假使实过程步向暂停实行的场地,则立刻重返,但停止状态不予理睬;

 

  也得以将那四个选项组合起来使用,使用 O福特Explorer操作。如若不想利用那多少个选拔,也得以直接把 options 设为0 ,如下:

 

waitpid(-1,NULL,WNOHANG | WUNTRACED);     // 没有任何已结束了的子进程或子进程进入暂停执行的状态,则马上返回不等待
waitpid(-1,NULL,0);                // options 设为0,则 waitpid() 会一直等待,直到有进程退出

Linux分享内部存款和储蓄器

3)waitpid(State of Qatar 的再次来到值,有三种:

 

a)符合规律再次回到时,waitpid(State of Qatar 再次回到搜聚到的子进度的PID;

分享内部存款和储蓄器是进度间通信中最简易的格局之豆蔻年华。分享内部存款和储蓄器允许多少个或越来越多进度访谈同一块内部存款和储蓄器,就犹如malloc(State of Qatar函数向分裂进度再次回到了指向同叁个物理内存区域的指针。当多少个进程退换了那块地点中的内容的时候,其余进度都会开采到那些。其实所谓分享内部存储器,正是多少个经过间一块地选取相似段物理内存空间,它是通过将同意气风发段物理内部存款和储蓄器映射到差异进度的诬捏空间来贯彻的。由于映射到区别进程的杜撰空间中,不一样进度能够直接行使,不供给像消息队列那样举行理并答复制,所以分享内部存款和储蓄器的频率极高。分享内存可以透过mmap(State of Qatar映射普通文书编写制定来落到实处,也得以System V共享内部存款和储蓄器机制来促成,System V是通过照射特殊文件系统shm中的文件落到实处进度间的分享内部存款和储蓄器通讯,也正是说每一种分享内部存款和储蓄器区域对应非常文件系统shm中的一个文本。

b)若是设置了 WNOHANG,而调用 waitpid(卡塔尔(قطر‎时,未有察觉已退出的子进度可搜聚,则重返0;

 

c)即使调用出错,则赶回 -1,此时erron 会被安装为对应的值以提醒错误所在。(当 pid 所提醒的子进度不错在,或此进度存在,但不是调用进度的子进度, waitpid()就能够回去出错,这个时候 erron 被安装为 ECHILD)

 

 

此外,大家还必须了然QashqaiSS、PSS、USS等荣辱与共概念:

  1 #include <sys/types.h> 
  2 #include <sys/wait.h>
  3 #include <unistd.h>
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6
  7 void main(){
  8     pid_t fpid,rpid;                          // fpid为fork()的返回值,rpid为waitpid()的返回值
  9     fpid = fork();
 10     if(fpid < 0){
 11         printf("error on forking");
 12     }
 13     else if(fpid == 0){                       // 子进程中 fork() 返回值为0
 14         printf("this is a child process,pid is %dn",getpid());
 15         sleep(10);                            // 睡眠10s,10s 后子进程退出
 16         exit(0);
 17     }
 18     do{                                  // 父进程中,fork()返回新创建子进程的 PID
 19         rpid = waitpid(fpid,NULL,WNOHANG);    // 等待 PID = fpid 的进程(即子进程)退出,设置了WNOHANG选项,表明当没有发现已退出的子进程时不用等待直接返回,返回值为0;
 20         if(rpid == 0){                        // rpid = 0,说明没有发现已退出的子进程
 21             printf("No child exitedn");
 22             sleep(1);
 23         }
 24     }while(rpid == 0);
 25     if(fpid == rpid)                         // 成功收集了退出的子进程,返回值为被收集子进程的PID
 26         printf("successfully get child process %dn",rpid);
 27     else
 28         printf("error!n");
 29 }     

 

结果如下:

     VSS – Virtual Set Size 设想耗用内存(满含分享库占用的内部存款和储蓄器)

图片 7

     

  从结果中能够看来,在子进度休眠的10s时光里,waitpid(卡塔尔并从未直接等候,而是直接重返0,然后做和睦的工作(睡眠1s),如此重复了13遍;当子进度退出时,waitpid(卡塔尔(قطر‎搜聚到退出的子进度,并重回所收罗子进程的PID。

RubiconSS – Resident Set Size 实在应用物理内部存款和储蓄器(富含分享库占用的内部存款和储蓄器)

 

     

 3、wait3()、wait4() 函数:

PSS – Proportional Set Size 实际行使的概略内部存款和储蓄器(比例分红分享库占用的内部存款和储蓄器)

  函数原型:

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有