shell环境
1 引言
一个进程运行在shell环境中,理解进程运行的环境是十分重要的。环境影响着进程的行为,利用环境提供的便利,可以极大地提高开发效率。本节深入讨论shell中与进程有关的环境问题,包括命令行参数、环境变量和错误号变量等。
2 命令行参数
2.1 简介
当一个新进程执行时,命令行参数和环境变量是两个非常重要的信息。这两个信息都是新进程从产生它的父进程那里获得的,其获得方式也有不同。命令行参数作为main函数的参数被传入到新进程中,而环境变量是作为一种全局变量被新进程所使用的。
对于C语言来说,程序的执行时从main函数开始的。main函数的原型如下:
int main(int argc, char * argv[])
其中,argc是命令行参数的个数,argv是指向参数的字符串指针数组,其中每一个元素都是一个字符串,以‘\0’结尾。在执行一个程序的时候,调用exec()函数的进程会把命令行参数传递给新程序。下面的示例程序就是打印命令行参数:
//print command line parameters to stdout
#include <stdio.h> int main(int argc, char * argv[])
{
int i; printf("Counts of arguments: %d\n", argc);
for (i = ; i < argc; i++)
printf("argv[%d]: %s\n", i, argv[i]); return ;
}
main.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ gcc main.c -o app
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app -o yes ok
Counts of arguments:
argv[]: ./app
argv[]: -o
argv[]: yes
argv[]: ok
argv[]:
2.2 获取文件名
命令行参数数组的第一个元素(即argv[0])是程序的路径名,并不是该程序的文件名。如果希望在程序中使用该程序文件的文件名,则需要做特殊处理。下面实现了一个获取程序文件名的函数,这个函数以一个文件的路径为参数,并且寻找该路径中的最后一个“/”,那么这个“/”右边就是函数需要找的程序文件名。
//get program file name
#include <stdio.h>
#include <string.h> char* getFileName(char* fullName)
{
char *p;
//find the last symbol '/' from fullName
p = rindex(fullName, '/');
if (p == '\0')
p = fullName;//it is already a file name
else
p++;//move to next position return p;
} int main(int argc, char * argv[])
{
char *p; p = getFileName(argv[]);
printf("directory: %s\n", argv[]);
printf("file name : %s\n", p); return ;
}
main.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
directory: ./app
file name : app
注意:argv[argc]是一个NULL指针,这一点不会由机器自动完成,但是此定义遵守ISO C。所以,在编写传递命令行参数的代码时要注意使argv[argc]的值为NULL。
因此,在遍历命令行参数的时候,处理的循环可以写成如下的形式:
for (i = ; argv[i] != NULL; i++)
3 环境变量
3.1 概述
环境变量和命令行参数的情况有所不同。每个程序都会有一个环境变量表,和命令行参数表一样,环境变量表也是一个指针数组。
extern char ** environ;
每个环境变量的表示形式为:
环境变量名=环境变量值(最后有一个‘\0’结束符)
环境变量表就是由若干个这样的字符串组成的,最后由一个NULL指针作为结束标志。下面的实例演示了打印进程的环境变量,该程序顺序遍历环境变量表,并输出每一个环境变量值。
//print environment argument table content
#include <stdio.h>
extern char ** environ; int main(int argc, char * argv[])
{
int i;
for (i = ; environ[i] != NULL; i++)
printf("[%d] : %s\n", i, environ[i]);
return ;
}
main.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
[] : XDG_VTNR=
[] : LC_PAPER=zh_CN.UTF-
[] : LC_ADDRESS=zh_CN.UTF-
[] : XDG_SESSION_ID=c1
[] : XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xiaomanon
[] : SELINUX_INIT=YES
[] : LC_MONETARY=zh_CN.UTF-
[] : CLUTTER_IM_MODULE=xim
[] : GPG_AGENT_INFO=/run/user//keyring-Lk6lyR/gpg::
[] : TERM=xterm
[] : VTE_VERSION=
[] : SHELL=/bin/bash
[] : WINDOWID=
[] : LC_NUMERIC=zh_CN.UTF-
[] : UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session//
[] : GNOME_KEYRING_CONTROL=/run/user//keyring-Lk6lyR
[] : GTK_MODULES=overlay-scrollbar:unity-gtk-module
[] : USER=xiaomanon
[] : LS_COLORS=rs=:di=;:ln=;:mh=:pi=;:so=;:do=;:bd=;;:cd=;;:or=;;:su=;:sg=;:ca=;:tw=;:ow=;:st=;:ex=;:*.tar=;:*.tgz=;:*.arj=;:*.taz=;:*.lzh=;:*.lzma=;:*.tlz=;:*.txz=;:*.zip=;:*.z=;:*.Z=;:*.dz=;:*.gz=;:*.lz=;:*.xz=;:*.bz2=;:*.bz=;:*.tbz=;:*.tbz2=;:*.tz=;:*.deb=;:*.rpm=;:*.jar=;:*.war=;:*.ear=;:*.sar=;:*.rar=;:*.ace=;:*.zoo=;:*.cpio=;:*.7z=;:*.rz=;:*.jpg=;:*.jpeg=;:*.gif=;:*.bmp=;:*.pbm=;:*.pgm=;:*.ppm=;:*.tga=;:*.xbm=;:*.xpm=;:*.tif=;:*.tiff=;:*.png=;:*.svg=;:*.svgz=;:*.mng=;:*.pcx=;:*.mov=;:*.mpg=;:*.mpeg=;:*.m2v=;:*.mkv=;:*.webm=;:*.ogm=;:*.mp4=;:*.m4v=;:*.mp4v=;:*.vob=;:*.qt=;:*.nuv=;:*.wmv=;:*.asf=;:*.rm=;:*.rmvb=;:*.flc=;:*.avi=;:*.fli=;:*.flv=;:*.gl=;:*.dl=;:*.xcf=;:*.xwd=;:*.yuv=;:*.cgm=;:*.emf=;:*.axv=;:*.anx=;:*.ogv=;:*.ogx=;:*.aac=;:*.au=;:*.flac=;:*.mid=;:*.midi=;:*.mka=;:*.mp3=;:*.mpc=;:*.ogg=;:*.ra=;:*.wav=;:*.axa=;:*.oga=;:*.spx=;:*.xspf=;:
[] : LC_TELEPHONE=zh_CN.UTF-
[] : XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
[] : XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
[] : SSH_AUTH_SOCK=/run/user//keyring-Lk6lyR/ssh
[] : DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
[] : XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
[] : DESKTOP_SESSION=ubuntu
[] : PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
[] : QT_IM_MODULE=ibus
[] : QT_QPA_PLATFORMTHEME=appmenu-qt5
[] : LC_IDENTIFICATION=zh_CN.UTF-
[] : PWD=/home/xiaomanon/Documents/c_code
[] : JOB=gnome-session
[] : XMODIFIERS=@im=ibus
[] : LANG=en_US.UTF-
[] : GDM_LANG=en_US
[] : MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
[] : LC_MEASUREMENT=zh_CN.UTF-
[] : UBUNTU_MENUPROXY=
[] : COMPIZ_CONFIG_PROFILE=ubuntu
[] : IM_CONFIG_PHASE=
[] : GDMSESSION=ubuntu
[] : SESSIONTYPE=gnome-session
[] : SHLVL=
[] : HOME=/home/xiaomanon
[] : XDG_SEAT=seat0
[] : LANGUAGE=en_US
[] : GNOME_DESKTOP_SESSION_ID=this-is-deprecated
[] : UPSTART_INSTANCE=
[] : UPSTART_EVENTS=started starting
[] : LOGNAME=xiaomanon
[] : DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vaiuLPOEru
[] : XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
[] : QT4_IM_MODULE=xim
[] : LESSOPEN=| /usr/bin/lesspipe %s
[] : INSTANCE=Unity
[] : TEXTDOMAIN=im-config
[] : UPSTART_JOB=unity-settings-daemon
[] : XDG_RUNTIME_DIR=/run/user/
[] : DISPLAY=:
[] : XDG_CURRENT_DESKTOP=Unity
[] : GTK_IM_MODULE=ibus
[] : LESSCLOSE=/usr/bin/lesspipe %s %s
[] : LC_TIME=zh_CN.UTF-
[] : TEXTDOMAINDIR=/usr/share/locale/
[] : LC_NAME=zh_CN.UTF-
[] : XAUTHORITY=/home/xiaomanon/.Xauthority
[] : COLORTERM=gnome-terminal
[] : _=./app
[] : OLDPWD=/home/xiaomanon/Documents
程序的运行结果是打印出很多的环境变量,这些环境变量是从调用exec()函数(即创建该进程的shell)中继承得来的。
命令行参数需要由程序员手动编写代码传递给新的进程,而环境变量则不需要这样做。环境变量的获取是由操作系统自动完成的,在引用的时候只需要声明外部变量(extern char **environ)就可以了。环境变量和命令行参数的另一个不同点是命令行参数可以人为输入,而环境变量只能从调用exec()函数的进程那里继承而来,而且在本进程中修改环境变量不会影响到其他进程。
修改命令行参数同样不会影响到其他进程,但是很少人去修改它,因为这样做是毫无意义可言的。
3.2 获取指定的环境变量
环境变量是一个字符指针数组,可以通过environ指针来访问其中的每一个元素,但是这种方式是不被推荐的。这里先介绍一种推荐的访问环境变量的方法,Linux环境下使用getenv()函数来得到一个环境变量,其函数原型如下:
#include <stdlib.h> char* getenv(const char* name);
getenv()函数的参数代表指定的环境变量的名称,该函数寻找一个形如“name=value”的字符串,然后将value字符串的内容作为环境变量的值返回。如果成功,getenv()函数返回该环境变量的字符串首地址;如果失败,则返回一个NULL指针。下面演示一个获取指定的环境变量的值,该程序调用getenv()函数得到指定的环境变量值,并将其输出。
//print the specified environment table content
#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
char *p; p = getenv("PATH");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$PATH = %s\n", p); return ;
}
main.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
$PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
3.3 设置环境变量
Linux系统允许用户设置一个环境变量的值,当该环境变量已经有值时,还可以将其替换。如果添加的环境变量尚未存在与环境变量表中,系统会为用户添加这个环境变量。Linux环境下使用putenv()函数对一个环境变量赋值,其函数原型如下:
#include <stdlib.h> int putenv(char *str);
putenv()函数将一个形如“name=value”的字符串放进环境变量表,如果原来有值则替换掉原来的环境变量值。该函数也可以用来添加一个以前不存在的环境变量,如果成功对环境变量赋值,则函数返回0;如果修改失败,则返回-1.
//set the specified environment table content
#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
char *p; //Get environ value
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p);
//Set environ value
if (putenv("HOME=/home/test") != )
{
perror("fail to put environ\n");
exit(-);
}
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p); //Set a non-exist environ value
if (putenv("NOEXIST=/tmp") != )
{
perror("fail to put environ\n");
exit(-);
}
p = getenv("NOEXIST");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$NOEXIST = %s\n", p); return ;
}
main.c
运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
$HOME = /home/xiaomanon
$HOME = /home/test
$NOEXIST = /tmp
补充:那么问题来了,要是想在原有环境变量值的基础上追加一条新的环境变量值,应该怎么做呢?
也可以使用setenv()函数对环境变量进行赋值,其函数原型如下:
#include <stdlib.h> int setenv(const char *name, const char *value, int rewrite);
setenv()函数的第1个参数代表要进行赋值的环境变量的名称,第2个参数代表该环境变量的新值,第3个参数用于决定是否覆盖已经存在的环境变量的值。如果rewrite的值为0,则不修改原来的值;如果rewrite的值为非0,则修改原来的值。如果成功对环境变量赋值,则setenv()函数返回0;否则,返回-1。看下面的示例程序:
//set the specified environment table content
#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
char *p; //Get environ value
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p); //Set environ value, do not change orignal value
if (setenv("HOME", "/home/test", ) != )
{
perror("fail to put environ\n");
exit(-);
}
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p); //Set environ value, change orignal value
if (setenv("HOME", "/home/test", ) != )
{
perror("fail to put environ\n");
exit(-);
}
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p); return ;
}
main.c
程序运行效果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
$HOME = /home/xiaomanon
$HOME = /home/xiaomanon
$HOME = /home/test
3.4 删除环境变量
Linux环境下使用unsetenv()函数删除一个环境变量的值,其函数原型如下:
#include <stdlib.h> int unsetenv(const char *name);
参数name表示要删除的环境变量名称,即使name所代表 的环境变量并不存在也不会出错。如果成功删除环境变量的值,函数的返回值为0;否则,返回-1。
下面的示例以删除一个环境变量的值。
//set the specified environment table content
#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
char *p; //Get environ value
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(-);
}
printf("$HOME = %s\n", p); //Delete environ value
if (unsetenv("HOME") != )
{
perror("fail to put environ\n");
exit(-);
}
p = getenv("HOME");
if (p == NULL)//get environ failed
{
perror("fail to get environ\n");
exit(EXIT_FAILURE);
}
printf("$HOME = %s\n", p); return ;
}
main.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./app
$HOME = /home/xiaomanon
fail to get environ
: Success
Linux下使用clearenv()函数清除所有环境变量表中的变量,其函数原型如下:
#include <stdlib.h> int clearenv();
clearenv()函数将环境变量连同值一起删除,而且连environ这个全局变量指针都会设置为NULL,撤销整个环境变量表。由此可见,对于此函数应该慎用。如果成功删除所有环境变量,函数返回0;否则,返回-1。
4 进程结束状态
4.1 得到进程结束状态
Linux程序员可以通过shell得到已结束进程的结束状态。
echo $?
$?是Linux shell中的一个内置变量,其中保存的是最近一次运行的进程的返回值。这个返回值有一下3种情况:
(1) 程序中的main函数运行结束,$?中保存main函数的返回值。
(2) 程序运行中调用exit函数结束运行,$?中保存exit函数的参数。
(3) 程序异常退出,$?中保存异常出错的错误号。
下面的程序用来测试程序的结束状态,该程序接收整型输入,如果输入数字0则正常退出。
#include <stdio.h> int main()
{
int i;
while ()
{
scanf("%d", &i);
if (i == )
break;
}
return ;
}
hello.c
程序运行效果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./hello xiaomanon@xiaomanon-machine:~/Documents/c_code$ echo $? xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./hello
^C (Ctrl+C)
xiaomanon@xiaomanon-machine:~/Documents/c_code$ echo $?
注意:首先,shell内置变量$?保存的是最近一次运行的进程的返回值,所以使用时窑确保在打印需要的进程返回值前不要有其他的操作,同时应该避免后台进程的干扰。其次,在运行程序是,如果程序运行出错,比如shell找不到指定的进程,那么$?内置变量中的值是1.
所以,在编写代码时如果没有出错,则不要使main函数的返回值为1;或者使用exit(1)这样的写法,以免引起不必要的混乱。
4.2 使用errno调试程序
调试一个程序往往有以下几种方法:
(1) 使用调试器
(2) 在程序中直接使用输出函数输出调试信息。
(3) 查看标准出错文件。
(4) 查看程序异常时所写的日志。
在Linux环境下执行系统调用时会出现一些错误,仅仅通过检查这些系统调用的返回值是不够的,开发者往往需要更多更详细的信息。C语言提供了一个全局变量errno,很好地弥补了Linux系统调用返回值信息不足的缺点。大多数Linux系统调用在出错时都会操作此变量,将其设置为一个特定的值,输出这个变量的值开发者就可以知道系统调用失败的原因,从而正确的排除错误。
说明:errno是一个整型变量,其定义在errno.c中,声明在errno.h中。
因此,如果希望在程序中使用此变量,应该在代码之前加上“#include <errno.h>”。下面的示例演示了使用errno变量输出出错信息。该程序试图打开一个不存在的文件,打开文件失败后使用errno变量输出其出错的原因。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h> int main(void)
{
int fd;
errno = ;//clear errno fd = open("./nothing.txt", O_RDWR);
if (errno == )
printf("Open Sucess.\n");
else{
printf("Fail to open, errno is : %d\n", errno);
exit(-);
} close(fd);
return ;
}
err.c
程序运行效果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./err
Fail to open, errno is :
xiaomanon@xiaomanon-machine:~/Documents/c_code$ touch nothing.txt
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./err
Open Sucess.
注意:因为errno是一个全局变量,所以该程序中所有的系统调用都会修改它的值,为了不让上一次的错误值影响这一次的判断,在使用errno变量之前需要将它清零。
4.3 输出出错的原因
由于errno只是一个整型值,必须通过查表才能知道其真正代表的错误原因,这样的理解不够直观。针对该问题,Linux提供了两个函数可以方便地完成由错误号到错误文字描述的转换。第一个函数是strerror(),根据错误号返回错误的字符描述,函数原型如下:
#include <string.h> char* strerror(int err);
我们对上一个程序做如下修改:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h> int main(void)
{
int fd;
errno = ;//clear errno fd = open("./nothing.txt", O_RDWR);
if (errno == )
printf("Open Sucess.\n");
else{
printf("Fail to open, reason : %s\n", strerror(errno));
exit(-);
} close(fd);
return ;
}
err.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./err
Fail to open, reason : No such file or directory
另一个函数是perror(),会根据全局变量errno和传入的字符串,打印一条出错信息,其函数原型如下:
#include <stdio.h> #include <errno.h> void perror(const char * pszInfo);
perror()函数表示要输出的字符串,系统自动将使用errno变量映射得到的错误文件描述的字符串链接在参数字符串的后面。该字符串不需要添加‘\n’,perror()函数会自动添加。因此,我们在上一个程序的基础上再做简单修改:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h> int main(void)
{
int fd;
errno = ;//clear errno fd = open("./nothing.txt", O_RDWR);
if (errno == )
printf("Open Sucess.\n");
else{
perror("fail to open");
exit(-);
}
close(fd);
return ;
}
err.c
程序运行结果如下:
xiaomanon@xiaomanon-machine:~/Documents/c_code$ ./err
fail to open: No such file or directory
参考资料
[1] 吴岳,Linux C程序设计大全,清华大学出版社
shell环境的更多相关文章
- windows python3.2 shell环境(python叫做解释器)
[进入python的shell 环境:](python里称作命令解释器,windows叫做cmd,unix叫做shell) cmd 输入set path=%path%;e:\python2.7然后输 ...
- 9. shell环境
• printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...
- Cygwin 是一个用于 Windows 的类 UNIX shell 环境
cygwin的安装使用 Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...
- shell 环境变量的相关配置文件和配置方法
shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...
- Linux编程 12 (默认shell环境变量, PATH变量重要讲解)
一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash shell支持的Bourne变量 Bo ...
- Linux下的Jenkins+Tomcat+Maven+Git+Shell环境的搭建使用(jenkins自动化部署)【转】
jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...
- mutt+msmtp实现在shell环境中发送电子邮件
作者:邓聪聪 为了自动化接收服务端的文件备份信息,利用mutt+msmtp在shell环境中发送电子邮件,轻松高效的完成运维工作. 下载msmtp wget http://downloads.sour ...
- shell环境改变引起的命令提示符改变
1. 故障现象与背景 1.1 背景 开发早上找我说root环境变得异常,跟平时不太一样.其他用户没有改变,就root用户发生变化 1.2故障现象 root用户命令提示符 :➜ ~ 命令行上命令提示符发 ...
- bash shell & 环境变量
root是没有~/.bashrc的,只. /etc/profile即可,/etc/profile和~/.bashrc的作用类似,只是作用域不同,都是写死的export,也有动态的脚本去设置命令和环境变 ...
随机推荐
- hdu 5120 Intersection 圆环面积交
Intersection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5 ...
- 深入理解C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将 ...
- js之createTextRange方法
createTextRange()方法作用: 主要是用来对一些文本对象进行操作.比如你有一大段文字,都在同一个P标签内,但是你只希望通过JS改变其中的一小部分,这时就可以用createTextRang ...
- 外网访问SVN
1.路由端口映射: 进入路由器管理管理界面-->转发规则-->虚拟服务器 将端口3690(svn默认端口)和你的局域网IP(如192.168.1.104)映射,勾上“启动”,保存,OK了. ...
- C# 之 后台加载图片Image
命名空间为 System.Drawing ,Image.FromFile 一旦使用后,对应的文件在一直调用其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图 ...
- hibernate3整合spring2时hibernate即用注解又用配置文件情况时spring配置文件的配置写法
hibernate只用注解时,spring的配置文件的配置如下 <bean id="dataSource" class="org.apache.commons.db ...
- Linux系统(将web应用部署到tomcat服务器上)
一:tomcat服务开机自启动 将启动命令路径配置到/etc/profile文件中在/etc/profile 文件最后配置 /usr/tomcat/apache-tomcat-6.0.45/bin/s ...
- easyUI 比较时间大小
// function toDate(str){ // var sd=str.split("-" ...
- eval()函数用法详解
eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数, ...
- Entity Framework 学习整理(分播客整理)
MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...