Ⅰ 为什么linux下面的open函数有2种原型这样做有什么好处呢求正解。。。
 那叫:可变参数。
当其第二个参数含有O_CREAT 时,第三个参数才有效。表示的是当使用open系统调用创建一个文件时,其文件的访问权限是多少,第三个参数可以指定为0755,0644等,也可以用系统提供的宏:S_IRWXU、S_IRUSR等代替,一个作用。
两个都是posix标准,事实上两个函数是一个。 
Ⅱ linux设置环境变量path
 变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。
Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。《Linux就该这幺学》一起来学习更多linux知识。
PASH环境变量的设置方法:
方法一:用户主目录下的.profile或.bashrc文件(推荐)
登录到你的用户(非root),在终端输入:
$ sudo gedit ~/.profile(or .bashrc)
可以在此文件末尾加入PATH的设置如下:
export PATH=」$PATH:your path1:your path2 ...」
保存文件,注销再登录,变量生效。
该方式添加的变量只对当前用户有效。
方法二:系统目录下的profile文件(谨慎)
在系统的etc目录下,有一个profile文件,编辑该文件:
$ sudo gedit /etc/profile
在最后加入PATH的设置如下:
export PATH=」$PATH:your path1:your path2 ...」
该文件编辑保存后,重启系统,变量生效。
该方式添加的变量对所有的用户都有效。
方法三:系统目录下的 environment 文件(谨慎)
在系统的etc目录下,有一个environment文件,编辑该文件:
$ sudo gedit /etc/environment
找到以下的 PATH 变量:
PATH="<......>"
修改该 PATH 变量,在其中加入自己的path即可,例如:
PATH="<......>:your path1:your path2 …"
各个path之间用冒号分割。该文件也是重启生效,影响所有用户。
注意这里不是添加export PATH=… 。
方法四:直接在终端下输入
$ sudo export PATH="$PATH:your path1:your path2 …"
这种方式变量立即生效,但用户注销或系统重启后设置变成无效,适合临时变量的设置。 
Ⅲ printf这样参数可变的函数如何封装
 C中的可变参数研究
