2013年11月4日星期一

-bash: fork: retry: Resource temporarily unavailable

linux下,su用户时,出现提示:-bash: fork: retry: Resource temporarily unavailable的解决办法:
解除 Linux 系统的最大进程数和最大文件打开数限制:  
 
# vi /etc/security/limits.conf  
 
# 添加如下的行  
*   soft   nofile   65535       #软连接   
*   hard   nofile   65535      #硬连接  

2013年10月16日星期三

Disable LDAP

Redhat

system-config-authentication --disableldapauth -update
 system-config-authentication --disableldap -update
 system-config-authentication --disableldaptls -update
 system-config-authentication --disableldapssl -update

SUSE
yast


2013年9月19日星期四

msgget

在IPC queue创建之后,
if ((qcp_input = msgget(QCP_INPUT,IPC_CREAT | 0666)) < 0)

继续调用
 qcp_input1 = msgget(QCP_INPUT,0);

那么qcp_input1 将返回qcp_input的值

2013年2月27日星期三

如何让putty支持中文输入?

http://harmony.relax.blogbus.com/logs/28439927.html

其实putty中文的支持还是可以的,默认状态下向putty中输入中文会变成...可以用以下方法解决: 
Category中选择Window=>Appearance=>change...将字体设置为Fixedsys字符集设置为CHINESE_GB2312 
将Cursor appearance 设置为Underline. 
然后别忘了save一下要不就得每次更改了。字体其实可以根据你的喜好设定,主要是要把字符集设置为CHINESE_GB2312

2013年2月3日星期日

2012工作总结


  自从2012年二月一日加入公司,现在已经工作一年了。

  这一年的表现可以用虎头蛇尾来概括。其中一些暴露的问题是我长久以来就已经发现的,但是出于懒惰或者急躁,对于这些问题没有正视,更谈不上重视,所以常常重复这些错误。而这个是职场的大忌,尤其是无法获得上级的信任。

  总结来说暴露的问题有以下几点:
  1)思考,分析不足的情况下就匆忙动手去做。
  2)不够细心,对于检查和测试大而化之
  3)没有清晰的责任观念,例如,哪些是分内事,哪些是分外事。
  4)缺乏周期性的正式总结,反思自己的问题

  在这些问题上,我吃了很多亏,很多还是哑巴亏,也得到了应有的惩罚。对于这些问题再也不敢忽视或者轻视,因为这些问题不克服,那么从个人能力来讲,我无法进入修炼的下一个阶段。

  对于1),我认为既是我的性格问题也是我的思维层次问题。从性格来讲,我很急躁,贪快,贪多,总是希望一口吃成一个大胖子,但是在这样的心态下工作,往往会产生很多错误,包括设计失误,实现失误,缺陷率高,测试不合格等。
  分析这种心态的产生原因,在于希望可以短时间学更多的东西,并且付诸实践,获得感性理想体验,然后再反思,通过阅读理论来总结这些问题。这种方法最大的问题在于混淆了在学校和在公司编程。在学校编程,一般来讲只关注functionality,很少或者几乎没有人关注bug和测试。但是在公司,开发者必须对所有经手的任务负责,所以不但强调functionality,更看重bug,测试,文档等一系列的任务。因为我们直接面对的客户,作为使用者,他们的用户体验与上述活动紧密相关。如果客户体验上不去,开发就没有达到目的。
  为了解决这个问题,首先我会保持谦虚的心态,阅读To be a humble programmer,宁愿牺牲一些速度,但是严格保证程序的质量。围绕在公司编程的特点,开始的时候多走几次test procedures,更为关键的是事先分析有哪些scenarios,每一种的优缺点,以及克服每种情况产生的问题的办法,综合权衡,谋定而后后动,避免边做边想firefighter般假忙碌状态。因为在公司编程如果一开始就没有规划好,那么进度越大,困难也会指数般增长,白白浪费了许多返工的时间。
  
  从思维层次角度讲,我缺乏一些基本的思维方法或者说综合运用这些方法的意识,例如发散思维,逆向思维,全面分析等。不管是从广度还是深度来讲,都缺乏有意识的训练。查阅了一些资料,培养的方法有下棋,辩论和写作。我准备每周写一篇总结,同时学习一些基本的辩论思维方法,如果还有时间的话会学习GRE中argument,再有时间的话会学习下棋。总之,按照我过去的经验,我觉得思维训练是可行的,辅以正确的方法,价值大量的练习,我相信会得到大幅提高。

相对于1),2),3)&4)都是我性格,技巧,思维缺陷的不同层面的投影,或投之于人际关系,或投之于责任划分,或投之于内心。总而言之,以前那套觉得编程牛,速度快就行的想法已经过时了,因为编程服务的对象变了。在公司,其实少犯错误才是最重要的。

