4
22
2014
3

关于怎么写MakeFile

先看下面一个MakeFile的例子

cache: test.o happyhut_list.o
	gcc -g test.o happyhut_list.o -o cache -lpthread 

happyhut_list.o: happyhut_list.c happyhut_list.h plus.h
	gcc -g -c happyhut_list.c -o happyhut_list.o

test.o: test.c plus.h raid.h
	gcc -g -c test.c -o test.o

clean:
	rm -rf *.o cache

编译的过程从下往上执行。首先执行clean部分,rm -f表示force,强制执行,-r表示递归删除,即目录和子目录

然后生成test.o文件

test.o:冒号后的东西表示生成test.o所需要的东西。

以此往上生成。最后生成可执行文件cache。

gcc -g 是为了gdb调试,-c 表示只编译,不链接。

下面说说源代码变成可执行代码在内存中执行的三个步骤:

编译、链接、载入

1.编译:将原代码编译成若干个目标模块。

2.链接:将编译后形成的目标模块和库链接在一起,形成一个完整的载入模块。

3.载入:将载入模块载入内存

具体可以看

http://blog.csdn.net/monkey_d_meng/article/details/5651649


Category: 脚本语言 | Tags:
1
18
2014
2

python脚本

下面通过一个例子说明python脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len (sys.argv)!=5: 
	print"usage:./run.py *** *** *** ***,such as ./PCMSim system.ini.example ini/pcmsim-device.ini traces/k6_1.trc 1000 ..../"
	exit()
a=sys.argv[1]
b=sys.argv[2]
c=sys.argv[3]
d=sys.argv[4]

os.system("./PCMSim -s "+a+" -d "+b+" -t "+c+" -c "+d)

这个列子的脚本语言是将如下指令.

./PCMSim -s system.ini.example -d ini/pcmsim-device.ini -t traces/k6_1.trc -c 1000

简化成了./runpy system.ini.example ini/pcmsim-device.ini traces/k6_1.trc 1000(以上代码保存的文件名字为runpy)

a b c d 就是对应的第上一行的第1,2,3,4个参数,这个例子简化工作不明显。PCMSim后面跟的四个参数分为是系统配置、设备配置,trace,运行时钟周期。如果你在运行时,前三个参数是固定的,只需要测试不同的时钟周期的效果,则可以写成如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len (sys.argv)!=2: 
	print"usage:./run.py ***,such as ./run.py 1000"
	exit()
a=sys.argv[1]

os.system("./PCMSim -s system.ini.example -d ini/pcmsim-device.ini -t traces/k6_1.trc -c "+a)

这样运行时直接./run.py 100就ok了.当然提醒一点在写完脚本后要记得做修改权限的操作即chmod 755 **。把文件改成可运行

 

下面看例二,在例二中,这个python的脚本就代替了八条命令的输入,你运行这个就直接输入./cpufreq.py 2395000就可以了,而不必坐在电脑前等上一条跑完在输入下一下。也就是说这一个脚本代替了八条语句的输入。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len(sys.argv)!=2:
	print "usage:./cpufreq.py xxx,such as ./cpufreq.py 2395000 "
	exit()
a=sys.argv[1]

for x in ['0','1','2','3']:
	os.system('xenpm set-scaling-maxfreq'+' '+x+' '+a)
	os.system('xenpm set-scaling-minfreq'+' '+x+' '+a)
Category: 脚本语言 | Tags:
1
17
2014
1

关于脚本

run一个工程时,往往要输入多个参数文件,我以前都是自己傻傻的一个个输入,不过现在要提高自己的level,要学会用脚本。下面用一个脚本为例:

# Script writer: Youngjae Kim (youkim@cse.,psu.edu)

#!/bin/sh

echo "Running Pagemap FTL..."
../src/disksim pagemap.parv pagemap.outv ascii ./trace/test.file 0 
grep "IOdriver Response time average:" pagemap.outv
grep "IOdriver Response time std.dev." pagemap.outv

echo "Running DFTL..."
../src/disksim dftl.parv dftl.outv ascii ./trace/test.file 0
grep "IOdriver Response time average:" dftl.outv
grep "IOdriver Response time std.dev." dftl.outv

echo "Running FAST..."
../src/disksim fast.parv fast.outv ascii ./trace/test.file 0
grep "IOdriver Response time average:" fast.outv
grep "IOdriver Response time std.dev." fast.outv

第一行#表示注释,#!/bin/sh中#!用来告诉系统它后面的参数是用来执行该文件的程序,这个意思我也不是很懂。反正脚本开头要加上这个。

脚本文件里面的用于直接使用linux下的shell用语(即指令用语)

echo 是在屏幕上输出的意思,如下:

grep 是在对应文件中找文字,如

grep "IOdriver Response time average:" fast.outv  就是在fast.outv找IOdriver Response time average

下面贴上我自己写的一个脚本:这个脚本的最下面一行就是你运行该程序时在shell里面要输入的东西。有两点要注意:

1 在windows里面编辑再移进去往往会出现回车等符号的编码方式不一致而出现错误,最好在linux里建立文件,直接在linux中编辑

2.在写好脚本后要chmod 755 run  即改变脚本的权限,使其变为可执行

 

#!/bin/sh

path="/home/test"

cd $path

for i in 1 2 3 4

do

     filename=$i"LALA.trace.csv"

     /home/test/run $filename >> /home/test/result/result.csv

done

注释>>为输出重定向,若原来有此文件,则附加写


#!/bin/sh
path="/home/sourcetrace/trace/DisplayAdsDataServer/Traces0"
cd $path
for i in 1 2 3 4 
do
filename=$i"-testtrace.csv" #对i取值要加上$
echo $filename #打印filename到屏幕上
  sourcepath="/home/trace/"$filename  #存放trace的路径,加上trace名字
  echo $sourcepath
  num=`grep -n 'EndHeader' $sourcepath | cut -d : -f 1` #对num赋值,grep 返回“行数:内容”,利用管道作为cut的输入。
  echo $num
 sed "1,${num}d" /home/Traces/$filename > /home/Traces0/$filename #去掉原trace的首num行,将去掉后的结果输出到/home/Trace0下面
  /home/run $filename $i #取一个东西都要用到 $ 符号

done
 
 另外脚本中的>>作用是追加写,而 > 是清除写。若没有文件,都会创建文件。故在脚本中你想把输出到控制台屏幕上的数据导到文件中,可以使用 >> filename。这个result只是记录显示在屏幕上的printf,若代码中有fopen("/home/outcome","w+");不会影响,outcome照样输出。
例如:
 
#!/bin/sh
for i in 1 2 3
do
	/home/run $i >> result 	
done

 

下面给出接受终端参数输入的shell脚本

该脚本命名run.sh

#!/bin/sh
blktrace -w $1 -d /dev/sda1 -o -| blkparse -i - -o $2

$1为终端第一个参数,$2为终端第二个参数

运行时

./run.sh 5 output.txt

表示运行时间为5s,对应$1;输出文件名字为output.txt,对应$2

 

awk解析脚本,由于awk语句中本身符号"$"就有含义,$1表示读入文件的第一列。这里会与shell脚本语言表示的 $1 为终端输入第一个参数混淆,故书写时要注意:

#!/bin/sh
awk '{if($5=='$1')print}' 1.txt > $2

运行时

./awk.sh 1193 out.txt

表示若1.txt文件的第五列==1193,则把满足条件的行输出到out.txt中。注意有无''

Category: 脚本语言 | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com