一. 何谓可变参数
int printf( const char* format, ...); 
这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用」…」表示). 而我们又可以用各种方式来调用printf,如:
printf("%d",value); 
printf("%s",str); 
printf("the number is %d ,string is:%s", value, str);
二.实现原理
C语言用宏来处理这些可变参数。这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。下面我们来分析这些宏。在VC中的stdarg.h头文件中,针对不同平台有不同的宏定义,我们选取X86平台下的宏定义:
typedef char *va_list; 
/*把va_list被定义成char*,这是因为在我们目前所用的PC机上,字符指针类型可以用来存储内存单元地址。而在有的机器上va_list是被定义成void*的*/
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
/*_INTSIZEOF(n)宏是为了考虑那些内存地址需要对齐的系统,从宏的名字来应该是跟sizeof(int)对齐。一般的sizeof(int)=4,也就是参数在内存中的地址都为4的倍数。比如,如果sizeof(n)在1-4之间,那么_INTSIZEOF(n)=4;如果sizeof(n)在5-8之间,那么_INTSIZEOF(n)=8。*/
#define va_start(ap,v)( ap = (va_list)&v + _INTSIZEOF(v) )
/*va_start的定义为 &v+_INTSIZEOF(v) ,这里&v是最后一个固定参数的起始地址,再加上其实际占用大小后,就得到了第一个可变参数的起始内存地址。所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在的内存地址*/
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
/*这个宏做了两个事情,
①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值
②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。*/
#define va_end(ap) ( ap = (va_list)0 ) 
/*x86平台定义为ap=(char*)0;使ap不再 指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 在这里大家要注意一个问题:由于参数的地址用于va_start宏,所以参数不能声明为寄存器变量或作为函数或数组类型. */
以下再用图来表示:
在VC等绝大多数C编译器中,默认情况下,参数进栈的顺序是由右向左的,因此,参数进栈以后的内存模型如下图所示:最后一个固定参数的地址位于第一个可变参数之下,并且是连续存储的。
|——————————————————————————|
|最后一个可变参数 | ->高内存地址处
|——————————————————————————|
...................
|——————————————————————————|
|第N个可变参数 | ->va_arg(arg_ptr,int)后arg_ptr所指的地方,
| | 即第N个可变参数的地址。
|——————————————— | 
………………………….
|——————————————————————————|
|第一个可变参数 | ->va_start(arg_ptr,start)后arg_ptr所指的地方
| | 即第一个可变参数的地址
|——————————————— | 
|———————————————————————— ——|
| |
|最后一个固定参数 | -> start的起始地址
|—————————————— —| .................
|—————————————————————————— |
| |
|——————————————— |-> 低内存地址处
三.printf研究
下面是一个简单的printf函数的实现,参考了中的156页的例子,读者可以结合书上的代码与本文参照。
#include "stdio.h"
#include "stdlib.h"
void myprintf(char* fmt, ...) //一个简单的类似于printf的实现,//参数必须都是int 类型
{ 
char* pArg=NULL; //等价于原来的va_list 
char c;
pArg = (char*) &fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值
pArg += sizeof(fmt); //等价于原来的va_start 
do
{
c =*fmt;
if (c != '%')
{
putchar(c); //照原样输出字符
}
else
{
//按格式字符输出数据
switch(*++fmt) 
{
case 'd':
printf("%d",*((int*)pArg)); 
break;
case 'x':
printf("%#x",*((int*)pArg));
break;
default:
break;
} 
pArg += sizeof(int); //等价于原来的va_arg
}
++fmt;
}while (*fmt != '\0'); 
pArg = NULL; //等价于va_end
return; 
}
int main(int argc, char* argv[])
{
int i = 1234;
int j = 5678;
myprintf("the first test:i=%d",i,j); 
myprintf("the secend test:i=%d; %x;j=%d;",i,0xabcd,j); 
system("pause");
return 0;
}
在intel+win2k+vc6的机器执行结果如下:
the first test:i=1234
the secend test:i=1234; 0xabcd;j=5678;
四.应用
求最大值:
#include //不定数目参数需要的宏
int max(int n,int num,...)
{
va_list x;//说明变量x
va_start(x,num);//x被初始化为指向num后的第一个参数
int m=num;
for(int i=1;i {
//将变量x所指向的int类型的值赋给y,同时使x指向下一个参数
int y=va_arg(x,int);
if(y>m)m=y;
}
va_end(x);//清除变量x
return m;
}
main()
{
printf("%d,%d",max(3,5,56),max(6,0,4,32,45,533));
} 
Ⅳ 在LINUX下C语言编程调用这个函数int open(argv[1],O_CREAT|O_RDWR,0755) 执行时参数是怎样给定的
你好,O_CREAT表示在argv[1]中的文件存在时,第三个参数没用,并且以读写将其打开;argv[1]中的文件不存在时,则创建这个文件,并设置文件的权限为755,就是用chmod更改的文件权限,755表示对所有者可读可写可执行,对所属组可读可执行不可写,对其他用户可读可执行不可写。
Ⅳ 在Linux9.0中Shell提供变量来设置环境参数和保存shell信息。变量根据不同的作用可以分为哪四种变量设
 1)、四种变量分别为:本地变量、环境变量、位置参数变量和预定义变量。 
2)、变量=${参数变量:=woed}表示如果设置了参数变量,则用参数变量的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。如B=${C:=word}中,如果设置了C=good, word=bad时,则B=good; 如果C没有设置,word=bad,则B=bad,同时把B也设成bad。 
3)、$# 表示传递到脚本的参数的数量 
$! 表示后台运行的最后一个进程号 
$0 表示当前执行的进程名 
还有不会的请参考《linux就该这幺学》,针对各种linux疑难杂症,帮助linux学习者。 
Ⅵ Linux编程问题,execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);
 execl,l代表list,参数表的意思,
(char *) 0,代表空指针,说明参数表结束。
这个函数的原型是可变参数,空指针给库解析参数的时候防止程序错误。execl是个库函数,真正的系统调用是execve。 
Ⅶ linux中支不支持可变参数宏
 支持的:
本节主要分析宏定义的特殊用法。
一、#与##
1.#
#符号用作一个预处理运算符,它可以把语言符号转换成字符串。
eg:x是一个宏参数,那么#x可以把参数名转换成相应的字符串,这个过程叫字符串化。
test1.c
[cpp] view plain 
#include <stdio.h> 
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x)) 
int main(void) 
{ 
 int y =4; 
 PSQR(y); 
 PSQR(2+4); 
 return 0; 
} 
 