2012年12月1日星期六

lsof查看端口被哪些程序在使用

 http://blog.csdn.net/dl88250/article/details/1715489

lsof -i tcp:1521 -n
lsof的功能很強,詳細的說明我們可以用lsof --help去看,再想看更詳細的說明就是用 man lsof了喲。。
不多說了,查看某個port被那些程式打開的語法如下:
lsof -i TCP:port -n 
lsof -i UDP:port -n
lsof -i :port -n

# lsof -i tcp:1521 -n

2012年11月20日星期二

gcc -m32

ilStartTime = time( 0 );

printf( "End Time <%19.19s>\n", ctime( &ilStartTime ) );

如果在64为机器上例如:Linux DXBVM 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

gcc编译时记得加上-m32

2012年10月11日星期四

In function `_start':(.text+0x18): undefined reference to `main'

http://topic.csdn.net/u/20070706/13/ff451696-6e9a-4970-811b-f534820035ca.html

http://blog.csdn.net/jjzhoujun2010/article/details/6525170

http://topic.csdn.net/u/20100320/16/b85540b6-957f-4d7d-af66-4d38f1a53953.html

2012年8月23日星期四

在Linux里设置环境变量的方法(export PATH)

http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html

在Linux里设置环境变量的方法(export PATH)

一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是我的编译工具,则有如下三种方法来设置环境变量:

1、直接用export命令:
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin查看是否已经设好,可用命令export查看:[root@localhost bin]# exportdeclare -x BASH_ENV="/root/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.GB18030"
declare -x LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/au1200_rm/build_tools"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/opt/au1200_rm/build_tools/bin"
declare -x PWD="/opt/au1200_rm/build_tools/bin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-XX3LKWhz/agent.4242"
declare -x SSH_CLIENT="10.3.37.152 2236 22"
declare -x SSH_CONNECTION="10.3.37.152 2236 10.3.37.186 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="linux"
declare -x USER="root"
declare -x USERNAME="root"

可以看到,环境变量已经设好,PATH里面已经有了我要加的编译器的路径。

2、修改profile文件: 
#vi /etc/profile 
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

3. 修改.bashrc文件:
# vi /root/.bashrc
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
# echo $PATH
看看输出里面是不是已经有了/my_new_path这个路径了。

-----------------------------------------------------------------------------------------------------------------------
 “/bin”、“/sbin”、“/usr/bin”、“/usr/sbin”、“/usr/local/bin”等路径已经在系统环境变量中了,如果可执行文件在这几个标准位置,在终端命令行输入该软件可执行文件的文件名和参数(如果需要参数),回车即可。
  如果不在标准位置,文件名前面需要加上完整的路径。不过每次都这样跑就太麻烦了,一个“一劳永逸”的办法是把这个路径加入环境变量。命令 “PATH=$PATH:路径”可以把这个路径加入环境变量,但是退出这个命令行就失效了。要想永久生效,需要把这行添加到环境变量文件里。有两个文件可 选:“/etc/profile”和用户主目录下的“.bash_profile”,“/etc/profile”对系统里所有用户都有效,用户主目录下 的“.bash_profile”只对这个用户有效。
  “PATH=$PATH:路径1:路径2:...:路径n”,意思是可执行文件的路径包括原先设定的路径,也包括从“路径1”到“路径n”的所 有路径。当用户输入一个一串字符并按回车后,shell会依次在这些路径里找对应的可执行文件并交给系统核心执行。那个“$PATH”表示原先设定的路径 仍然有效,注意不要漏掉。某些软件可能还有“PATH”以外类型的环境变量需要添加,但方法与此相同,并且也需要注意“$”。
  注意,与DOS/Window不同,UNIX类系统环境变量中路径名用冒号分隔,不是分号。另外,软件越装越多,环境变量越添越多,为了避免造成混乱,建议所有语句都添加在文件结尾,按软件的安装顺序添加。
  格式如下():
  # 软件名-版本号
  PATH=$PATH:路径1:路径2:...:路径n
  其他环境变量=$其他环境变量:...
  在“profile”和“.bash_profile”中,“#”是注释符号,写在这里除了视觉分隔外没有任何效果。
  设置完毕,注销并重新登录,设置就生效了。如果不注销,直接在shell里执行这些语句,也能生效,但是作用范围只限于执行了这些语句的shell。
  相关的环境变量生效后,就不必老跑到软件的可执行文件目录里去操作了

linux中用C语言对环境变量设置

http://blog.csdn.net/xwdok/article/details/619728



getenv(取得环境变量内容)
相关函数
putenv,setenv,unsetenv
表头文件
#include<stdlib.h>
定义函数
char * getenv(const char *name);
函数说明
getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。
返回值
执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。
范例
#include<stdlib.h>
mian()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER=%s/n”,p);
}
执行
USER = root



