??xml version="1.0" encoding="utf-8" standalone="yes"?> An experimental
profile mode has been added. This is an implementation of
many C++ standard library constructs with an additional analysis
layer that gives performance improvement advice based on
recognition of suboptimal usage patterns. For example,
When instrumented via the profile mode, can return suggestions about
the initial size and choice of the container used as follows:
These constructs can be substituted for the normal libstdc++
constructs on a piecemeal basis, or all existing components can be
transformed via the ȝ?a >OmniCppComplete主页上的效果l弄了出来(q里Q?/p> Ҏ其help提示一步一步来(装完了omnicppcomplete之后Q可?help omnicppcomplete)Q?/p> q里的自动加载已有vim的功能,q一个vim脚步来实?(参?vim :help globl的例子)Q?/p> 以后需要新的taglistQ只需要放在~/.vim/tagfiles目录下就好了?/p>
vim启动的时候,会自动执行~/.vimrcQ从而调用my.vimQ将事先准备好的taglist更新q去Q这里一般放一些不太变化的静态头文gtag可以了?/p> Ҏ上一步的惯例Q需要生成一个tags文gQ放在~/.vim/tagfiles/的某个子目录下: q里需要将ver换成当前pȝ的libstdc++版本QUbuntu 9.10上的?.4.1.
写一个简单的c++E序Q在Insert Mode下,Ctrl+XQ?Ctrl+PQ发现ƈ不能工作Q什么提CZ没有Q初步怀疑是对应的tag文g不对?/p>
q好早有人尝试过了,l出了一U办?q是q里Q,可惜他的Ҏ我试了不行,不过已经可以借用他的思\了: -rw-r--r-- 1 skyscribe skyscribe 4.2M 2010-01-10 18:21 tags cp tags ~/.vim/tagfiles/gcc4.4/ 上边的reviewH口昄当前调用的函C?输入./->/:: 的时候会自动提示Q也可以用CTRL+X CTRL+O 来调出提C窗口,方向键则可以选择?/p>
感兴的L?
http://skyscribe.github.com
]]>
7U结?/h2>
yield
yield
yield
end
x=1
thrice {x+=2}
thrice(&block)
thrice(&block)
end
x = 4
six_times { x += 10 }
@saved = b # Note: no ampersand! This turns a block into a closure of sorts.
end
save_for_later { puts "Hello!" }
puts "Deferred execution of a block:"
@saved.call
@saved.call
q里的saved保存为main对象的一个成员,后边实现延迟调用?br />
@saved_proc = proc { puts "I'm declared with proc." }
@saved_proc_new.call
@saved_proc.call
@saved_lambda.call
puts "I'm declared as a method."
end
@method_as_closure = method(:some_method)
特点和差?/h2>
return行ؓ
当对应的block里边包含return的时候,上述7中方式有些许的不同:
arity - 参数个数校验
对于调用点的参数查,呈现如下行ؓQ?br />
ȝ
lambda/method方式呈现完备的closure行ؓQreturn之后l箋下一程Q对于实际传入参CC在调用点查;proc/blocks方式在return的时候直接返回了外部的函数或者blockQ对于传入的参数个数也没有执行检查?br />
参考:http://innig.net/software/ruby/closures-in-ruby
以上l论验证于最新的ruby1.9.3Q和链接中的l论有些怸同;ruby1.8中的proc函数可能有不同的行ؓ?br />
]]>
W一个想到的是apt-get来下载了Q得到的是一个交互式解析器和~译器。和python的比较类|不过ruby的交互程序是个单独的E序叫做irb?br />
可惜得到的不是比较新的版本?br />
ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]
skyscribe:~$ irb
irb(main):001:0> puts "hello"
hello
=> nil
?
q很快想L?a >
wikiQ还是用rvm方便的多。教E比较简单,参考它?a >quick installation guide可。第一ơ尝试的时候用apt-get安装了没有purgeQ导致L安装到root用户?
?#8220;permission denied"的问题?br />
安装好之后,所有的东西都在$HOME/.rvm下边Q比较干脆?br />
skyscribe:~$ rvm install 1.9.3
skyscribe:~$ rvm list
rvm rubies
ruby-1.9.3-p125 [ i686 ]
# Default ruby not set. Try 'rvm alias create default <ruby>'.
# => - current
# =* - current && default
# * - default
skyscribe:~$ rvm alias create default ruby-1.9.3-p125
Creating alias default for ruby-1.9.3-p125.
Recording alias default for ruby-1.9.3-p125.
Creating default links/files
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # This loads RVM into a shell session.
^C
skyscribe:~$ bash
skyscribe:~$ rvm use 1.9.3
Using /home/skyscribe/.rvm/gems/ruby-1.9.3-p125
skyscribe:~$ ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [i686-linux]
官方的文档是最好的参考,推荐ruby koans,下蝲下来Q解压后Q是个典型的TDD学习材料Q不断运?br />
]]>
作ؓ一门微型且完整的编E语aQawk可以用数行代码就完成其他语言需要数倍的LOC才能完成的工作。其设计哲学也是比较Ҏ的,核心是dataQdriven的,q且采用了和CcM的语法来l织。它最核心的思想应该是如下两点:
引发我花Ҏ间来仔细研究awk的v因是q样的,我们的程序在做profiling的时候,发现原来用shell写的脚本分析一ơ话费的旉太长。初看了下那个脚本,大概的逻辑是要扫名所有的log文gQ按照时间戳关注的旉所耗费的时间提取出来,计算q_|波动{最l画出曲U图?br>
整体的脚本有几个部分QpythonQbashQ,处理一?0MB的log文g需要耗费40分钟?个小Ӟq显然超Z预期Q中间一个处理很长的部分是grep某个旉D늚信息然后按照报表格式写入C间文件中。在惌否优化这一节的时候,忽然想起了模式匚w来(学习Haskell的最深印象)Q于是大致翻了一下awkQ发现很Ҏ通过模式匚w使得按行处理Q同时记录中间的信息Q而一个时间段恰好和awk的record概念d?br>
׃2个小时研M下awk的函数语法,自定义自q旉截取函数Qgawk的strftime很有用,其我们发现记录有蟩跃要自动补全中间的数据记录时Q,通过三个pattern截取需要的信息Q?0分钟写出来awk的代码来?br>
所q的是,其它的shell脚本都不需要Q何改动,重新跑一ơ,3s处理完了原?0MB的文Ӟ看来q点旉投入q是相当值得的?br>
有兴的可参考:
http://www.gnu.org/manual/gawk/gawk.html
PSQawk的另一作?a >Winberger 供职于google?br>
]]>
q增加了一个新的profile模式Q尚处于试验阶段Q,可以ҎE序q行状态给出关于STL使用的一些优化徏议?br>
参看如下的描qͼ
#include <vector>
int main()
{
std::vector<int> v;
for (int k = 0; k < 1024; ++k)
v.insert(v.begin(), k);
}vector-to-list: improvement = 5: call stack = 0x804842c ...
: advice = change std::vector to std::list
vector-size: improvement = 3: call stack = 0x804842c ...
: advice = change initial container size from 0 to 1024-D_GLIBCXX_PROFILE
macro.
Profile mode的提出源?9qCGO的一?a >paperQ作者里边出C华h的名字(Ҏ拼音来判断);作者地址填的昄是Purdue大学的:
Dept. of Comput. Sci., Purdue Univ., West?br>
GCC的Profiler对C++的支持一贯停留在和C同样的水qI׃C++模板机制和OO的存在得很多时候分析profilingl果的意义被大大削弱?br>q个针对STL的profile modeq是很值得期待的?br>
]]>
最q才发现boost的cmake版本已经独立出来了,对于使用cmake的用戯言Q这里是个不错的选择?br>目主页的文档很是清晎ͼ最新的版本?.41 (版本号对应的基本是其upstream的boost版本??br>源代码是用gitl织的,对于Linux用户而言更加方便?br>
引用其主上的一句话Q?br>
CMake + GIT +Spinx 实够酷了?br>
~译h可以充分利用强大的CMake了:
git clone git://gitorious.org/boost/cmake.git src
cd src
git checkout <TAG> //TAG==1.41.0.cmake0
mkdir bld
cd bld/
cmake ../如果需要按需~译某些库,只需用make edit_cache修改cache卛_?br>
]]>
首先需要有ctagsQƈ且必LExuberant ctagsQ我的Ubuntu上已l是最新版了:
skyscribe@skyscribe:~/study/vim/pics$ ctags --version
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Aug 6 2009, 17:06:22
Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
Optional compiled features: +wildcards, +regex
?~/.vimrc 里边加入autoload taglist功能Qؓ了方便自动更新当前tagsQ设|一个快捷键Q?a >q里Q:
map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
source ~/.vim/my.vim
cat ~/.vim/my.vim
let tagfiles = glob("`find ~/.vim/tagfiles -name tags -print`")
let &tags = substitute(tagfiles, "\n", ",", "g")
要有STL的intelliSenseQ自然要有STL C++的tags database了,q里需要生成之?/h1>
mkdir -p ~/.vim/tagfiles/gcc<ver>/
ls –l /usr/include/c++/
用上边的命o生成对应的tags文gQ?/h1>
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . -o ~/.vim/tagfiles/gcc4.4/tags /usr/include/c++/4.4
mkdir gcc4.4
cp -R /usr/include/c++/4.4 ./
cat generate_sed.sh
#!/bin/bash
if [ $# -eq 0 ];then
dir=.
else
dir=$1
fi
#Substitute scripts
cat > .edit.sed <<- EOF
s/\b_GLIBCXX_BEGIN_NAMESPACE\b\s*\(\s*(\w+)\s*\)/namespace \1{/g
s/_GLIBCXX_BEGIN_NESTED_NAMESPACE\s*\(\s*std\s*,\s*_GLIBCXX_STD_[DP]\s*\)/namespace std{/g
s/\b_GLIBCXX_END_NAMESPACE\b/}/g
s/\b_GLIBCXX_END_(NESTED_\?NAMESPACE\b/}/g
EOF
count=0
cols=`tput cols`
cols=`echo "$cols - 8"|bc`
for file in `find $dir -type f`;do
if [ "T"$file != "T"$0 ];then
sed -nf ".edit.sed" $file
count=`echo "$count+1"|bc`
echo -ne "="
if [ `echo "$count%$cols"|bc` -eq 0 ];then
echo " $count"
fi
fi
done
echo "Processed $count files!"
rm -fr .edit.sed
# Generate ctag file
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q
echo "generated tag file!"
skyscribe@skyscribe:~/libstdc++/gcc4.4$ ./generate_sed.sh .
==================================================================================================== 100
==================================================================================================== 200
==================================================================================================== 300
==================================================================================================== 400
==================================================================================================== 500
==================================================================================================== 600
===============================================================Processed 663 files!
generated tag file!
ls tags -lh
到这里效果终于出来了Q?/h1>
]]>
其实我当初也有不疑惑,不过通过较长旉的实践和阅读manualQȝ有了个相对很清晰的认识?/font>
cmake的帮助组l的q是很有规律的,了解了其规律Q找自己惌的东西就会很单,所以个得这一点可能是最重要的。其helppȝ大概是这么几c:
q个是实用过E中最长用到的Q相当于一般脚步语a中的基本语法Q包括定义变量,foreachQstringQifQbuiltin command都在q里?/font>
可以用如下这些命令获取帮助:
cmake --help-commandsq个命o给出所有cmake内置的命令的详细帮助Q一般不知道自己要找什么或者想随机ȝ得时候,可以用这个?/p>
我一般更常用的方法是其重定向到less里边Q然后在~辑器里Ҏ索关键字?/p>
另外也可以用如下的办法层层羃搜索范_
cmake --help-command-listcmake --help-command-list | grep find
skyscribe@skyscribe:~/program/ltesim/bld$ cmake --help-command-list | grep find
find_file
find_library
find_package
find_path
find_program
cmake --help-command find_library
cmake version 2.6-patch 4
------------------------------------------------------------------------------
SingleItemfind_library
Find a library.find_library(<VAR> name1 [path1 path2 ...])
This is the short-hand signature for the command that is sufficient in
many cases. It is the same as find_library(<VAR> name1 [PATHS path1
path2 ...])find_library(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
和command的帮助比较类|只不q这里可以查找cmake自己定义了那些变量你可以直接使用Q譬如OSNameQ是否是WindowsQUnix{?/font>
我最常用的一个例子:
cmake --help-variable-list | grep CMAKE | grep HOSTCMAKE_HOST_APPLECMAKE_HOST_SYSTEMCMAKE_HOST_SYSTEM_NAMECMAKE_HOST_SYSTEM_PROCESSORCMAKE_HOST_SYSTEM_VERSIONCMAKE_HOST_UNIXCMAKE_HOST_WIN32q里查找所有CMake自己定义的builtin变量Q一般和pȝq_相关?/p>
如果希望所有生成的可执行文件、库攑֜同一的目录下Q可以如此做Q?/p>
q里的target_dir是一个实现设|好的绝对\径。(CMake里边l对路径比相对\径更出问题Q如果可能尽量用l对路径Q?/p>
# Targets directoryset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${target_dir}/lib)set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${target_dir}/lib)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${target_dir}/bin)
Property一般很需要直接改动,除非你想修改一些默认的行ؓQ譬如修改生成的动态库文g的soname{?/font>
譬如需要在同一个目录下既生成动态库Q也生成静态库Q那么默认的情况下,cmakeҎ你提供的target名字自动生成cM的libtarget.so, libtarget.aQ但是同一个project只能同时有一个,因ؓtarget必须唯一?/font>
q时候,可以通过修改taget对应的文件名Q从而达到既生成动态库也生静态库的目的?/font>
譬如Q?/font>
cmake --help-property-list | grep NAMEGENERATOR_FILE_NAMEIMPORTED_SONAMEIMPORTED_SONAME_<CONFIG>INSTALL_NAME_DIROUTPUT_NAMEVS_SCC_PROJECTNAMEskyscribe@skyscribe:~$ cmake --help-property OUTPUT_NAMEcmake version 2.6-patch 4------------------------------------------------------------------------------SingleItemOUTPUT_NAMESets the real name of a target when it is built.Sets the real name of a target when it is built and can be used tohelp create two targets of the same name even though CMake requiresunique logical target names. There is also a <CONFIG>_OUTPUT_NAMEthat can set the output name on a per-configuration basis.
用于查找常用的模块,譬如boostQbzip2, python{。通过单的include命o包含预定义的模块Q就可以得到一些模块执行后定义好的变量Q非常方ѝ?/font>
譬如常用的boost库,可以通过如下方式Q?/font>
# Find boost 1.40INCLUDE(FindBoost)find_package(Boost 1.40.0 COMPONENTS thread unit_test_framework)if(NOT Boost_FOUND)
message(STATUS "BOOST not found, test will not succeed!")
endif()一般开头部分的解释都相当有用,可满?0%需求:cmake --help-module FindBoost | head -40cmake version 2.6-patch 4------------------------------------------------------------------------------SingleItemFindBoostTry to find Boost include dirs and librariesUsage of this module as follows:== Using Header-Only libraries from within Boost: ==find_package( Boost 1.36.0 )if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})add_executable(foo foo.cc)endif()== Using actual libraries from within Boost: ==set(Boost_USE_STATIC_LIBS ON)set(Boost_USE_MULTITHREADED ON)find_package( Boost 1.36.0 COMPONENTS date_time filesystem system ... )
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})add_executable(foo foo.cc)target_link_libraries(foo ${Boost_LIBRARIES})endif()The components list needs to contain actual names of boost libraries
CMake相比较于autotools的一个优势就在于其生成的中间文gl织的很有序Qƈ且清晰易懂,不像autotools会生成天书一L庞然大物Q?0000+的不鲜见Q?/p>
一般CMake对应的Makefile都是有层U结构的Qƈ且会Ҏ你的CMakeLists.txt间的相对l构在binary directory里边生成相应的目录结构?/p>
譬如对于某一个targetQ一般binary tree下可以找C个文件夹: CMakeFiles/<targentName>.dir/,比如Q?/p>
skyscribe@skyscribe:~/program/ltesim/bld/dev/simcluster/CMakeFiles/SIMCLUSTER.dir$ ls -ltotal 84-rw-r--r-- 1 skyscribe skyscribe 52533 2009-12-12 12:20 build.make-rw-r--r-- 1 skyscribe skyscribe 1190 2009-12-12 12:20 cmake_clean.cmake-rw-r--r-- 1 skyscribe skyscribe 4519 2009-12-12 12:20 DependInfo.cmake-rw-r--r-- 1 skyscribe skyscribe 94 2009-12-12 12:20 depend.make-rw-r--r-- 1 skyscribe skyscribe 573 2009-12-12 12:20 flags.make-rw-r--r-- 1 skyscribe skyscribe 1310 2009-12-12 12:20 link.txt-rw-r--r-- 1 skyscribe skyscribe 406 2009-12-12 12:20 progress.makedrwxr-xr-x 2 skyscribe skyscribe 4096 2009-12-12 12:20 srcq里Q每一个文仉是个很短的文本文gQ内容相当清晰明了。build.make一般包含中间生成文件的依赖规则QDependInfo.cmake一般包含源代码文g自n的依赖规则?/pre>比较重要的是flags.make和link.txtQ前者一般包含了cM于GCC?I的相关信息,如搜索\径,宏定义等Q后者则包含了最l生成target时候的linkage信息Q库搜烦路径{?/pre>q些信息在出现问题的时候是个很好的辅助调试手段?/pre>
一般常用的是:
include_directoriesQ)用于d头文件的包含搜烦路径cmake --help-command include_directoriescmake version 2.6-patch 4------------------------------------------------------------------------------SingleIteminclude_directoriesAdd include directories to the build.include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)Add the given directories to those searched by the compiler for
include files. By default the directories are appended onto the
current list of directories. This default behavior can be changed by
setting CMAKE_include_directories_BEFORE to ON. By using BEFORE orAFTER you can select between appending and prepending, independentfrom the default. If the SYSTEM option is given the compiler will be
told that the directories are meant as system include directories on
some platforms.link_directories()用于d查找库文件的搜烦路径cmake --help-command link_directoriescmake version 2.6-patch 4------------------------------------------------------------------------------SingleItemlink_directoriesSpecify directories in which the linker will look for libraries.
link_directories(directory1 directory2 ...)Specify the paths in which the linker should search for libraries.
The command will apply only to targets created after it is called.For historical reasons, relative paths given to this command arepassed to the linker unchanged (unlike many CMake commands whichinterpret them relative to the current source directory).
一般外部库的link方式可以通过两种Ҏ来做Q一U是昄d路径Q采用link_directories()Q?一U是通过find_library()L扑֯应的库的l对路径?/p>
后一U方法是更好的,因ؓ它可以减不潜在的冲突?/p>
一般find_library会根据一些默认规则来搜烦文gQ如果找刎ͼ会set传入的第一个变量参数、否则,对应的参C被定义,q且有一个xxx-NOTFOUND被定义;可以通过q种方式来调试库搜烦是否成功?/p>
对于库文件的名字而言Q动态库搜烦的时候会自动搜烦libxxx.so (xxx.dll),静态库则是libxxx.aQxxx.libQ,对于动态库和静态库L的情况,可能会出C些乱,需要格外小心;一般尽量做匚wq接?/p>
所谓的rpath是和动态库的加载运行相关的。我一般采用如下的方式取代默认d的rpathQ?/p>
# RPATH and library search settingSET(CMAKE_SKIP_BUILD_RPATH FALSE)SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/nesim/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
cat xxx.txt | grep "yyy" | wc –l
问题是这个常见的pipeline操作一般最会起多个q程Q结果那位老兄倒是愣了半天然后目无表情?/p>
我只好l唠叨的解释了一下一般pipe的操作需要读取一个进E的输入Q然后将输出送给下一个进E;其实我希望对方干脆利落的回答是有3个,q个问题q是可以了Q我们主要不是用脚本开发,但是如果有这个技能是能得到额外的认可的?/p>
TL上的大虾们果然是x众多Q立马有人站出来问:我想知道{案是几个?直接让我怀疑是不是我的脑袋有问题。后来有人给Z可能?个的情ŞQ?/p>
某个变态的shell可能内置了cat,使其成ؓ一个builtinQ然后自p俎代庖的d标准输入Qƈ且将内容文本输出Q那么进E就一个?/p>
起初我觉得这个解释ƈ不能成立Q但是经q几个老大的解释还是明白了他所说的情况是shell的builtin?/p>
中间又讨v那些可能是builtin的commandQD出的例子是cd/kill/timeQ但是我查了一下Solaris上的Q后两个都是executableQcd扑ֈ一?usr/bin/cd 的kshQ内容如下:
#!/bin/kshcommand = `basename $0`$command $@
q个l果本来q是挺出乎我的意料的Q于是我也想当然的认为,shell里边不能直接调用syscallQ?/pre>很快得证这个揣纯_Ҏ错误的;以前q真没想q这个问题,查了下wikipedia、google之后得到很多意料之外的收莗?/pre>最后居然有人搬Zbusyboxq个大旗Q做q嵌入式的大多都知道些)Qƈ声称它把vi也builtin了?/pre>q下也很Z我的意料Q不我没有仔细研究q,没有什么发a权?/pre>不过最后有人站出来_busyboxq没有内|这些想当然的viQ而是大部分也单独赯E了Q在Unix的哲学里边,做这些大而全的东西其实是不被鼓励的,因ؓ它违反unix的哲学?/pre>话说回来Q面试的时候,我之所以会问到q样的问题,也是有很真实的background的。曾l我们查q的一个很诡异的performance bottleneck是׃shell脚步的问题引L?/pre>====================================================================================================问题本n也是比较直观的(当然是“事后诸葛”了Q:某段E序的启动脚本用如下的东东来检环境:exists=`netstat -rn | grep "xx.xx.xx.xx" | wc -l`
if [ $exists -eq 0 ];then
idx=`ifconfig -an | grep bge0 | awk -F":" '{print $2}' | uniq | sort | tail`"ifconfig bge0:`echo $idx + 1 | bc` plumb upifconfig bge0:`echo $idx + 1 | bc` xx.xx.xx.xx netmask 255.255.255.0fi当有很多个同Lq程Q?gt;500)恰好于同一时刻跑到q个初始化点的时候,如果pȝ上已l存在的IP地址很多Q当时的场景大概?000+Q,那么netstat、ifconfig本n都变得非常耗时Q加上多个进E的原因Q系l中会有N多个q程在消耗着资源Q?/p>
后果的严重程度是Mshell都停止响应,数十分钟都陷入假死,不得不重启电源了事?/p>
当然的分析结果发玎ͼ真正占用的CPU都是处于kernel状态的Qƈ且用率过99%Q长长的pipeline带来的开销Q相当一部分可能来源于互相等待CPU的进E的互相抢占?/p>
解决的方法自然也很简单,q里不赘qC?/p>
=========================================================================
当时以ؓ对这个问题搞得算是比较明白了Q结果拿出来一讨论Q发现自׃了解的还真不?/p>
]]>
其中核心的部分是通过python的subproces module中的Popen来调用shell脚步完成功能性请求,q抓取执行的l果?/font>
初一开始,test case比较的时候(100个以内)都没有Q何问题;但从某一刻vQ当过120个的时候,最后一个test case执行的时候,L报告
OSErrorQ?too many open files
l出的stack trace指向了Popen的communicateҎ?/font>
最单的怀疑自然是打开文g数的限制了, ulimit -a 发现默认的Shell的确只有256Q虽然感觉应该也够用了(因ؓ每一个case都是用单独的Popen来执行操?完毕应该被回收了)Q但q是自然其开大一些;
ulimit –n 1024
重新执行Q还是最后一个casep|Q错误依然?/font>
Google了一下,暂时没有头AQ只有待有时间再详细盘查一下原委了。不q在搜烦{案的过E中发现了一个有意思的现象Q?/font>
有h在询问怎样python的字W串quote成ؓ一个可以再shell中安全用的字符Ԍ有人回复说Subprocess中有一个类似的Ҏ可以完成cM的工作ؓ什么不用;马上有牛人站出来_q个模块的作者大概不想维护过多的东西Q因而将光藏了hQ而不是放开了给大家用,因ؓ它的doc里边都没有直接说明,用的人是看了他的代码才知道有q个函数Q参?/font>q里Q?/font>