/*result: 
the square ofyis 16. 
the square of2+4is 36. 
*/ 
gcc test1.c -o test1
./test1
[plain] view plain 
the square ofyis 16. 
the square of2+4is 36. 
2.##
该运算符把两个语言符号组合成单个语言符号。
test2.c
[cpp] view plain 
#include <stdio.h> 
#define XNAME(n) x##n 
#define PXN(n) printf("x"#n" = %d\n",x##n) 
int main(void) 
{ 
 int XNAME(1)=12;//int x1=12; 
 PXN(1);//printf("x1 = %d\n", x1); 
 return 0; 
} 
 
/*result: 
x1 = 12 
*/ 
gcc test2.c -o test2
./test2
[plain] view plain 
x1 = 12 
二、可变参数宏与__VA_ARGS__
__VA_ARGS__是一个可变参数宏,是新的C99规范中新增的,目前只有gcc支持(VC6.0的编译器不支持)。
宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。
简单例子:
test3.c
[cpp] view plain 
#include <stdio.h> 
#define PR(...) printf(__VA_ARGS__) 
int main() 
{ 
 int wt=1,sp=2; 
 PR("hello\n"); 
 PR("weight = %d, shipping = %d\n",wt,sp); 
 return 0; 
} 
/*result: 
hello 
weight = 1, shipping = 2 
*/ 
gcc test3.c -o test3
./test3
[plain] view plain 
hello 
weight = 1, shipping = 2 
三、在Linux内核系统调用中的应用
公共界面:
common.h(相当与内核中的systemcalls.h)
[cpp] view plain 
#define __SC_DECL1(t1, a1) t1 a1 
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) 
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) 
#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__) 
#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__) 
#define __SYSCALL_DEFINEx(x, name, ...) \ 
 long sys##name(__SC_DECL##x(__VA_ARGS__)) 
#define SYSCALL_DEFINEx(x, sname, ...) \ 
 __SYSCALL_DEFINEx(x, sname, __VA_ARGS__) 
#define SYSCALL_DEFINE0(name) long sys_##name(void) 
#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) 
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) 
1.无参数
test4.c
[cpp] view plain 
#include <stdio.h> 
#include "common.h" 
 
long sys_tank(void); 
long sys_tankai(void); 
 
SYSCALL_DEFINE0(tank) 
{ 
 printf("TK--------_>>>>>>tank call ok!!!\n"); 
} 
 
SYSCALL_DEFINE0(tankai) 
{ 
 printf("TK--------_>>>>>>tankai call ok!!!\n"); 
} 
 
int main(){ 
 sys_tank(); 
 sys_tankai(); 
 return 0; 
} 
 
/*result: 
TK----->>>lianjie(a,b) is 20 
TK----->>>lianjie(4,5) is 45 
TK--------_>>>>>>tank call ok!!! 
TK--------_>>>>>>tankai call ok!! 
*/ 
gcc test4.c -o test4
./test4
[plain] view plain 
TK----->>>lianjie(a,b) is 20 
TK----->>>lianjie(4,5) is 45 
TK--------_>>>>>>tank call ok!!! 
TK--------_>>>>>>tankai call ok!! 
2.一个参数
test5.c
[cpp] view plain 
#include <stdio.h> 
#include "common.h" 
long sys_tank(int fd); 
 
SYSCALL_DEFINE1(tank, int, fd) 
{ 
 printf("TK--------_>>>>>>call ok!!!>>fd is %d\n",fd); 
 return 0; 
} 
 
int main(){ 
 sys_tank(3); 
 return 0; 
} 
/* 
SYSCALL_DEFINE1(tank,int,fd) = SYSCALL_DEFINEx(1, _tank, int, fd) 
SYSCALL_DEFINEx(1, _tank, int, fd) = __SYSCALL_DEFINEx(1, _tank, int, fd) 
__SYSCALL_DEFINEx(1, _tank, int, fd) = long sys_tank(__SC_DECL1(int,fd)) 
long sys_tank(__SC_DECL1(int,fd)) 
//__SC_DECL1(int,fd) = int fd 
//#define __SC_DECL1(t1, a1) t1 a1 
//#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) 
//#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) 
long sys_tank(__SC_DECL1(int,fd)) = long sys_tank(int fd); 
*/ 
 
