Jan 06

GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。下表给出了一些主要的
预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。

预定义变量????????????????????? 含义
$*????????????? 不包含扩展名的目标文件名称。
$+????????????? 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$<????????????? 第一个依赖文件的名称。
$?????????????? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@????????????? 目标的完整名称。
$^????????????? 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$%????????????? 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称
??????????????? 为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
AR????????????? 归档维护程序的名称,默认值为 ar。
ARFLAGS???????? 归档维护程序的选项。
AS????????????? 汇编程序的名称,默认值为 as。
ASFLAGS???????? 汇编程序的选项。
CC????????????? C 编译器的名称,默认值为 cc。
CCFLAGS???????? C 编译器的选项。
CPP???????????? C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS??????? C 预编译的选项。
CXX???????????? C++ 编译器的名称,默认值为 g++。
CXXFLAGS??????? C++ 编译器的选项。
FC????????????? FORTRAN 编译器的名称,默认值为 f77。
FFLAGS????????? FORTRAN 编译器的选项。

出处:http://www.aka.org.cn/Lectures/001/Lecture-1/make.html

Jan 06

遍历并打印linux的环境变量的代码片段:

#include <stdlib.h>

//The ENVIRON variable contains the environment
extern char** environ;

int main(){
        char** var;
        for(var = environ; *var != NULL; ++var){
                printf("%s\n", *var);
        }
        return 0;
}
 

如果需要读取、设置或清楚环境变量,请分别man这几个:getenv、setenv、unsetenv。

Jan 06

1. 包含getopt.h
2. 定义短选项,比如,ho:v
3. 定义长选项结构,注意最后一项全部设为0
4. 未定义的选项,解析时会返回’?’
5. 含有参数的选项,参数存于全局变量optarg中
6. 非参数选项的起始索引,存于全局变量optind中

示例程序如下:

#include <stdlib.h></stdlib.h>
#include <stdio.h></stdio.h>
#include <getopt.h></getopt.h>

const char* program_name;

void print_usage(FILE* stream, int exit_code){
        fprintf(stream, "Usage: %s options [ inputfile ...]n", program_name);
        fprintf(stream, "    -h   –help        Display this uage information.n"
                        "    -v   –verbose     Print verbose message.n"
                        "    -o   –output filename    Write output to file.n");
        exit(exit_code);
}

int main(int argc, char* argv[]){
        int next_option;
        const char* short_options = "ho:v";
        const struct option long_options[] = {
                {"help", 0, NULL, ‘h’},
                {"output", 1, NULL, ‘o’},
                {"verbose", 0, NULL, ‘v’},
                {NULL, 0, NULL, 0}
                };
        const char* output_filename = NULL;
        int verbose = 0;
        program_name = argv[0];
        do{
                next_option = getopt_long(argc, argv, short_options, long_options, NULL);
                switch(next_option){
                        case ‘h’:
                                print_usage(stdout, 0);
                        case ‘o’:
                                //the global var optarg contains the specified argument
                                output_filename = optarg;
                                break;
                        case ‘v’:
                                verbose = 1;
                                break;
                        case ‘?’: //if the arg list contains invalid options
                                print_usage(stderr, 1);
                        case -1:
                                break;
                        default:
                                abort();
                }
        }while(next_option != -1);
        printf("[option] verbose: %dn", verbose);
        printf("[option] output: %sn", output_filename);
        if(verbose){
                int i;
                //the global var optind contains the index of the first nonoption argument
                for(i = optind; i<argc;></argc;>                        printf("Argument: %sn", argv[i]);
                }
        }
        return 0;
}

相应的Makefile:

CC=g++
CFLAGS=-Wall -g

all: getopt

getopt: getopt.o
        $(CC) $(CFLAGS) -o $@ $@.o

%.o: %.c
        $(CC) $(CFLAGS) -c $+

clean:
        rm -f *.o
        rm -f getopt

Nov 29

在虚拟机上安装了一个linux使用,缺省安装,启动起来就进入x-window。很多情况下,只是通过SSH连过去操作,并不需要图形界面。记一下,修改方法:

使用vi修改文件/etc/inittab

将里面默认runlevel从5修改到3即可。

不要设置为0或6。每个runlevel,在/etc/inittab都有详细注释。

Nov 10

虚拟机上装了一个Linux,很久不用,又忘记密码了,记一下恢复步骤吧:

我们可以使用单用户Linux 模式来登录,然后设置一个新的root口令。要进入单用户模式,重新引导计算机。如果我们使用的是默认的引导装载程序GRUB ,可以执行下列步骤来进入单用户模式:

1. 在引导装载程序菜单上,键入 e 来进入编辑模式。

2. 我们会面对一个引导项目列表。查找其中类似以下输出的那一行:

?kernel /vmlinuz-2.4.18-0.4 ro root=/dev/hda2

3. 按箭头键直到这一行被突出显示,然后按 e

4. 按一下空格键来添加一个空格,然后添加 single 来通知GRUB 引导单用户Linux 模式。按 Enter ?键来使编辑结果生效。

5. 我们会被带回编辑模式屏幕,从这里,按? b ,GRUB 就会引导单用户 Linux 模式。载入结束后,会看到一个类似以下的 shell 提示:

?sh-3.0#

现在,可以设置root密码了,键入:

?sh-2.05# passwd root

屏幕会提示重新键入口令来校验。结束后,口令就会被改变,我们就可以在提示下键入 reboot 来重新引导;然后,象平常一样登录为根用户。Voila! Done!

Aug 26

换了新的虚拟主机,有很多文件需要迁移,其中一个问题是通过FTP把原服务器的文件夹拷贝过去。由于速度的原因,最好直接服务器对服务器拷贝。用FlashFXP的服务器对传发现不行,只好到处找批量下载的shell脚本或者程序。

无果之下,准备动手写一个,用Python中的ftplib模块。这时忽然发现Python安装目录的子目录[Tools/Scripts]里面,有一个ftpmirror.py!Hallelujah!正是我要找的!

它的使用文档是:

Mirror a remote ftp subtree into a local directory tree.

usage: ftpmirror [-v] [-q] [-i] [-m] [-n] [-r] [-s pat]
[-l username [-p passwd [-a account]]]
hostname[:port] [remotedir [localdir]]
-v: verbose
-q: quiet
-i: interactive mode
-m: macintosh server (NCSA telnet 2.4) (implies -n -s ‘*.o’)
-n: don’t log in
-r: remove local files/directories no longer pertinent
-l username [-p passwd [-a account]]: login info (default .netrc or anonymous)
-s pat: skip files matching pattern
hostname: remote host w/ optional port separated by ‘:’
remotedir: remote directory (default initial)
localdir: local directory (default current)

比如,复制远程服务器ftp.somewhere.com上/huashi文件夹及所有内容,保存到本地的/home/frank/huashi下,命令是:

python ftpmirror.py -v -l ftp_login_name -p ftp_password ftp.somewhere.com /huashi /home/frank/huashi

剩下的就是等待了,:D

Aug 26

在使用ls列出文件的时候,我比较习惯于那种有文件的显示。今天把主机空间迁移到了dreamhost,发现有SSH可以使用,但是习惯在redhat上敲的ll命令却不能使用,这下得自己动手,解决一下了。

这个简单,执行命令:

alias ll=’ls -l –color=auto’

然后就可以了。但是问题是,下次SSH登录上去,发现这个alias就没有了。怎么办呢?修改了文件.alias,无效;修改了文件.bashrc,无效;最后在zhenyang的帮助下,把那面那行命令加入到了文件.bash_profile中,bingo!终于成功了!