putenv(改变或增加环境变量)
相关函数
getenv,setenv,unsetenv
表头文件
#include4<stdlib.h>
定义函数
int putenv(const char * string);
函数说明
putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
返回值
执行成功则返回0,有错误发生则返回-1。
错误代码
ENOMEM 内存不足,无法配置新的环境变量空间。
范例
#include<stdlib.h>
main()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER =%s/n”,p);
putenv(“USER=test”);
printf(“USER+5s/n”,getenv(“USER”));
}
执行
USER=root
USER=root



setenv(改变或增加环境变量)
相关函数
getenv,putenv,unsetenv
表头文件
#include<stdlib.h>
定义函数
int setenv(const char *name,const char * value,int overwrite);
函数说明
setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
参数
value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容 会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
返回值
执行成功则返回0,有错误发生时返回-1。
错误代码
ENOMEM 内存不足,无法配置新的环境变量空间
范例
#include<stdlib.h>
main()
{
char * p;
if((p=getenv(“USER”)))
printf(“USER =%s/n”,p);
setenv(“USER”,”test”,1);
printf(“USER=%s/n”,getenv(“USEr”));
unsetenv(“USER”);
printf(“USER=%s/n”,getenv(“USER”));
}
执行
USER = root
USER = test
USER = (null)

shell脚本和sqlplus间的交互

http://www.ms2006.com/archives/99