/*result: 
TK--------_>>>>>>call ok!!!>>fd is 3 
*/ 
gcc test5.c -o test5
./test5
[plain] view plain 
TK--------_>>>>>>call ok!!!>>fd is 3 
3.五个参数情况,其他不再罗列
test6.c
[cpp] view plain 
#include <stdio.h> 
#include "common.h" 
 
long sys_mount(char *dev_name, char *dir_name, char *type, unsigned long flags, void *data); 
 
SYSCALL_DEFINE5(mount, char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) 
{ 
 printf("TK--------_>>>>>>call ok!!!>>>dev_name is %s,dir_name is %s,flags is %d\n",dev_name,dir_name,flags); 
 return 0; 
} 
 
int main(){ 
 sys_mount(".", "/", NULL, 0, NULL); 
 return 0; 
} 
/* 
SYSCALL_DEFINE5(mount,char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) = SYSCALL_DEFINEx(5, _mount, char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) 
SYSCALL_DEFINEx(5, _mount, char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) = __SYSCALL_DEFINEx(5, _mount, char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) 
__SYSCALL_DEFINEx(5, _mount, char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) = long sys_tank(__SC_DECL5(char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data)) 
long sys_tank(__SC_DECL1(int,fd)) 
//__SC_DECL5(char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) = char * dev_name, __SC_DECL4(char *, dir_name, char *, type, unsigned long, flags, void *, data) 
//...... 
//__SC_DECL5(char *, dev_name, char *, dir_name, char *, type, unsigned long, flags, void *, data) = char *dev_name, char *dir_name, char *type, unsigned long flags, void *data 
//#define __SC_DECL1(t1, a1) t1 a1 
//#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) 
//#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) 
//#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__) 
//#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__) 
long sys_mount(__SC_DECL5(int,fd)) = long sys_mount(char *dev_name, char *dir_name, char *type, unsigned long flags, void *data); 
*/ 
/*result: 
//TK--------_>>>>>>call ok!!!>>>dev_name is .,dir_name is /,flags is 0 
*/ 
gcc test6.c -o test6
./test6
[plain] view plain 
TK--------_>>>>>>call ok!!!>>>dev_name is .,dir_name is /,flags is 0 
Ⅷ linux c变参函数参数类型不同怎么办
 写一个简单的可变参数的C函数 
