Linux下web服务器搭建需注意的问题

来源:互联网 发布:苹果频谱电脑软件 编辑:程序博客网 时间:2024/06/05 22:34

uname 作为Linux命令
  用途
  显示当前操作系统名称。
  语法
  uname [ -a | -x | -S Name ] [ -F ] [ -f ] [-l ] [ -L ] [ -m ] [ -M ] [ -n ] [ -p ] [ -r ] [ -s ] [ -T Name ] [ -u ] [ -v ]
  描述
  uname 命令将正在使用的操作系统名写到标准输出中。
  机器 ID 号码包括以下数字格式的 12 个字符 xxyyyyyymmss。xx 位置指示系统且始终为 00。yyyyyy 位置包含整个系统的唯一标识号。mm 位置代表型号标识。ss 位置为子型号并且始终为00。型号标识描述 CPU 平板标识,而不是描述整个系统的型号。
  有时可使用 uname -m 命令决定使用什么型号。以下列表并非全面。参考硬件供应商提供的文档以获取 E0-FF 范围内的值。并且注意并非所有的机器类型都有机器 ID。许多新机器都共享 4C 的公共机器 ID。系统型号十六进制代码(mm)为:
  机器 机器 机器
  类型 型号 标识
  7006 410 42
  7007 N40 F0
  7008 M20 43
  7008 M20A 43
  7009 C10 48
  7011 220 41
  7011 230 47
  7011 250 46
  7012 320 31
  7012 320H 35
  7012 340 37
  7012 350 38 或 77
  7012 355 77
  7012 360 76
  7012 365 76
  7012 370 75
  7012 375 75
  7012 380 58
  7012 390 57
  7012 G30 A6
  7012 G40 A7
  7013 520 30
  7013 520H 34
  7013 530 10
  7013 530H 18
  7013 540 14 或 11
  7013 550 1C
  7013 550L 77
  7013 560 5C
  7013 570 67
  7013 580 66
  7013 58H 71
  7013 590 70
  7013 590H 72
  7013 J30 A0
  7013 J40 A1
  7015 930 20 或 02
  7015 950 2E
  7015 970 63
  7015 970B 63
  7015 980 64
  7015 980B 64
  7015 990 80
  7015 R10 67
  7015 R20 72
  7015 R24 81
  7015 R30 A3
  7015 R40 A4
  7016 730 10
  7018 740 30
  7018 770 67
  7024 E20 C0
  7025 F30 C4
  7030 3AT 58
  7030 3BT 57
  7043 140 4C
  7043 240 4C
  7248 43P 4C
  当安装了新的操作系统软件级别时, uname 命令返回的机器标识符值可能改变。这一改变影响使用该值访问许可程序的应用程序。需要查看标识符,输入 uname -m 命令。
  如果应用程序受到影响,联系合适的支持组织。
  标志
  -a    显示 -m、 -n、 -r、 -s 和 -v 标志指定的所有信息。不能与-x 或 -SName 标志连用。如果 -x 标志和 -a 标志一起指定,-x 标志会覆盖它。
  -F    显示由十六进制字符构成的系统标识字符串。此标识字符串对特定系统上的所有分区都是相同的。
  -f    除分区号还用于此字符串的计算之外,与 F 标志类似。产生的标识字符串对特定系统上的每个分区都是唯一的。
  -l    显示 LAN 网络号码。
  -L    显示 LPAR 号码和 LPAR 名称。如果 LPAR 不存在,“-1”显示为 LPAR 号码,NULL 为 LPAR 名称
  -m    显示硬件运行系统的机器 ID 号。

 

 

 

 

 

 

在windows/linux下有下面结构:

sockaddr结构

struct sockaddr

{

unsigned short sa_family;/*addressfamily,AF_xxx*/

char sa_data[14];/*14bytesofprotocoladdress*/

};

sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族。

sa_data是14字节协议地址

此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

sockaddr_in(在netinet/in.h中定义):

 

1

2

3

4

5

6

7

8

9

10

11

12

13

struct sockaddr_in

 

{

 

short sin_family;/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/

 

unsigned short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/

 

struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/

 

unsigned char sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/

 

};

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock结构体名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
……
等到要做转换的时候用:
(struct sockaddr*)mysock

 

 

 

hostent结构体

使用这个东西,首先要包含2个头文件:
#include <netdb.h>
#include <sys/socket.h>

struct hostent *gethostbyname(const char *name);
这个函数的传入值是域名或者主机名,例如" www.google.com","wpc "等等。
传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。

struct hostent {
  char  *h_name;
  char  **h_aliases;
  int   h_addrtype;
  int   h_length;
  char  **h_addr_list;
  };
解释一下这个结构:
其中,
  char *h_name 表示的是主机的规范名。例  如 www.google.com的规范名其实是www.l.google.com
  char   **h_aliases 表示的是主机的别名。 www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
  int   h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
  int   h_length 表示的是主机ip地址的长度
  int   **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。
这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

struct utsname
  { char sysname[_UTSNAME_SYSNAME_LENGTH];//当前操作系统名
   charnodename[_UTSNAME_NODENAME_LENGTH];//网络上的名称
   charrelease[_UTSNAME_RELEASE_LENGTH];//当前发布级别
   charversion[_UTSNAME_VERSION_LENGTH];//当前发布版本
   charmachine[_UTSNAME_MACHINE_LENGTH];//当前硬件体系类型
#if _UTSNAME_DOMAIN_LENGTH - 0
    /* Name of the domain of thisnode on the network.  */
# ifdef __USE_GNU
    chardomainname[_UTSNAME_DOMAIN_LENGTH]; //当前域名
# else
    char__domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif
  };

 

 

 

 

 