有些时候我们可能需要shell脚本通过oracle的sqlplus执行一些sql,并对结果集进行相关的操作。这里大致总结有如下几种方法
  • 直接获取单个值
  • 1
    2
    3
    4
    5
    6
    7
    
    #!/bin/bash
    result=`sqlplus -S system/password <<EOF
    set heading off feedback off pagesize 0 verify off echo off numwidth 4
    select 1 from dual;
    exit
    EOF`
    echo $result #将返回sql执行的结果
  • 将shell的参数传递给sqlplus
  • 1
    2
    3
    4
    5
    6
    
    #!/bin/bash
    TEST="table_name"
    sqlplus -S system/password <<EOF
    select * from user_tables where table_name = upper('$TEST');
    exit
    EOF
  • sqlplus的结果含有多个列值
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #使用上篇日志的例子
    result=`sqlplus -S system/password <<EOF
    set heading off feedback off pagesize 0 verify off echo off numwidth 4
    select t2.used,t1.maxsize from (select count(file_name)*32 maxsize from dba_data_files where tablespace_name ='$TBS_NAME') t1,(select trunc(sum(bytes)/1024/
    1024/1024) used from dba_data_files where tablespace_name='$TBS_NAME') t2;
    exit
    EOF`
     
    USED=`echo $result |cut -d " " -f1`
    MAXSIZE=`echo $result |cut -d " " -f2`
    最后两行就是对多结果集的处理,该查询语句将返回两列。不管是两列还是多列。系统都是用空格作为分隔符的顺序输出。所以我们通过上面两行就可以取到需要的值。如果列数或行数较多,可以使用其他方法,如for等。
    但是一定要注意,返回的结果集数据里面本身是否就含有空格~不要造成无伤

    shell脚本与c语言对比学习

    http://blog.csdn.net/xj178926426/article/details/6923745


    最近由于工作的关系,粗略的接触到一点脚本,之前也接触过,只是之前没有写过,只是偶尔自己加几句话怎么的。今天自己动手写啦一下,把shell对比于C语言的一些不同写在这里,当作自己学习的一个笔记,如果有不足之处还望各位牛人指出。
               不说这么多的废话吧,还是直接上代码:
    [plain] view plaincopy
    1. #!/bin/sh  
    2. start_command()  
    3. {  
    4.         echo "the first argument is :" $1   
    5.         do_it()  
    6.         {  
    7.                 local rc=0  
    8.                 echo "I just test !"  
    9.                 echo "Input Error !"  
    10.         }  
    11.         while [ 1 ] ; do  
    12.         read finished  
    13.         case $finished in  
    14.         1) echo "your input is 1 !" ;;  
    15.         2) echo "your input is 2 !" ;;  
    16.         q) echo "quit successful !"   
    17.            break ;;  
    18.         *) do_it ;;  
    19.         esac  
    20.         done  
    21. }  
    22.   
    23. start_command "hello world !"  
    24. exit 0  

     
    程序运行的结果:
    [plain] view plaincopy
    1. the first argument is : hello world !  
    2. 1  
    3. your input is 1 !  
    4. 2  
    5. your input is 2 !  
    6. 3  
    7. I just test !  
    8. Input Error !  
    9. 2  
    10. your input is 2 !  
    11. 1  
    12. your input is 1 !  
    13. q  
    14. quit successful !  

     
    由于自己没有系统的看过shell语法的书,在这里只是简单的把shell的语法类比于C语言的来学习。通过这上面一个简单的例子,我主要归纳出啦下面3点得不同。
              1shell中函数的定义与函数的调用。
              在shell中,函数的定义不需要像在C语言中那样要指明函数的返回值类型,函数的参数个数以及每个参数的类型。
    写到这里大家首先会想到难道shell中的函数都没有返回值么?不是,shell中的函数可以有返回值的,下面我通过自己总结的两个方法来讲解:1echo法,2)全局变量法。
             1)echo
    在被调用函数中需要返回的值,使用echo将其显示至stdout,然后在调用的地方再使用`func var1`获得stdout中的值,获得值可以直接赋值给变量。例如:
    [plain] view plaincopy
    1. #!/bin/bash  
    2. #  echo法,返回一个字符串的长度  
    3. varCnt()  
    4. {  
    5.         var=$1  
    6.         ret=0  
    7.         if [ "$var" != "" ] ; then  
    8.                 ret=${#var}  
    9.         fi  
    10.         echo $ret  
    11.   
    12. }  
    13.   
    14. main()  
    15. {  
    16.         printf "varCnt's 's return value is %s "  `varCnt ""`  
    17.         printf "varCnt's 's return value is %s "  `varCnt "12345678"`  
    18.   
    19. }  
    20.   
    21. main  
    22.   
    23. exit  0  

    程序运行结果:
    [plain] view plaincopy
    1. root@james-desktop:/home/workspace/mycode# ./testecho.sh   
    2. varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8   

     
                 2)全局变量法
      这个比较简单,声明一个全局变量 declare -i g_ret ,在function的返回值存储在全局变量中。调用处在函数执行完后,使用就可以了。例如:
    [plain] view plaincopy
    1. #!/bin/bash  
    2.   
    3. #  全局变量法,返回一个字符串的长度  
    4. varCntGlobeVar()  
    5. {  
    6.         var=$1  
    7.         if [ "$var" != "" ] ; then  
    8.                 g_ret=${#var}  
    9.         fi  
    10. }  
    11.   
    12. main()  
    13. {  
    14.         declare -i g_ret=0  
    15.         varCntGlobeVar ""  
    16.         printf "varCntGlobeVar's 's return value is %d "  $g_ret  
    17.         varCntGlobeVar "12345678"  
    18.         printf "varCntGlobeVar's 's return value is %d "  $g_ret  
    19. }  
    20.   
    21. main  
    22. exit 0  

    程序运行结果:
    [plain] view plaincopy
    1. root@james-desktop:/home/workspace/mycode# ./testvar.sh   
    2. varCntGlobeVar's 's return value is 0 varCntGlobeVar's 's return value is 8  

     
    通过这两个脚本运行的结果来看,这两个方法都是可以的,目前只想到这两种方法,各位要是还有其他的办法可以告诉我一下。
         Shell中的函数的参数都可以在shell函数中通过$0,$1.......一些相关的特殊变量得到,而不需要跟C语言中的函数一样通过值传递的方式给函数传递参数。相应的shell中函数的掉用也不同,直接通过函数名就可以,函数后面的圆括号都不要,然后要是有参数的话就直接在函数名后面加空格,然后输入参数就可以,如果是多个参数的话,中间要用空格分开。
    还有一个比较重要的区别就是shell中的定义可以是在另一函数体内的,如上面的第一个例子中的那样。
              2shell中的与C语言中的条件判断不同。
    之前我一直以为在shell中与在C语言中条件判断的就是使用的符号不同,shell中是中括号,C语言中是圆括号。但是这个中括号不是简单的中括号,下面就有我来简单的说一下:
    这个左中括号(注意我说的是左中括号)"["LinuxUnix系统中的test命令的别名,test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。
    当您使用左方括号而非 test ,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。
    test 和 的语法如下:
    test expression
    [ expression ]
    在这两种情况下,test 都评估一个表达式,然后返回真或假。如果它和 ifwhile 或 until 命令结合使用,则您可以对程序流进行广泛的控制。不过,您无需将 test 命令与任何其它结构一起使用;您可以从命令行直接运行它来检查几乎任何东西的状态。
    因为它们彼此互为别名,所以使用 test 或 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。
               3shell中的switch/case语句与C语言中的区别。
    这么写大家肯定要说我,因为在shell中就没有switch/case语句。不过case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。大家看到我的第一个例子就是通过break语句直接跳出while循环。
    好吧,先写到这里,以后想到啦再补充,如果有什么不足之处还请大家一定指出,一起学习一起提高哈。呵呵!加油!