下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的 
C函数要在程序中用到以下这些宏: 
void va_start( va_list arg_ptr, prev_param ); 
type va_arg( va_list arg_ptr, type ); 
void va_end( va_list arg_ptr ); 
va在这里是variable-argument(可变参数)的意思. 
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个 
头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数 
参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值. 
void simple_va_fun(int i, ...) 
{ 
va_list arg_ptr; 
int j=0; 
va_start(arg_ptr, i); 
j=va_arg(arg_ptr, int); 
va_end(arg_ptr); 
printf("%d %d\n", i, j); 
return; 
} 
我们可以在我们的头文件中这样声明我们的函数: 
extern void simple_va_fun(int i, ...); 
我们在程序中可以这样调用: 
simple_va_fun(100); 
simple_va_fun(100,200); 
从这个函数的实现可以看到,我们使用可变参数应该有以下步骤: 
1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变 
量是指向参数的指针. 
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第 
一个可变参数的前一个参数,是一个固定的参数. 
3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个 
参数是你要返回的参数的类型,这里是int型. 
4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使 
用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获 
取各个参数. 
如果我们用下面三种方法调用的话,都是合法的,但结果却不一样: 
1)simple_va_fun(100); 
结果是:100 -123456789(会变的值) 
2)simple_va_fun(100,200); 
结果是:100 200 
3)simple_va_fun(100,200,300); 
结果是:100 200 
我们看到第一种调用有错误,第二种调用正确,第三种调用尽管结果 
正确,但和我们函数最初的设计有冲突.下面一节我们探讨出现这些结果 
的原因和可变参数在编译器中是如何处理的. 
(二)可变参数在编译器中的处理 
我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的, 
由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下 
面以VC++中stdarg.h里x86平台的宏定义摘录如下(』\』号表示折行): 
typedef char * va_list; 
#define _INTSIZEOF(n) \ 
((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) 
#define va_arg(ap,t) \ 
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
#define va_end(ap) ( ap = (va_list)0 ) 
定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.C语言的函 
数是从右向左压入堆栈的,图(1)是函数的参数在堆栈中的分布位置.我 
们看到va_list被定义成char*,有一些平台或操作系统定义为void*.再 
看va_start的定义,定义为&v+_INTSIZEOF(v),而&v是固定参数在堆栈的 
地址,所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在堆 
栈的地址,如图: 
高地址|-----------------------------| 
|函数返回地址 | 
|-----------------------------| 
|....... | 
|-----------------------------| 
|第n个参数(第一个可变参数) | 
|-----------------------------|<--va_start后ap指向 
|第n-1个参数(最后一个固定参数)| 
低地址|-----------------------------|<-- &v 
图( 1 ) 
然后,我们用va_arg()取得类型t的可变参数值,以上例为int型为例,我 
们看一下va_arg取int型的返回值: 
j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) ); 
首先ap+=sizeof(int),已经指向下一个参数的地址了.然后返回 
ap-sizeof(int)的int*指针,这正是第一个可变参数在堆栈里的地址 
(图2).然后用*取得这个地址的内容(参数值)赋给j. 
高地址|-----------------------------| 
|函数返回地址 | 
|-----------------------------| 
|....... | 
|-----------------------------|<--va_arg后ap指向 
|第n个参数(第一个可变参数) | 
|-----------------------------|<--va_start后ap指向 
|第n-1个参数(最后一个固定参数)| 
低地址|-----------------------------|<-- &v 
图( 2 ) 
最后要说的是va_end宏的意思,x86平台定义为ap=(char*)0;使ap不再 
指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不 
会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 
在这里大家要注意一个问题:由于参数的地址用于va_start宏,所 
以参数不能声明为寄存器变量或作为函数或数组类型. 
关于va_start, va_arg, va_end的描述就是这些了,我们要注意的 
是不同的操作系统和硬件平台的定义有些不同,但原理却是相似的. 
(三)可变参数在编程中要注意的问题 
因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 
可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能 
地识别不同参数的个数和类型. 
有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数 
printf是从固定参数format字符串来分析出参数的类型,再调用va_arg 
的来获取可变参数的.也就是说,你想实现智能识别可变参数的话是要通 
过在自己的程序里作判断来实现的. 
另外有一个问题,因为编译器对可变参数的函数的原型检查不够严 
格,对编程查错不利.如果simple_va_fun()改为: 
void simple_va_fun(int i, ...) 
{ 
va_list arg_ptr; 
char *s=NULL; 
va_start(arg_ptr, i); 
s=va_arg(arg_ptr, char*); 
va_end(arg_ptr); 
printf("%d %s\n", i, s); 
return; 
} 
可变参数为char*型,当我们忘记用两个参数来调用该函数时,就会出现 
core mp(Unix) 或者页面非法的错误(window平台).但也有可能不出 
错,但错误却是难以发现,不利于我们写出高质量的程序. 
以下提一下va系列宏的兼容性. 
System V Unix把va_start定义为只有一个参数的宏: 
va_start(va_list arg_ptr); 
而ANSI C则定义为: 
va_start(va_list arg_ptr, prev_param); 
如果我们要用system V的定义,应该用vararg.h头文件中所定义的 
宏,ANSI C的宏跟system V的宏是不兼容的,我们一般都用ANSI C,所以 
用ANSI C的定义就够了,也便于程序的移植. 
Ⅸ linux如何设置变量来拿到不确定个数的参数值
一般在文件的开头是直接变成你那文件里面的内容,执行的时候就会替换这个变量名,还有一种就是在这个用户一个环境用户变量里面设置,那么就会在这个用户咨询下的所有文件,所有信息有使用到变量的都会替换。还有一种是设置成系统变量,在系统级别上整个服务器所有的任何用户执行任何文件,都可以替换对应的变量。
Ⅹ Linux C开发中的「va_arg, va_start, va_end,va_list」分别表示什么意思
 这是用于实现可变参数的几个宏,比如printf()这个函数的可变参数就是用这几个宏实现的。
参考这个,讲的很清楚:
http://www.cppblog.com/qiujian5628/archive/2008/01/21/41562.html 