BUFSIZ

一、BUFSIZ定义

 

   Linux平台

 

   stdio.h:# define BUFSIZ _IO_BUFSIZ
   libio.h:#define _IO_BUFSIZ_G_BUFSIZ
   _G_config.h:#define _G_BUFSIZ 8192

 

二、BUFSIZ作用

 

   程序输出时,为减轻系统负担,可以先将需要输出的字符保存起来,即放入内存缓冲。当达到输出条件时:行缓

 

冲遇到换行符,块缓冲遇到写满缓存,或用户强制fflush;才进行写文件动作。BUFSIZ为系统默认的缓冲区大小。

 

三、BUFSIZ使用

 

   #include <stdio.h> (引入头文件即可)

 

   setbuf(stdout, buf); (修改默认缓冲大小)

 

 

argc == 1 就是说参数的个数为0.
argc是参数个数,定义为int
argv是字符串数组,存的是参数,定义为char**或者char* argv[]
比如你编译好的程序为my.exe
命令行执行 my.exe 1 2 3
那argc就是4,argv[0]是"my.exe",argv[1]是"1",argv[2]是"2",argv[3]是"3";

 

 

Stderr:

标准输出(设备)文件,对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。在C中,程序执行时,一直处于开启状态。

可能的使用方法有:fprintf(stderr,"errormessage")

 

stderr -- 标准错误输出设备

 

stdout -- 标准输出设备 (printf("..")) 同 stdout。

  两者默认向屏幕输出。

  但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

  例如:

 

fprintf(stderr,"Can't open it!\n");

  fprintf(stdout,"Can't open it!\n");

 

在my.exe

  Can't open it!

  Can't open it!

  Can't open it!

  转向标准输出到磁盘文件tmp.txt

  my.exe >tmp.txt

  Can't open it!

  用TYPE 看 tmp.txt的内容:

  TYPE tmp.txt

  Can't open it!

  Can't open it!

 

  

 

 

标准错误

 

标准错误(STDERR):默认输出到终端窗口,文件描述器代码为2。

 

  

 

 

标准错误输出

 

STDERR(标准错误输出):是代表STDRR的Filehandle

 

如果要使用其它的Filehandle,就要用OPEN这个函数来打开一个Filehandle,我们可以用PRINT这个函数将LIST的数据输出给FILEHANDLE.

 

 

 

 

 

sscanf() - 从一个字符串中读进与指定格式相符的数据.
  函数原型:
  Int sscanf( string str, string fmt, mixed var1, mixedvar2 ... );
  int scanf( const char *format [,argument]... );
  说明:
  sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
  其中的format可以是一个或多个 {%[*] [width] [{h| l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
  注:
  1、 * 亦可用于格式中, (即 %*d 和%*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
  2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
  3、width表示读取宽度。
  4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double例外),l64表示8字节size。
  5、type :这就很多了,就是%s,%d之类。
  6、特别的:%*[width] [{h | l| I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
  支持集合操作:
  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
  %[aB'] 匹配a、B、'中一员,贪婪性
  %[^a] 匹配非a的任意字符,贪婪性


例子:
  1. 常见用法。
  char buf[512] = ;
  sscanf("123456 ", "%s", buf);
  printf("%s\n", buf);
  结果为:123456
  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
  sscanf("123456 ", "%4s", buf);
  printf("%s\n", buf);
  结果为:1234
  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
  sscanf("123456 abcdedf", "%[^ ]",buf);
  printf("%s\n", buf);
  结果为:123456
  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
  sscanf("123456abcdedfBCDEF", "%[1-9a-z]",buf);
  printf("%s\n", buf);
  结果为:123456abcdedf
  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
  sscanf("123456abcdedfBCDEF","%[^A-Z]", buf);
  printf("%s\n", buf);
  结果为:123456abcdedf
  6、给定一个字符串iios/12DDWDFF@122,获取/ 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
  sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]", buf);
  printf("%s\n", buf);
  结果为:12DDWDFF
  7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
  sscanf(“hello, world”, "%*s%s", buf);
  printf("%s\n", buf);
  结果为:world
  %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
  如果没有空格则结果为NULL。
  sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.
  //-------------------------------------------------------
  sscanf,表示从字符串中格式化输入
  上面表示从str中,输入数字给x,就是32700
  久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。
  sscanf是一个运行时函数,原形很简单:
  int sscanf(
  const char *buffer,
  const char *format [,
  argument ] ...
  );
  它强大的功能体现在对format的支持上。
  我以前用它来分隔类似这样的字符串2006:03:18:
  int a, b, c;
  sscanf("2006:03:18", "%d:%d:%d", a, b,c);
  以及2006:03:18 - 2006:04:18:
  char sztime1[16] = "", sztime2[16] ="";
  sscanf("2006:03:18 - 2006:04:18", "%s -%s", sztime1, sztime2);

 

 

 

 

fork:从已有进程中复制一个新进程(=0,创建成功)

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,

 

也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

 

 

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都

 

复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

 

1 0
原创粉丝点击