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环境的更多相关文章

  1. windows python3.2 shell环境(python叫做解释器)

    [进入python的shell 环境:](python里称作命令解释器,windows叫做cmd,unix叫做shell) cmd  输入set path=%path%;e:\python2.7然后输 ...

  2. 9. shell环境

    • printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...

  3. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...

  4. shell 环境变量的相关配置文件和配置方法

    shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...

  5. Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

  6. Linux下的Jenkins+Tomcat+Maven+Git+Shell环境的搭建使用(jenkins自动化部署)【转】

    jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...

  7. mutt+msmtp实现在shell环境中发送电子邮件

    作者:邓聪聪 为了自动化接收服务端的文件备份信息,利用mutt+msmtp在shell环境中发送电子邮件,轻松高效的完成运维工作. 下载msmtp wget http://downloads.sour ...

  8. shell环境改变引起的命令提示符改变

    1. 故障现象与背景 1.1 背景 开发早上找我说root环境变得异常,跟平时不太一样.其他用户没有改变,就root用户发生变化 1.2故障现象 root用户命令提示符 :➜ ~ 命令行上命令提示符发 ...

  9. bash shell & 环境变量

    root是没有~/.bashrc的,只. /etc/profile即可,/etc/profile和~/.bashrc的作用类似,只是作用域不同,都是写死的export,也有动态的脚本去设置命令和环境变 ...

随机推荐

  1. 【转载】Android Studio 设置内存大小及原理

    http://www.cnblogs.com/justinzhang/p/4274985.html http://tsroad.lofter.com/post/376316_69363ae Andro ...

  2. OpenCV快速遍历矩阵元素方法

    OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...

  3. Android多媒体-人脸识别

    1. 相关背景 Google 于2006年8月收购Neven Vision 公司 (该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并不是常快应用到免费的 Pic ...

  4. careercup-中等难度 17.7

    17.7 给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”). 解法: 举个例子,在转换19 323 984时,我们可以考虑分段处理 ...

  5. Views

    Views Views are the visual side of the Nova, they are the HTML output of the pages. Views can be loc ...

  6. iOS 8创建交互式通知

    iOS 8提供了一个令人兴奋的新API来创建交互式通知(interactive notifications),它能让你在你的应用之外为用户提供额外的功能.我发现网上还没有关于如何实现它的比较好的示例教 ...

  7. Windows批处理(cmd/bat)常用命令小结

    转载自:“趣IT”微信公共号 前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常 ...

  8. 搭建maven开发环境测试Hadoop组件HDFS文件系统的一些命令

    1.PC已经安装Eclipse Software,测试平台windows10及Centos6.8虚拟机 2.新建maven project 3.打开pom.xml,maven工程项目的pom文件加载以 ...

  9. .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)

    创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...

  10. 搭建高可用的MongoDB集群

    http://www.csdn.net/article/2014-04-09/2819221-build-high-avialable-mongodb-cluster-part-1/1 在大数据的时代 ...