今天的优秀组织已经不再是等级森严、分工明确、秩序井然,一种可变的、有机的和充满活力的架构正在渐成气候。这种新的架构能够快速响应组织不断变化的需求,成功编织他们的关系网络。在打造关系网的过程中,已经认识的人很重要,他们都有自己的熟人,而他们所熟识的人又有自己的熟人。
成功建立关系网的关键是和适当的人建立稳固的关系。良好的人际关系能拓宽你生活视野,让你了解周围所发生的一切,并提高你倾听和交流的能力。
强力10人内部圈
当你意识到职业关系的重要性,并开始选择可以助你一臂之力的人时,你可能不得不卸掉一些关系网中的额外包袱,其中或许包括那些相识已久但对你的职业生涯无所裨益的人。维持对你益处不大的老关系只会意味着时间的浪费。
良好、稳固、有力的人际关系的核心必须由10个左右你能靠得住的人组成。这首选的10个人可以包括你的朋友、家庭成员和那些在你职业生涯中彼此联系紧密的人,他们构成你的影响力内部圈,因为他们能让你发挥所长,而且彼此都希望对方成功。
当双方建立了稳固关系时,彼此会激发出强大能量。他们会激发对方的创造力,使彼此的灵感达到至美境界。为什么将你的影响力内部圈人数限定为10个人呢?因为强有力的关系需要你一个月至少维护1次,所以10个人或许已经用尽你所有的时间。
另外,应该至少挑选15个人作为你“强力10人内部圈”的后备力量,并经常与他们保持联系。如果你的一位主要关系退休或移民国外,最好的替补就是你的后备军。只要你能每月定期和他们联系,无论是通过电话、传真、聚会、电子邮件或信件,这个团体的人数都可以超过15人。 最初接触的15秒
在试图与你建立关系时,人们总会问你是做什么的,如果回答平淡如水,比如只是一句“我是一名经理”,你就失去了一个与对方交流的机会。比较得体的回答是:“我在某某公司负责一个小组的管理工作,主要为我们的管理软件开发监视软件。我也喜欢骑马,常常打网球,也热爱读书。”在不到15秒的时间里,你不仅使你的回答增添了色彩,也为对方提供了几个话题,说不定其中就有让对方感兴趣的。当他这样回答:“哦,你打网球?我也喜欢”时,你们就开始打造关系了。
建造关系网络必须遵守的规则,不是“别人能为我做什么?”,而是“我能为别人做什么?”在回答别人的问题时,不妨再接着问一下,“我能为你做些什么?” 保持联络 保持联络是成功建立关系网络的另一关键。《纽约时报》记者问美国前总统克林顿是如何保持自己的政治关系网的,克林顿回答:“每天晚上睡觉前,我会在一张卡片上列出我当天联系过的每一个人,注明重要细节、时间、会晤地点和其他一些相关信息,然后添加到秘书为我建立的关系网数据库中。这些年来朋友们帮了我不少。”
要与关系网络中的每个人保持积极联系,惟一的方式就是创造性地运用你的日程表。记下那些对你的关系特别重要的日子,比如生日或周年庆祝等。打电话给他们,至少给他们寄张贺卡让他们知道你心中想着他们。
观察他们在组织中的变化也同样重要。当你的关系网成员升职或调到新的组织去时,要及时祝贺他们。同时,也让他们知道你个人的情况。去度假之前,打电话问问他们有什么需要。当他们落入低谷时,打电话给他们鼓劲。不论你关系网中谁遇到麻烦时,立即与他通话,并主动提供帮助,这是表现支持的最好方式。
珍惜商务旅行的机会。如果你旅行的地点正好邻近你的某位关系成员,不要忘记提议和他共进午餐或晚餐。
3个月调整一次
至少每三个月变动一下你的关系网。要多提类似“为什么要保留这个关系?”的问题。如果你不定期更新或增加新人,你的关系网络就会陈旧。
为你的关系网络和组织提供信息。时刻关注对网络成员有用的信息,应定期将你收到的信息与他们分享。优秀的关系网络是双向的,如果你仅仅是个接受者,无论什么网络都会疏远你。搭建关系网络时,要做得好像你的职业生涯和个人生活都离不开它似的,其实,事实上也的确如此
成功建立关系网的关键是和适当的人建立稳固的关系。良好的人际关系能拓宽你生活视野,让你了解周围所发生的一切,并提高你倾听和交流的能力。
强力10人内部圈
当你意识到职业关系的重要性,并开始选择可以助你一臂之力的人时,你可能不得不卸掉一些关系网中的额外包袱,其中或许包括那些相识已久但对你的职业生涯无所裨益的人。维持对你益处不大的老关系只会意味着时间的浪费。
良好、稳固、有力的人际关系的核心必须由10个左右你能靠得住的人组成。这首选的10个人可以包括你的朋友、家庭成员和那些在你职业生涯中彼此联系紧密的人,他们构成你的影响力内部圈,因为他们能让你发挥所长,而且彼此都希望对方成功。
当双方建立了稳固关系时,彼此会激发出强大能量。他们会激发对方的创造力,使彼此的灵感达到至美境界。为什么将你的影响力内部圈人数限定为10个人呢?因为强有力的关系需要你一个月至少维护1次,所以10个人或许已经用尽你所有的时间。
另外,应该至少挑选15个人作为你“强力10人内部圈”的后备力量,并经常与他们保持联系。如果你的一位主要关系退休或移民国外,最好的替补就是你的后备军。只要你能每月定期和他们联系,无论是通过电话、传真、聚会、电子邮件或信件,这个团体的人数都可以超过15人。 最初接触的15秒
在试图与你建立关系时,人们总会问你是做什么的,如果回答平淡如水,比如只是一句“我是一名经理”,你就失去了一个与对方交流的机会。比较得体的回答是:“我在某某公司负责一个小组的管理工作,主要为我们的管理软件开发监视软件。我也喜欢骑马,常常打网球,也热爱读书。”在不到15秒的时间里,你不仅使你的回答增添了色彩,也为对方提供了几个话题,说不定其中就有让对方感兴趣的。当他这样回答:“哦,你打网球?我也喜欢”时,你们就开始打造关系了。
建造关系网络必须遵守的规则,不是“别人能为我做什么?”,而是“我能为别人做什么?”在回答别人的问题时,不妨再接着问一下,“我能为你做些什么?” 保持联络 保持联络是成功建立关系网络的另一关键。《纽约时报》记者问美国前总统克林顿是如何保持自己的政治关系网的,克林顿回答:“每天晚上睡觉前,我会在一张卡片上列出我当天联系过的每一个人,注明重要细节、时间、会晤地点和其他一些相关信息,然后添加到秘书为我建立的关系网数据库中。这些年来朋友们帮了我不少。”
要与关系网络中的每个人保持积极联系,惟一的方式就是创造性地运用你的日程表。记下那些对你的关系特别重要的日子,比如生日或周年庆祝等。打电话给他们,至少给他们寄张贺卡让他们知道你心中想着他们。
观察他们在组织中的变化也同样重要。当你的关系网成员升职或调到新的组织去时,要及时祝贺他们。同时,也让他们知道你个人的情况。去度假之前,打电话问问他们有什么需要。当他们落入低谷时,打电话给他们鼓劲。不论你关系网中谁遇到麻烦时,立即与他通话,并主动提供帮助,这是表现支持的最好方式。
珍惜商务旅行的机会。如果你旅行的地点正好邻近你的某位关系成员,不要忘记提议和他共进午餐或晚餐。
3个月调整一次
至少每三个月变动一下你的关系网。要多提类似“为什么要保留这个关系?”的问题。如果你不定期更新或增加新人,你的关系网络就会陈旧。
为你的关系网络和组织提供信息。时刻关注对网络成员有用的信息,应定期将你收到的信息与他们分享。优秀的关系网络是双向的,如果你仅仅是个接受者,无论什么网络都会疏远你。搭建关系网络时,要做得好像你的职业生涯和个人生活都离不开它似的,其实,事实上也的确如此
介绍
当你进入 UNIX 的神秘世界后,立刻会发现越来越多的东西难以理解。对于大多数人来说,BSD socket 的概念就是其中一个。这是一个很短的教程来解释他们是什么、他们如何工作并给出一些简单的代码来解释如何使用他们。
类比 (什么是 socket ?)
socket 是进行程序间通讯(IPC)的 BSD 方法。这意味着 socket 用来让一个进程和其他的进程互通信息,就象我们用电话来和其他的人交流一样。
用电话来比喻是很恰当的,我们在后面将一直用电话这个概念来描叙 socket 。
装上你的新电话(怎样侦听?)
一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,你必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,你要建立一个新的 socket,就象先装上电话一样。socket() 命令就完成这个工作。
因为 sockets 有几种类型,你要注明你要建立什么类型的。你要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF_UNIX 和 IAF_INET。AF_UNIX 就象 UNIX 路径名一样识别 sockets。这种形式对于在同一台机器上的 IPC 很有用。而 AF_INET 使用象 192.9.200.10 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号来允许每台机器上的多个 AF_INET socket。我们这里将着重于 AF_INET 方式,因为他很有用并广泛使用。
另外一个你必须提供的参数是 socket 的类型。两个重要的类型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM 表明数据象字符流一样通过 socket 。而 SOCK_DGRAM 则表明数据将是数据报(datagrams)的形式。我们将讲解 SOCK_STREAM sockets,他很常见并易于使用。
在建立 socket 后,我们就要提供 socket 侦听的地址了。就象你还要个电话号码来接电话一样。bind() 函数来处理这件事情。
SOCK_STREAM sockets 让连接请求形成一个队列。如果你忙于处理一个连接,别的连接请求将一直等待到该连接处理完毕。listen() 函数用来设置最大不被拒绝的请求数(一般为5个)。一般最好不要使用 listen() 函数。
下面的代码说明如何利用 socket()、 bind() 和 listen() 函数建立连接并可以接受数据。
/* code to establish a socket; originally from bzs@bu-cs.bu.edu
*/
int establish(unsigned short portnum)
{ char myname[MAXHOSTNAME+1];
int s;
struct sockaddr_in sa;
struct hostent *hp;
memset(&sa, 0, sizeof(struct sockaddr_in)); /* clear our address */
gethostname(myname, MAXHOSTNAME); /* who are we? */
hp= gethostbyname(myname); /* get our address info */
if (hp == NULL) /* we don\t exist !? */
return(-1);
sa.sin_family= hp->h_addrtype; /* this is our host address */
sa.sin_port= htons(portnum); /* this is our port number */
if ((s= socket(AF_INET, SOCK_STREAM, 0)) /* obligatory includes */
#include
#include
#include
#include
#include
#include
#include
#include
#define PORTNUM 50000 /* random port number, we need something */
void fireman(void);
void do_something(int);
main()
{ int s, t;
if ((s= establish(PORTNUM)) 0)
;
}
/* this is the function that plays with the socket. it will be called
* after getting a connection.
*/
void do_something(int s)
{
/* do your thing with the socket here
:
:
*/
}
拨号 (如何调用 socket)
现在你应该知道如何建立 socket 来接受调用了。那么如何调用呢?和电话一样,你要先有个电话。用 socket() 函数来完成这件事情,就象建立侦听的 socket 一样。
在给 socket 地址后,你可以用 connect() 函数来连接侦听的 socket 了。下面是一段代码。
int call_socket(char *hostname, unsigned short portnum)
{ struct sockaddr_in sa;
struct hostent *hp;
int a, s;
if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host\s */
errno= ECONNREFUSED; /* address? */
return(-1); /* no */
}
memset(&sa,0,sizeof(sa));
memcpy((char *)&sa.sin_addr,hp->h_addr,hp->h_length); /* set address */
sa.sin_family= hp->h_addrtype;
sa.sin_port= htons((u_short)portnum);
if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) 0) {
bcount += br; /* increment byte counter */
buf += br; /* move buffer ptr for next read */
}
else if (br < 0) /* signal an error to the caller */
return(-1);
}
return(bcount);
}
相同的函数也可以写数据,留给我们的读者吧。
挂起(结束)
和你通过电话和某人交谈后一样,你要在 socket 间关闭连接。一般 close() 函数用来关闭每边的 socket 连接。如果一边的已经关闭,而另外一边却在向他写数据,则返回一个错误代码。
世界语(交流的语言很重要)
现在你可以在机器间联络了,可是要小心你所说的话。许多机器有自己的方言,如 ASCII 和 EBCDIC。更常见的问题是字节顺序问题。除非你一直传输的都是文本,否则你一定要注意这个问题。幸运的是,人们找出了解决的办法。
在很久以前,人们争论哪种顺序更“正确”。现在必要时有相应的函数来转换。其中有 htons()、ntohs()、htonl() 和 ntohl()。在传输一个整型数据前,先转换一下。
i= htonl(i);
write_data(s, &i, sizeof(i));
在读数据后,再变回来。
read_data(s, &i, sizeof(i));
i= ntohl(i);
如果你一直坚持这个习惯,你将比别人少出错的机会。
未来在你的掌握了(下一步?)
就用我们刚才讨论的东西,你就可以写自己的通讯程序了。和对待所有的新生事物一样, 最好还是看看别人已经做了些什么。这里有许多关于 BSD socket 的东西可以参考。
请注意,例子中没有错误检查,这在“真实”的程序中是很重要的。你应该对此充分重视。
当你进入 UNIX 的神秘世界后,立刻会发现越来越多的东西难以理解。对于大多数人来说,BSD socket 的概念就是其中一个。这是一个很短的教程来解释他们是什么、他们如何工作并给出一些简单的代码来解释如何使用他们。
类比 (什么是 socket ?)
socket 是进行程序间通讯(IPC)的 BSD 方法。这意味着 socket 用来让一个进程和其他的进程互通信息,就象我们用电话来和其他的人交流一样。
用电话来比喻是很恰当的,我们在后面将一直用电话这个概念来描叙 socket 。
装上你的新电话(怎样侦听?)
一个人要能够收到别人打给他的电话,首先他要装上一门电话。同样,你必须先建立 socket 以侦听线路。这个过程包含几个步骤。首先,你要建立一个新的 socket,就象先装上电话一样。socket() 命令就完成这个工作。
因为 sockets 有几种类型,你要注明你要建立什么类型的。你要做一个选择是 socket 的地址格式。如同电话有音频和脉冲两种形式一样,socket 有两个最重要的选项是 AF_UNIX 和 IAF_INET。AF_UNIX 就象 UNIX 路径名一样识别 sockets。这种形式对于在同一台机器上的 IPC 很有用。而 AF_INET 使用象 192.9.200.10 这样被点号隔开的四个十进制数字的地址格式。除了机器地址以外,还可以利用端口号来允许每台机器上的多个 AF_INET socket。我们这里将着重于 AF_INET 方式,因为他很有用并广泛使用。
另外一个你必须提供的参数是 socket 的类型。两个重要的类型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM 表明数据象字符流一样通过 socket 。而 SOCK_DGRAM 则表明数据将是数据报(datagrams)的形式。我们将讲解 SOCK_STREAM sockets,他很常见并易于使用。
在建立 socket 后,我们就要提供 socket 侦听的地址了。就象你还要个电话号码来接电话一样。bind() 函数来处理这件事情。
SOCK_STREAM sockets 让连接请求形成一个队列。如果你忙于处理一个连接,别的连接请求将一直等待到该连接处理完毕。listen() 函数用来设置最大不被拒绝的请求数(一般为5个)。一般最好不要使用 listen() 函数。
下面的代码说明如何利用 socket()、 bind() 和 listen() 函数建立连接并可以接受数据。
/* code to establish a socket; originally from bzs@bu-cs.bu.edu
*/
int establish(unsigned short portnum)
{ char myname[MAXHOSTNAME+1];
int s;
struct sockaddr_in sa;
struct hostent *hp;
memset(&sa, 0, sizeof(struct sockaddr_in)); /* clear our address */
gethostname(myname, MAXHOSTNAME); /* who are we? */
hp= gethostbyname(myname); /* get our address info */
if (hp == NULL) /* we don\t exist !? */
return(-1);
sa.sin_family= hp->h_addrtype; /* this is our host address */
sa.sin_port= htons(portnum); /* this is our port number */
if ((s= socket(AF_INET, SOCK_STREAM, 0)) /* obligatory includes */
#include
#include
#include
#include
#include
#include
#include
#include
#define PORTNUM 50000 /* random port number, we need something */
void fireman(void);
void do_something(int);
main()
{ int s, t;
if ((s= establish(PORTNUM)) 0)
;
}
/* this is the function that plays with the socket. it will be called
* after getting a connection.
*/
void do_something(int s)
{
/* do your thing with the socket here
:
:
*/
}
拨号 (如何调用 socket)
现在你应该知道如何建立 socket 来接受调用了。那么如何调用呢?和电话一样,你要先有个电话。用 socket() 函数来完成这件事情,就象建立侦听的 socket 一样。
在给 socket 地址后,你可以用 connect() 函数来连接侦听的 socket 了。下面是一段代码。
int call_socket(char *hostname, unsigned short portnum)
{ struct sockaddr_in sa;
struct hostent *hp;
int a, s;
if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host\s */
errno= ECONNREFUSED; /* address? */
return(-1); /* no */
}
memset(&sa,0,sizeof(sa));
memcpy((char *)&sa.sin_addr,hp->h_addr,hp->h_length); /* set address */
sa.sin_family= hp->h_addrtype;
sa.sin_port= htons((u_short)portnum);
if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) 0) {
bcount += br; /* increment byte counter */
buf += br; /* move buffer ptr for next read */
}
else if (br < 0) /* signal an error to the caller */
return(-1);
}
return(bcount);
}
相同的函数也可以写数据,留给我们的读者吧。
挂起(结束)
和你通过电话和某人交谈后一样,你要在 socket 间关闭连接。一般 close() 函数用来关闭每边的 socket 连接。如果一边的已经关闭,而另外一边却在向他写数据,则返回一个错误代码。
世界语(交流的语言很重要)
现在你可以在机器间联络了,可是要小心你所说的话。许多机器有自己的方言,如 ASCII 和 EBCDIC。更常见的问题是字节顺序问题。除非你一直传输的都是文本,否则你一定要注意这个问题。幸运的是,人们找出了解决的办法。
在很久以前,人们争论哪种顺序更“正确”。现在必要时有相应的函数来转换。其中有 htons()、ntohs()、htonl() 和 ntohl()。在传输一个整型数据前,先转换一下。
i= htonl(i);
write_data(s, &i, sizeof(i));
在读数据后,再变回来。
read_data(s, &i, sizeof(i));
i= ntohl(i);
如果你一直坚持这个习惯,你将比别人少出错的机会。
未来在你的掌握了(下一步?)
就用我们刚才讨论的东西,你就可以写自己的通讯程序了。和对待所有的新生事物一样, 最好还是看看别人已经做了些什么。这里有许多关于 BSD socket 的东西可以参考。
请注意,例子中没有错误检查,这在“真实”的程序中是很重要的。你应该对此充分重视。
在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现!
/**
* Tcp Server program, It is a simple example only.
* zhengsh 200520602061 2
* when client connect to server, send a welcome message and timestamp in server.
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server. "
int main(int argc, char **argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bind to port %d failure!\n",SERVER_PORT);
exit(1);
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)
{
printf("call listen failure!\n");
exit(1);
}
while (1)
{//server loop will nerver exit unless any body kill the process
char buf[BUFFER_SIZE];
long timestamp;
socklen_t length = sizeof(cliaddr);
clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
if (clifd < 0)
{
printf("error comes when call accept!\n");
break;
}
strcpy(buf,WELCOME_MESSAGE);
//inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf,"timestamp in server:");
strcat(buf,ctime(×tamp));
send(clifd,buf,BUFFER_SIZE,0);
close(clifd);
}//exit
close(servfd);
return 0;
}
客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息
,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
/* Tcp client program, It is a simple example only.
* zhengsh 200520602061 2
* connect to server, and echo a message from server.
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server.\n"
void usage(char *name)
{
printf("usage: %s IpAddr\n",name);
}
int main(int argc, char **argv)
{
int servfd,clifd,length = 0;
struct sockaddr_in servaddr,cliaddr;
socklen_t socklen = sizeof(servaddr);
char buf[BUFFER_SIZE];
if (argc < 2)
{
usage(argv[0]);
exit(1);
}
if ((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
srand(time(NULL));//initialize random generator
bzero(&cliaddr,sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(CLIENT_PORT);
cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_aton(argv[1],&servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
//servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))<0)
{
printf("bind to port %d failure!\n",CLIENT_PORT);
exit(1);
}
if (connect(clifd,(struct sockaddr*)&servaddr, socklen) < 0)
{
printf("can't connect to %s!\n",argv[1]);
exit(1);
}
length = recv(clifd,buf,BUFFER_SIZE,0);
if (length < 0)
{
printf("error comes when recieve data from server %s!",argv[1]);
exit(1);
}
printf("from server %s :\n\t%s ",argv[1],buf);
close(clifd);
return 0;
}
程序在Fedora core 4下通过编译,有几个warining.但是不影响.
/**
* Tcp Server program, It is a simple example only.
* zhengsh 200520602061 2
* when client connect to server, send a welcome message and timestamp in server.
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server. "
int main(int argc, char **argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bind to port %d failure!\n",SERVER_PORT);
exit(1);
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)
{
printf("call listen failure!\n");
exit(1);
}
while (1)
{//server loop will nerver exit unless any body kill the process
char buf[BUFFER_SIZE];
long timestamp;
socklen_t length = sizeof(cliaddr);
clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
if (clifd < 0)
{
printf("error comes when call accept!\n");
break;
}
strcpy(buf,WELCOME_MESSAGE);
//inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
printf("from client,IP:%s,Port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf,"timestamp in server:");
strcat(buf,ctime(×tamp));
send(clifd,buf,BUFFER_SIZE,0);
close(clifd);
}//exit
close(servfd);
return 0;
}
客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息
,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
/* Tcp client program, It is a simple example only.
* zhengsh 200520602061 2
* connect to server, and echo a message from server.
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server.\n"
void usage(char *name)
{
printf("usage: %s IpAddr\n",name);
}
int main(int argc, char **argv)
{
int servfd,clifd,length = 0;
struct sockaddr_in servaddr,cliaddr;
socklen_t socklen = sizeof(servaddr);
char buf[BUFFER_SIZE];
if (argc < 2)
{
usage(argv[0]);
exit(1);
}
if ((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
srand(time(NULL));//initialize random generator
bzero(&cliaddr,sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(CLIENT_PORT);
cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_aton(argv[1],&servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
//servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))<0)
{
printf("bind to port %d failure!\n",CLIENT_PORT);
exit(1);
}
if (connect(clifd,(struct sockaddr*)&servaddr, socklen) < 0)
{
printf("can't connect to %s!\n",argv[1]);
exit(1);
}
length = recv(clifd,buf,BUFFER_SIZE,0);
if (length < 0)
{
printf("error comes when recieve data from server %s!",argv[1]);
exit(1);
}
printf("from server %s :\n\t%s ",argv[1],buf);
close(clifd);
return 0;
}
程序在Fedora core 4下通过编译,有几个warining.但是不影响.
下面我们先编写一个非常简单的套接口客户端程序client,这个程序较为简单,它演示了一个无名的套接口连接,
以及如何与一个服务器套接口连接,假设服务器套接口的名字是色server_socket.
/*
client.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch=A; //A好像有问题,改为ch了。。。编译通过。
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立客户端的套接口,采用AF_UNIX的unix域协议*/
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
/*以上创建服务器套接口的地址,其中包括套接口类型,名称*/
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1){
perror("oops:client1");
exit(1);
}
/*以上我们试图与服务器套接口建立连接*/
write(sockfd,&ch,1);
read(sockfd,&ch,1);
/*如果成功,将向服务器端发送一个字符,然后读取服务器的回答*/
printf("char from server=%c\n",ch);
close(sockfd);
exit(0);
}
/*
server.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink("server_socket");
/*如果存在同名的套接口,则先删除*/
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立套接口,这时候无名*/
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
listen(server_sockfd,5);
/*以上创建监听队列.等待用户的连接请求*/
while(1)
{
char ch;
printf("server waiting\n");
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
/*以上接受一个客户的请求*/
read(client_sockfd,&ch,1);
/*因为连接一旦建立,客户就会先发消息过来,所以服务器先读*/
ch++;
write(client_sockfd,&ch,1);
/*把读取的字符串做简单处理,回送*/
close(client_sockfd);
}
}
以及如何与一个服务器套接口连接,假设服务器套接口的名字是色server_socket.
/*
client.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch=A; //A好像有问题,改为ch了。。。编译通过。
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立客户端的套接口,采用AF_UNIX的unix域协议*/
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
/*以上创建服务器套接口的地址,其中包括套接口类型,名称*/
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1){
perror("oops:client1");
exit(1);
}
/*以上我们试图与服务器套接口建立连接*/
write(sockfd,&ch,1);
read(sockfd,&ch,1);
/*如果成功,将向服务器端发送一个字符,然后读取服务器的回答*/
printf("char from server=%c\n",ch);
close(sockfd);
exit(0);
}
/*
server.c
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink("server_socket");
/*如果存在同名的套接口,则先删除*/
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
/*以上建立套接口,这时候无名*/
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
listen(server_sockfd,5);
/*以上创建监听队列.等待用户的连接请求*/
while(1)
{
char ch;
printf("server waiting\n");
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
/*以上接受一个客户的请求*/
read(client_sockfd,&ch,1);
/*因为连接一旦建立,客户就会先发消息过来,所以服务器先读*/
ch++;
write(client_sockfd,&ch,1);
/*把读取的字符串做简单处理,回送*/
close(client_sockfd);
}
}
摘要:
本文简单介绍了RPC(Remote Procedure Call 远程过程调用)的原理结构、特点,
及其开放给编程人员不同层次的编程接口。并且例举实例示度绾瓮ü齊pcgen 编译工
具来快速开发RPC应用。
一、 概述
在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段
代码,也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益
发展的今天已无法适应实际需求。总所周知,传统过程调用模式无法充分利用网络上其
他主机的资源(如CPU、Memory等),也无法提高代码在实体间的共享程度,使得主机资
源大量浪费。
而本文要介绍的RPC编程,正是很好地解决了传统过程所存在的一系列弊端。通过RPC我
们可以充分利用非共享内存的多处理器环境(例如通过局域汪连接得多台工作站),这样
可以简便地将你的应用分布在多台工作站上,应用程序就像运行在一个多处理器的计算机
上一样。你可以方便的实现过程代码共享,提高系统资源的利用率,也可以将以大量数值
处理的操作放在处理能力较强的系统上运行,从而减轻前端机的负担。
二、 RPC的结构原理及其调用机制
如前所述RPC其实也是种C/S的编程模式,有点类似C/S Socket 编程模式,但要比它
更高一层。当我们在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以
是UDP,也可以是TCP(也即TI-RPC-无关性传输),并根据传输前所提供的目的地址及RPC
上层应用程序号转至相应的RPC Application Porgramme Server ,且此时的客户端处于等
待状态,直至收到应答或Time Out超时信号。具体的流程图如F1。当服务器端获得了请求
消息,则会根据注册RPC时告诉RPC系统的例程入口地址,执行相应的操作,并将结果返回
至客户端。
F1
当一次RPC调用结束后,相应线程发送相应的信号,客户端程序才会继续运行。
当然,一台服务主机上可以有多个远程过程提供服务,那么如何来表示一个唯一存
在的远程过程呢?一个远程过程是有三个要素来唯一确定的:程序号、版本号和过程号。
程序号是用来区别一组相关的并且具有唯一过程好的远程过程。一个程序可以有一个或几
个不同的版本,而每个版本的程序都包含一系列能被远程调用的过程,通过版本的引入,
使得不同版本下的RPC能同时提供服务。每个版本都包含有许多可供远程调用的过程,每个
过程则有其唯一标示的过程号。
三、 基于RPC的应用系统开发
通过以上对RPC原理的简介后,我们再来继续讨论如何来开发基于RPC的应用系统。
一般而言在开发RPC时,我们通常分为三个步骤:
a、 定义说明客户/服务器的通信协议。
这里所说的通信协议是指定义服务过程的名称、调用参数的数据类型和返回参数的数据
类型,还包括底层传输类型(可以是UDP或TCP),当然也可以由RPC底层函数自动选择
连接类型建立TI-RPC。最简单的协议生成的方法是采用协议编译工具,常用的有Rpcgen,
我会在后面实例中详细描述其使用方法。
b、 开发客户端程序。
c、 开发服务器端程序。
开发客户端和服务器端的程序时,RPC提供了我们不同层次的开发例程调用接口。不
同层次的接口提供了对RPC不同程度控制。一般可分为5个等级的编程接口,接下来我们
分别讨论一下各层所提供的功能函数。
1、 简单层例程
简单层是面向普通RPC应用,为了快速开发RPC应用服务而设计的,他提供
了如下功能函数。
函数名 功能描述
Rpc_reg( ) 在一特定类型的传输层上注册某个过程,来作为提供服务的RPC程序
Rpc_call( ) 远程调用在指定主机上指定的过程
Rpc_Broadcast( ) 向指定类型的所有传输端口上广播一个远程过程调用请求
2、 高层例程
在这一层,程序需要在发出调用请求前先创建一个客户端句柄,或是在侦听请
求前先建立一个服务器端句柄。程序在该层可以自由的将自己的应用绑在所有的
传输端口上,它提供了如下功能函数。
函数名 功能描述
Clnt_create( ) 程序通过这个功能调用,告诉底层RPC服务器的位置及其传输类型
Clnt_create_timed( ) 定义每次尝试连接的超时最大时间
Svc_create( ) 在指定类型的传输端口上建立服务器句柄,告诉底层RPC事件过程的相应入口地址
Clnt_call() 向服务器端发出一个RPC调用请求
3、 中间层例程
中间层向程序提供更为详细的RPC控制接口,而这一层的代码变得更为复杂,
但运行也更为有效,它提供了如下功能函数。
函数名 功能描述
Clnt_tp_create( ) 在指定的传输端口上建立客户端句柄
Clnt_tp_create_timed( ) 定义最大传输时延
Svc_tp_creaet( ) 在指定的传输端口上建立服务句柄
Clnt_call( ) 向服务器端发出RPC调用请求
4、 专家层例程
这层提供了更多的一系列与传输相关的功能调用,它提供了如下功能函数。
函数名 功能描述
Clnt_tli_create( ) 在指定的传输端口上建立客户端句柄
Svc_tli_create( ) 在指定的传输端口上建立服务句柄
Rpcb_set( ) 通过调用rpcbind将RPC服务和网络地址做映射
Rpcb_unset( ) 删除rpcb_set( ) 所建的映射关系
Rpcb_getaddr( ) 调用rpcbind来犯会指定RPC服务所对应的传输地址
Svc_reg( ) 将指定的程序和版本号与相应的时间例程建起关联
Svc_ureg( ) 删除有svc_reg( ) 所建的关联
Clnt_call( ) 客户端向指定的服务器端发起RPC请求
5、 底层例程
该层提供了所有对传输选项进行控制的调用接口,它提供了如下功能函数。
函数名 功能描述
Clnt_dg_create( ) 采用无连接方式向远程过程在客户端建立客户句柄
Svc_dg_create( ) 采用无连接方式建立服务句柄
Clnt_vc_create( ) 采用面向连接的方式建立客户句柄
Svc_vc_create( ) 采用面向连接的方式建立RPC服务句柄
Clnt_call( ) 客户端向服务器端发送调用请求
四、 实例介绍
以下我将通过实例向读者介绍通过简单层RPC的实现方法。通常在此过程中我们
将使用RPC协议编译工具-Rpcgen。Rpcgen 工具用来生成远程程序接口模块,它将以RPC
语言书写的源代码进行编译,Rpc 语言在结构和语法上同C语言相似。由Rpcgen 编译生
成的C源程序可以直接用C编译器进行编译,因此整个编译工作将分为两个部分。Rpcgen
的源程序以.x结尾,通过其编译将生成如下文件:
a) 一个头文件(.h)包括服务器和客户端程序变量、常量、类型等说明。
b) 一系列的XDR例程,它可以对头文件中定义的数据类型进行处理。
c) 一个Server 端的标准程序框架。
d) 一个Client 端的标准程序框架。
当然,这些输出可以是选择性的,Rpcgen 的编译选项说明如下:
选项 功能
'-' a 生成所有的模板文件
'-' Sc 生成客户端的模板文件
'-' Ss 生成服务器端的模板文件
'-' Sm 生成Makefile 文件
(详见Solaris Rpcgen Manaul)
Rpcgen 源程序 time.x:
/* time.x: Remote time printing protocol */
program TIMEPROG {
version PRINTIMEVERS {
string PRINTIME(string) = 1;
} = 1;
} = 0x20000001;
time_proc.c源程序(服务端):
/* time_proc.c: implementation of the remote procedure "printime" */
#include <stdio.h>
#include <rpc/rpc.h> /* always needed */
#include "time.h" /* time.h will be generated by rpcgen */
#include <time.h>
/* Remote version of "printime" */
char ** printime_1(char **msg,struct svc_req *req)
{
static char * result; /* must be static! */
static char tmp_char[100];
time_t rawtime;
FILE *f;
f = fopen("/tmp/rpc_result", "a+");
if (f == (FILE *)NULL) {
strcpy(tmp_char,"Error");
result = tmp_char;;
return (&result);
}
fprintf(f, "%s\n", *msg); //used for debugging
fclose(f);
time(&rawtime);
sprintf(tmp_char,"Current time is :%s",ctime(&rawtime));
result =tmp_char;
return (&result);
}
rtime.c源代码 (客户端)
/*
* rtime.c: remote version
* of "printime.c"
*/
#include <stdio.h>
#include "time.h" /* time.h generated by rpcgen */
main(int argc, char **argv)
{
CLIENT *clnt;
char *result;
char *server;
char *message;
if (argc != 3) {
fprintf(stderr, "usage: %s host message\n", argv[0]);
exit(1);
}
server = argv[1];
message = argv[2];
/*
* Create client "handle" used for
* calling TIMEPROG on the server
* designated on the command line.
*/
clnt = clnt_create(server, TIMEPROG, PRINTIMEVERS, "visible");
if (clnt == (CLIENT *)NULL) {
/*
* Couldn't establish connection
* with server.
* Print error message and die.
*/
clnt_pcreateerror(server);
exit(1);
}
/*
* Call the remote procedure
* "printime" on the server
*/
result =*printime_1(&message,clnt);
if (result== (char *)NULL) {
/*
* An error occurred while calling
* the server.
* Print error message and die.
*/
clnt_perror(clnt, server);
exit(1);
}
/* Okay, we successfully called
* the remote procedure.
*/
if (strcmp(result,"Error") == 0) {
/*
* Server was unable to print
* the time.
* Print error message and die.
*/
fprintf(stderr, "%s: could not get the time\n",argv[0]);
exit(1);
}
printf("From the Time Server ...%s\n",result);
clnt_destroy( clnt );
exit(0);
}
有了以上的三段代码后,就可用rpcgen 编译工具进行RPC协议编译,命令如下:
$rpcgen time.x
rpcgen 会自动生成time.h、time_svc.c、time_clnt.c
再用系统提供的gcc进行C的编译,命令如下:
$gcc rtime.c time_clnt.c -o rtime -lnsl //客户端编译 在freebsd下不要用-lnsl
$gcc time_proc.c time_svc.c -o time_server -lnsl //服务器端编译 在freebsd下不要用-lnsl
编译成功后即可在Server端运行time_server,立即将该服务绑定在rpc服务端口上提供
服务。在客户端运行./rtime hostname msg (msg 是一字符串,笔者用来测试时建立的),
立即会返回hostname 端的时间。
由于,在Sun Solaris 中无法获取远端Server 上时钟信息的功能(不改变本
地Server时钟),笔者曾将此程序应用于计费服务器同时钟服务器同步监测的网管
系统中,运行稳定,获得了较好的效果。应该说RPC的应用是十分广泛的,特别是
在分布式计算领域中尤为显得重要。当然,笔者也是刚接触RPC,还有很多地方了
解的不够深刻,望广大读者多指教。
本文简单介绍了RPC(Remote Procedure Call 远程过程调用)的原理结构、特点,
及其开放给编程人员不同层次的编程接口。并且例举实例示度绾瓮ü齊pcgen 编译工
具来快速开发RPC应用。
一、 概述
在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段
代码,也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益
发展的今天已无法适应实际需求。总所周知,传统过程调用模式无法充分利用网络上其
他主机的资源(如CPU、Memory等),也无法提高代码在实体间的共享程度,使得主机资
源大量浪费。
而本文要介绍的RPC编程,正是很好地解决了传统过程所存在的一系列弊端。通过RPC我
们可以充分利用非共享内存的多处理器环境(例如通过局域汪连接得多台工作站),这样
可以简便地将你的应用分布在多台工作站上,应用程序就像运行在一个多处理器的计算机
上一样。你可以方便的实现过程代码共享,提高系统资源的利用率,也可以将以大量数值
处理的操作放在处理能力较强的系统上运行,从而减轻前端机的负担。
二、 RPC的结构原理及其调用机制
如前所述RPC其实也是种C/S的编程模式,有点类似C/S Socket 编程模式,但要比它
更高一层。当我们在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以
是UDP,也可以是TCP(也即TI-RPC-无关性传输),并根据传输前所提供的目的地址及RPC
上层应用程序号转至相应的RPC Application Porgramme Server ,且此时的客户端处于等
待状态,直至收到应答或Time Out超时信号。具体的流程图如F1。当服务器端获得了请求
消息,则会根据注册RPC时告诉RPC系统的例程入口地址,执行相应的操作,并将结果返回
至客户端。
F1
当一次RPC调用结束后,相应线程发送相应的信号,客户端程序才会继续运行。
当然,一台服务主机上可以有多个远程过程提供服务,那么如何来表示一个唯一存
在的远程过程呢?一个远程过程是有三个要素来唯一确定的:程序号、版本号和过程号。
程序号是用来区别一组相关的并且具有唯一过程好的远程过程。一个程序可以有一个或几
个不同的版本,而每个版本的程序都包含一系列能被远程调用的过程,通过版本的引入,
使得不同版本下的RPC能同时提供服务。每个版本都包含有许多可供远程调用的过程,每个
过程则有其唯一标示的过程号。
三、 基于RPC的应用系统开发
通过以上对RPC原理的简介后,我们再来继续讨论如何来开发基于RPC的应用系统。
一般而言在开发RPC时,我们通常分为三个步骤:
a、 定义说明客户/服务器的通信协议。
这里所说的通信协议是指定义服务过程的名称、调用参数的数据类型和返回参数的数据
类型,还包括底层传输类型(可以是UDP或TCP),当然也可以由RPC底层函数自动选择
连接类型建立TI-RPC。最简单的协议生成的方法是采用协议编译工具,常用的有Rpcgen,
我会在后面实例中详细描述其使用方法。
b、 开发客户端程序。
c、 开发服务器端程序。
开发客户端和服务器端的程序时,RPC提供了我们不同层次的开发例程调用接口。不
同层次的接口提供了对RPC不同程度控制。一般可分为5个等级的编程接口,接下来我们
分别讨论一下各层所提供的功能函数。
1、 简单层例程
简单层是面向普通RPC应用,为了快速开发RPC应用服务而设计的,他提供
了如下功能函数。
函数名 功能描述
Rpc_reg( ) 在一特定类型的传输层上注册某个过程,来作为提供服务的RPC程序
Rpc_call( ) 远程调用在指定主机上指定的过程
Rpc_Broadcast( ) 向指定类型的所有传输端口上广播一个远程过程调用请求
2、 高层例程
在这一层,程序需要在发出调用请求前先创建一个客户端句柄,或是在侦听请
求前先建立一个服务器端句柄。程序在该层可以自由的将自己的应用绑在所有的
传输端口上,它提供了如下功能函数。
函数名 功能描述
Clnt_create( ) 程序通过这个功能调用,告诉底层RPC服务器的位置及其传输类型
Clnt_create_timed( ) 定义每次尝试连接的超时最大时间
Svc_create( ) 在指定类型的传输端口上建立服务器句柄,告诉底层RPC事件过程的相应入口地址
Clnt_call() 向服务器端发出一个RPC调用请求
3、 中间层例程
中间层向程序提供更为详细的RPC控制接口,而这一层的代码变得更为复杂,
但运行也更为有效,它提供了如下功能函数。
函数名 功能描述
Clnt_tp_create( ) 在指定的传输端口上建立客户端句柄
Clnt_tp_create_timed( ) 定义最大传输时延
Svc_tp_creaet( ) 在指定的传输端口上建立服务句柄
Clnt_call( ) 向服务器端发出RPC调用请求
4、 专家层例程
这层提供了更多的一系列与传输相关的功能调用,它提供了如下功能函数。
函数名 功能描述
Clnt_tli_create( ) 在指定的传输端口上建立客户端句柄
Svc_tli_create( ) 在指定的传输端口上建立服务句柄
Rpcb_set( ) 通过调用rpcbind将RPC服务和网络地址做映射
Rpcb_unset( ) 删除rpcb_set( ) 所建的映射关系
Rpcb_getaddr( ) 调用rpcbind来犯会指定RPC服务所对应的传输地址
Svc_reg( ) 将指定的程序和版本号与相应的时间例程建起关联
Svc_ureg( ) 删除有svc_reg( ) 所建的关联
Clnt_call( ) 客户端向指定的服务器端发起RPC请求
5、 底层例程
该层提供了所有对传输选项进行控制的调用接口,它提供了如下功能函数。
函数名 功能描述
Clnt_dg_create( ) 采用无连接方式向远程过程在客户端建立客户句柄
Svc_dg_create( ) 采用无连接方式建立服务句柄
Clnt_vc_create( ) 采用面向连接的方式建立客户句柄
Svc_vc_create( ) 采用面向连接的方式建立RPC服务句柄
Clnt_call( ) 客户端向服务器端发送调用请求
四、 实例介绍
以下我将通过实例向读者介绍通过简单层RPC的实现方法。通常在此过程中我们
将使用RPC协议编译工具-Rpcgen。Rpcgen 工具用来生成远程程序接口模块,它将以RPC
语言书写的源代码进行编译,Rpc 语言在结构和语法上同C语言相似。由Rpcgen 编译生
成的C源程序可以直接用C编译器进行编译,因此整个编译工作将分为两个部分。Rpcgen
的源程序以.x结尾,通过其编译将生成如下文件:
a) 一个头文件(.h)包括服务器和客户端程序变量、常量、类型等说明。
b) 一系列的XDR例程,它可以对头文件中定义的数据类型进行处理。
c) 一个Server 端的标准程序框架。
d) 一个Client 端的标准程序框架。
当然,这些输出可以是选择性的,Rpcgen 的编译选项说明如下:
选项 功能
'-' a 生成所有的模板文件
'-' Sc 生成客户端的模板文件
'-' Ss 生成服务器端的模板文件
'-' Sm 生成Makefile 文件
(详见Solaris Rpcgen Manaul)
Rpcgen 源程序 time.x:
/* time.x: Remote time printing protocol */
program TIMEPROG {
version PRINTIMEVERS {
string PRINTIME(string) = 1;
} = 1;
} = 0x20000001;
time_proc.c源程序(服务端):
/* time_proc.c: implementation of the remote procedure "printime" */
#include <stdio.h>
#include <rpc/rpc.h> /* always needed */
#include "time.h" /* time.h will be generated by rpcgen */
#include <time.h>
/* Remote version of "printime" */
char ** printime_1(char **msg,struct svc_req *req)
{
static char * result; /* must be static! */
static char tmp_char[100];
time_t rawtime;
FILE *f;
f = fopen("/tmp/rpc_result", "a+");
if (f == (FILE *)NULL) {
strcpy(tmp_char,"Error");
result = tmp_char;;
return (&result);
}
fprintf(f, "%s\n", *msg); //used for debugging
fclose(f);
time(&rawtime);
sprintf(tmp_char,"Current time is :%s",ctime(&rawtime));
result =tmp_char;
return (&result);
}
rtime.c源代码 (客户端)
/*
* rtime.c: remote version
* of "printime.c"
*/
#include <stdio.h>
#include "time.h" /* time.h generated by rpcgen */
main(int argc, char **argv)
{
CLIENT *clnt;
char *result;
char *server;
char *message;
if (argc != 3) {
fprintf(stderr, "usage: %s host message\n", argv[0]);
exit(1);
}
server = argv[1];
message = argv[2];
/*
* Create client "handle" used for
* calling TIMEPROG on the server
* designated on the command line.
*/
clnt = clnt_create(server, TIMEPROG, PRINTIMEVERS, "visible");
if (clnt == (CLIENT *)NULL) {
/*
* Couldn't establish connection
* with server.
* Print error message and die.
*/
clnt_pcreateerror(server);
exit(1);
}
/*
* Call the remote procedure
* "printime" on the server
*/
result =*printime_1(&message,clnt);
if (result== (char *)NULL) {
/*
* An error occurred while calling
* the server.
* Print error message and die.
*/
clnt_perror(clnt, server);
exit(1);
}
/* Okay, we successfully called
* the remote procedure.
*/
if (strcmp(result,"Error") == 0) {
/*
* Server was unable to print
* the time.
* Print error message and die.
*/
fprintf(stderr, "%s: could not get the time\n",argv[0]);
exit(1);
}
printf("From the Time Server ...%s\n",result);
clnt_destroy( clnt );
exit(0);
}
有了以上的三段代码后,就可用rpcgen 编译工具进行RPC协议编译,命令如下:
$rpcgen time.x
rpcgen 会自动生成time.h、time_svc.c、time_clnt.c
再用系统提供的gcc进行C的编译,命令如下:
$gcc rtime.c time_clnt.c -o rtime -lnsl //客户端编译 在freebsd下不要用-lnsl
$gcc time_proc.c time_svc.c -o time_server -lnsl //服务器端编译 在freebsd下不要用-lnsl
编译成功后即可在Server端运行time_server,立即将该服务绑定在rpc服务端口上提供
服务。在客户端运行./rtime hostname msg (msg 是一字符串,笔者用来测试时建立的),
立即会返回hostname 端的时间。
由于,在Sun Solaris 中无法获取远端Server 上时钟信息的功能(不改变本
地Server时钟),笔者曾将此程序应用于计费服务器同时钟服务器同步监测的网管
系统中,运行稳定,获得了较好的效果。应该说RPC的应用是十分广泛的,特别是
在分布式计算领域中尤为显得重要。当然,笔者也是刚接触RPC,还有很多地方了
解的不够深刻,望广大读者多指教。
http://photo.sina.com.cn/xlxc001
前老大到互动,我没有过去,继续搞邮箱。。。。吖!
前老大到互动,我没有过去,继续搞邮箱。。。。吖!
近来在徐州采访时发现,这里的汉文化十分丰富,当地人谈起出生于此的汉高祖刘邦,脸上显露出的都是一种自豪。今天,来聊聊刘邦这个皇帝与同为布衣出身的朱元璋的故事,特别是在“夫妻生活”上的不同。
“惟公与我起布衣而有天下”,这话是朱元璋说的,其中的“公”指汉高祖刘邦。当年,朱元璋称帝后,拜祭历代帝王庙时,仅给刘邦敬了一杯酒,原因就在这句话里:两人一样都是从平头老百姓起家当上皇帝的。
从史书的记载上看,刘邦与朱元璋这两位“皇帝哥们”出身和经历有相似之处,而且在位时都很有作为。其在巩固政权的手段上也惊人一巧合,就是杀尽出生入死的大臣,刘邦身边的韩信、彭越、英布等都被他杀了;朱元璋也是,开国之臣李善长让他逼自杀了,大将军徐达让他赐发物蒸鹅给弄死了。在休养生息政策上,刘邦和朱元璋都采取了不少有益于民众的措施,促进了当时社会稳定和生产力水平的提高。但是,两人也有很大的不同,就是对待女色上,在后宫生活中的反差相当大。
在性生活,在美色消费方面,刘邦是很滥的,性取向混乱,这可能是由于秦汉时期从民间到宫里,纵欲之风盛行(目前出土有大量汉代性用具,就是一个佐证)之故;而吕后与戚夫人之间的明争暗斗,也给刘邦的丰功伟绩上抹了一笔黑。而朱元璋的形象很好,虽然滥杀了重多大臣,亦有众多嫔妃,但那是中国传统帝王后宫制度造成的,比起刘邦,可以说朱元璋在性事方面规矩多了,特别钟情于妻子马秀英。而马氏也是中国历史上难得的一位好皇后,她死后,朱元璋多年不册立新后,如果在民间,他们真的就是一对“模范夫妻”了。
图:历史上的刘邦与吕雉(资料图合成)
图:历史上的朱元璋与马秀英(资料图合成)
先来聊聊刘邦的后宫。
多读历史的人都知道,刘邦的后宫是充满血腥味的。刘邦的正妻吕后,名雉,字娥姁,今山东单县人,迁居徐州沛县。吕后在中国众多的皇后中,算是心毒手狠、极有心计的一个女人,如果没有唐代的武则天,我想就数她最著名了。
刘邦是徐州市沛县阳里村人(一说今丰县城西),本是一个好吃懒做的人,整日游手好闲,40岁时还是光棍一个。他解决性需要的办法就是,常年与一个姓曹的女人鬼混,还生了一个儿子,取名刘肥。刘邦当了皇帝后,刘肥被立为齐王,这是后话。虽然是个混混,但刘邦脑子好使,什么东西一学就会。后来,经人指点,给当地的官员跑腿,混上了泗水亭长。从此,他与县里一班官员有了来往,如萧何、曹参、夏侯婴。虽然已是个地方小官,但因为有劣迹在前,此时仍娶不到老婆,良家不愿把闺女嫁给这个“流氓”。据说吕雉的父亲会相面,觉得刘邦相貌不俗,将来必成大器,于是将当时已是“大龄女青年”的闺女吕雉嫁给刘邦,刘邦这才有了老婆。其实,在今天看来吕雉嫁给刘邦时并不算大,才25岁。当时乡亲们都嘲笑刘邦的老丈人嫁女行为很愚蠢。谁想,刘邦后来做了皇帝。据说,吕雉当年也觉得丈夫将来会有出息,说是刘邦到哪头顶上总有一团祥云跟着。
吕雉给刘邦生了一儿一女,即惠帝刘盈和鲁元公主。但吕雉好争风吃醋,在当了皇后后更做了许多“人做不出来”的事情,如把戚夫人制成“人彘”,成就了她中国历史上最毒“毒妇”的骂名。
刘邦是很有女人缘的,结婚之前就把一曹姓女人勾上手了,在婚后一样走桃花运。在与项羽争夺江山期间,前期老吃败仗,但却收获到了一个年轻美貌、后来影响后宫的女人——戚夫人。得到戚夫人的故事很浪漫,说是有一次败给项羽后,连饭也没得吃,逃到一村子里遇见一个老人。老人姓戚,带着18岁的闺女在此躲避战乱。一见带兵的刘邦,老人吓得连忙下拜,并带他回家里弄菜弄酒给他吃。刘邦见到老人的闺女,顿时动了心思,得知女孩尚未嫁人后,心中窃喜。老人看出意思,就说相面先生讲他闺女有贵人之相,难道遇到大王,就是她的前世姻缘?于是要把闺女许给刘邦为妻。虽然说刘邦心里暗喜,考虑家有妻室,已有吕雉,也客气了一番才应下。据说,刘邦是解下自己的玉带作为定情之物,老人当晚便让闺女陪刘邦睡觉了,刘邦这个老岳父看来比今天的父母们还想得开呢。
图:现代影视作品中的刘邦之皇后吕雉(,吴倩莲饰,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的刘邦之妃戚夫人(嘉碧仪饰,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的刘邦之情人曹女(沈傲君饰,图源于网络,摄影者不详,如有侵权请指出)
到此,刘邦已有了三个女人,一个情人曹氏,第一房妻子吕氏,第二妻子戚氏。刘邦与吕雉的感情本来是不错的,但在夺了天下后,情况却发生了变化。吕雉比戚夫人大多了,戚献身刘邦是才18女人的黄花大闺女,也是中国历史上有名的美女之一,而吕当年是有嫁不出之嫌的女人,年龄一大了自然就成了“豆腐渣”,年老色衰的吕雉敌不过戚。分别当了皇后和爱妃(夫人)后的两个女人,就开始明争暗斗起来了。
起先戚夫人占上风,刘邦每次外出都由戚夫人陪侍,而把吕后丢在后宫。戚夫人长得漂亮,歌舞也好。乐得刘邦天天把美人搂在怀里,而冷落了吕后,渐渐刘邦与吕后之间的情感就出了问题。本来已定下吕后生的儿子刘盈为太子,戚夫人却希望让自己10岁的儿子如意继位。刘邦也看不好刘盈,觉得性格不像自己,而如意却很聪明,有自己年轻时的样子。当刘邦把自己废太子想法拿到朝中商议时,如果不是有口吃的大臣周昌冒死力谏,戚夫人的阴谋差点就成了。后来,戚夫人又多次向刘邦提出立自己儿子为太子的事情,但年老的刘邦心有余而力不足了,因为在吕后的精心策划下,太子的势力已形成,没有办法废了。年幼的如意被迫离开京城到三千外的封地为王。
刘邦死后,刘盈继位,史称惠帝。贵为太后的吕雉卷土重来,“恶毒妇人心”显露了出来。她第一件事情是把“情故”戚夫人罚为奴隶,让人用钳子把她的一头秀发统统拨光,搞成了秃子,罚她去舂米劳动,限每天要舂一石,如果少半升则要打她一百棍。据史书上记载,自知命运不济的戚夫人悲中心中来:“子为王,母为虏,终日舂,薄暮常与死相伍,相隔三千里,谁当使告汝?”吕后闻讯,心生毒计,把戚夫人的儿子如意透进京城,暗暗给毒死了。如意死时是七窍出血,连已称帝的刘盈也于心不忍,大哭了一场,用王的礼仪将同父螶母的如意葬了,谥号隐王。
但就这样还不解恨,吕雉最后用“人彘”之刑把戚夫人活活给弄死了。自己的兄弟死后,刘盈很悲伤的,但吕后竟然让他去看“人彘”表演。刘盈也不知“人彘”为何物,便跟着太监去看了,七弯八绕到一间厕所里,看到一个血人,四肢全被砍了,眼珠被挖了,剩下两个血窟窿,人还没有死,身子还能动,嘴一张一张的。刘盈便问太监这是什么,一听是戚夫人,他差点被吓晕了。原来,吕雉对戚夫人下了毒手,施了酷刑后,又给她硬灌了药,让她听不见,不能语,半死不活地扔到了厕所里。惠帝因为受此惊吓,从此也不敢“治天下”了,终日饮酒作乐,仅做了七年皇帝就死了。
吕后的恶毒其实与刘邦有直接关系:他没有处理好夫妻之间的感情问题,特别是在称帝后十分好色,纵欲,把宠爱全给了年轻美貌的戚夫人,让结发之妻吕后独守冷宫,从常理上讲,吕后对戚夫人怀有不满是可以理解的。戚夫人希望自己的儿子当太子,也是感到刘邦死后自己的日子会很难过的,所以才希望刘邦废了刘盈。
这里再说一下,刘邦不仅十分好女色,性取向也十分混乱,是一个“双性恋”。他的男宠据说叫籍孺,刘邦经常与他同寝。这种性取向的存在可能与汉代人相信“美男破老”的习俗有关,当时人认为与年轻的美男子同房可以延年益寿。从这里可以看出,在女色方面,刘邦确实是不能与朱元璋相比的。
再聊聊朱元璋的后宫。
刘邦没有一个好的皇后,朱元璋的后宫却很幸福,自然是因为皇后马秀英的仁慈。因为马皇后的出现,中国帝王的后宫里才多了一位值得称道的女性。
图:现代影视作品中的马皇后之徐帆版(《传奇皇帝朱元璋》,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的马皇后之吕丽萍版(《大脚马皇后》,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的马皇后之剧雪版(《朱元璋》,图源于网络,摄影者不详,如有侵权请指出)
在与马秀英认识前,朱元璋不像刘邦那样有前科,既无情人,也不游手好闲。他放过牛,做过和尚。因为瘟疫,家里的人全死光了;因为贫穷,父母哥兄死后只能用草席埋了了事。他成了孤儿,可以说家境比当年的刘邦差多了。但就是这样,朱元璋“奋起淮甸,仗剑渡江,英贤云集,平伪汉,伐伪昊,定关中,廓清中原,遂平元都,混一海宇,不十年而成大业。”(《太祖实录》)
与刘邦一样,朱元璋的妻室也是人家“送”的。不同的地方是,刘邦是名声不好,娶不到,朱元璋则因家里贫寒,娶不起。元顺帝至正十二年(1352年)三月年,朱元璋投奔郭子兴时,其时还是一个穷和尚。郭子兴是安徽定远县有名的土财主,因无法忍受元人的欺侮,在濠州发动起义。收了朱元璋后,郭子兴常带他在身边,当亲兵用。
在智慧上,朱元璋与刘邦都有过人的地方。因为有勇有谋,才受到郭子兴的信任和器重,投奔两个月后,郭子兴与夫人张氏作主,将义女马秀英嫁给了朱元璋,这样也好拴着朱元璋的野心,让他忠心效劳。马秀英是安徽宿州人,父亲名字不详,史书上只称“马公”,母亲叫郑媪,在马秀英很小的时候就死了。马秀英的父亲因为杀了人,从宿州逃到定远,把闺女托付给有交情的郭子兴,这样马秀英成了郭子兴的义女,寄养郭家。后来,马父客死他乡,郭子兴待马秀英更如亲生闺女,据说亲自教她读书写字。马氏长大后,端庄秀丽,但天生一双大足,时人称天足,未缠过脚。因为这双脚,民间戏称马秀英为“马大脚”。
马秀英嫁给朱元璋后,很是疼爱自己这位小和尚出身的丈夫。据说有一次因为伤了郭子兴的面子,郭一气之下将他关了禁闭,也不给吃的。马秀英一听急了,从伙房偷了一个刚出锅的馒头送给朱元璋,路上碰巧碰到了义母张氏,便慌忙把馒头往怀里藏,结果把乳房都烫伤了,可见朱元璋与马秀英之间的恩爱程度。正因为这样,朱元璋当皇帝后,天不怕地不怕,就怕皇后马娘娘,生怕马秀英不高兴。而马氏因为恪守妇道,人品好,后宫嫔妃没有人不服,史学家称马氏是一个称职贤惠宽厚仁慈的正宫娘娘。
史书上对马皇后多有褒言,《明通鉴》称,“后,宿州人,仁慈有智鉴,好书史,佐上定天下,恒劝以不嗜杀人为本。及册为皇后,勤于内治,暇则讲求古训,告六宫以宋多贤后,命女史录其家法,朝夕省览。·······妃嫔、宫人皆厚待之。命妇入朝,如家人礼。爱诵《小学》,尝求上表章。上决事或震怒,辄随事微谏。虽上性严,为缓刑,戮者数矣。”可见,吕雉与马秀英是两个完全不能相比同论的皇后,一个恶毒,一个仁慈;一个不守妇道,搞乱后宫,一个恪守女道,稳定后宫;一个烦神,一个省心。
在这一点,刘邦确实是不幸的,而朱元璋则是幸运的。马皇后为他生育了不少儿子,《历代陵寝备考》称,“后生懿文太子、泰王樉、晋王桐、成祖、周王”(注,有史书称马皇后不能生育,或是朱棣非其亲生,见:《明成祖朱棣与四个女人说不清道不明的关系》),还为他的政事操心。马皇后多次劝朱元璋,“诚如陛下言。妾与陛下起贫贱,至今日,恒恐骄纵起于奢侈,危亡起于细微。故欲得贤人,共理天下。”如果不是马皇后,朱元璋还不知要滥杀多少人呢。而刘邦的皇后吕雉呢,则嫉贤妒能,为了坐稳自己的皇后,什么事都干得出来。
朱元璋也深知自己妻子的贤能,在马皇后生病后,朱元璋为她请来了良医,还亲自送饭,亲手喂药,大臣也为她祷祀。《明通鉴》载,马皇后告诉朱元璋,“死生命也,祷祀何益?且医何能活人,使服药不效,得毋以妾故罪诸医平?”《国榷》也称,“后微时,依郭子兴家,事上备极艰苦。每佐征讨大策,补缝行间,虽贵极,谦素不渝。上或谴怒,辄婉辞。朝夕尚食,手剂之,其谨微类此。疾笃,不复饮药。曰:‘药无益,徒为医者累’。”临死时,朱元璋问她有什么话留下,她说,“愿陛下求贤纳诛,慎终如始。”洪武15年,马皇后死了,时年51岁。当时朱元璋是泪如雨下,至死也没有再立一个皇后。
死后,朱元璋给马皇后很高的荣誉,谥之“孝慈昭宪至仁文德承天顺圣高皇后”,孝陵之名即由此而来。嘉靖十七年,加谥“孝慈贞化哲顺仁徽成天育圣至德高皇后”(《明史·后妃传》)。
虽然朱元璋与马秀英两人之间感情极好,但并不能说朱元璋的后宫生活就不丰富,朱元璋也是男人,是男人就喜欢美女,他性生活同样出色。《明会典》中称,“太祖四十妃嫔,惟二妃葬陵之东西,余俱从葬。”又有史书称是四十六女嫔妃。不论到底哪一个数字正确,至少可以证明一点,朱元璋死前享用的女人不低于40名啊。《国榷》中记载,有昭敬充妃胡氏、成穆贵妃孙氏、淑妃李氏、安妃郑氏、庄清安荣惠妃崔氏、安妃达氏、碽妃、宁妃郭氏、惠妃郭氏、顺妃胡氏、郜氏、韩氏、余氏、杨氏、周氏、贵妃赵氏、贤妃李氏、惠妃刘氏、丽妃万氏。等等。
汉、明两朝的帝王生活都是很荒淫的,两朝都出了很多风流帝王,如汉武帝“金屋藏娇”、汉成帝“牡丹花下死”、明武帝“豹房纵欲”、明世宗“炼丹恋色”。而朱元璋虽有众多嫔妃,却独独没有“荒淫皇帝”的骂名,令人称奇。刘邦不同了,同样是开国之君,民间则认为他是一位“流氓皇帝”。这到底为何?我前面说了,原因除了生理需要上差异之外,也许刘邦性欲比朱元璋强嘛,但主要是各人在对待女色、对待皇后态度上的不同所致。
刘邦一见吕后年老色衰,就拿结发妻子不当妻子了,而独宠戚夫人。朱元璋则不同,虽然马皇后生的是一双大脚,这在过去是很丑的女人,但朱元璋一直视之如贤妻。马皇后病了,他是“朝夕尚食,手剂之”。这种只能在寻常夫妻中才能看到的情形,出现在朱元璋的后宫中,实在是难得啊。而马皇后在朱元璋的女色消费上,也不是不管不问的,但她对朱元璋并不采取性控制的手段,让他专宠她一人,而是充许、甚至鼓励朱元璋纳妃子,包括前朝元顺帝的妃子洪吉喇氏(有人称是朱棣生母)、朝鲜女人李氏、对手陈友谅的小老婆。如果是吕后,这些女人恐怕早给折磨死了。但马皇后却很好地理顺了这么多女人之间的关系,宽厚仁慈,同样难得!
俗话说,家有贤妻旺夫啊,对于帝王来说,这道理是一样的。刘邦和朱元璋虽然都出生平民,但在史上留下了不同的评价,我想与两人皇后的优劣不无关系,但归根到底,还与两人对性生活态度的不同造成的。这里再补充说一下,刘邦的老婆还曾“红杏出墙”呢。据说,在刘邦与项羽南征北战,连性命都不保时,吕雉却在家里与同村的名叫审食其的男人勾搭成奸。本来刘邦考虑自己常年征战在外,家里无人照应,让审食其帮着照料自己妻小的,谁想性欲难忍的吕雉却与他眉来眼去,日久生情,在家过起了“夫妻生活”。后来,项羽把他们作为人质扣留时,吕雉与审食其仍同食同宿,外人竟然发现不了,故有史学家称吕雉不只是“毒妇”,还是“偷情高手”。
刘邦称帝后,吕雉还提请封审食其为“辟阳侯”,为刘邦同意。据说此后,俩人“偷情”时,审令其在床上更卖力了,答谢吕雉为自己的努力。刘邦虽然是战场上的大丈夫,但在情场上则是戴绿帽的君子,后宫失守啊。可叹的是,他死时也不知此事啊(也许是故意装着不知)!这是不是一种报应,有一种因果关系?如果刘邦如朱元璋那样,对老婆忠贞不渝,性生活讲点规矩,吕雉的行为或许也会收敛一些的,或许吕雉当年就是这样想的,你能偷人我为什么不能养汉?而按照以性问题为研究对象的社会学家李银河女士的观点,吕雉这么做也是争取性生活的平等,呵呵。(作者 倪方六)
“惟公与我起布衣而有天下”,这话是朱元璋说的,其中的“公”指汉高祖刘邦。当年,朱元璋称帝后,拜祭历代帝王庙时,仅给刘邦敬了一杯酒,原因就在这句话里:两人一样都是从平头老百姓起家当上皇帝的。
从史书的记载上看,刘邦与朱元璋这两位“皇帝哥们”出身和经历有相似之处,而且在位时都很有作为。其在巩固政权的手段上也惊人一巧合,就是杀尽出生入死的大臣,刘邦身边的韩信、彭越、英布等都被他杀了;朱元璋也是,开国之臣李善长让他逼自杀了,大将军徐达让他赐发物蒸鹅给弄死了。在休养生息政策上,刘邦和朱元璋都采取了不少有益于民众的措施,促进了当时社会稳定和生产力水平的提高。但是,两人也有很大的不同,就是对待女色上,在后宫生活中的反差相当大。
在性生活,在美色消费方面,刘邦是很滥的,性取向混乱,这可能是由于秦汉时期从民间到宫里,纵欲之风盛行(目前出土有大量汉代性用具,就是一个佐证)之故;而吕后与戚夫人之间的明争暗斗,也给刘邦的丰功伟绩上抹了一笔黑。而朱元璋的形象很好,虽然滥杀了重多大臣,亦有众多嫔妃,但那是中国传统帝王后宫制度造成的,比起刘邦,可以说朱元璋在性事方面规矩多了,特别钟情于妻子马秀英。而马氏也是中国历史上难得的一位好皇后,她死后,朱元璋多年不册立新后,如果在民间,他们真的就是一对“模范夫妻”了。
图:历史上的刘邦与吕雉(资料图合成)
图:历史上的朱元璋与马秀英(资料图合成)
先来聊聊刘邦的后宫。
多读历史的人都知道,刘邦的后宫是充满血腥味的。刘邦的正妻吕后,名雉,字娥姁,今山东单县人,迁居徐州沛县。吕后在中国众多的皇后中,算是心毒手狠、极有心计的一个女人,如果没有唐代的武则天,我想就数她最著名了。
刘邦是徐州市沛县阳里村人(一说今丰县城西),本是一个好吃懒做的人,整日游手好闲,40岁时还是光棍一个。他解决性需要的办法就是,常年与一个姓曹的女人鬼混,还生了一个儿子,取名刘肥。刘邦当了皇帝后,刘肥被立为齐王,这是后话。虽然是个混混,但刘邦脑子好使,什么东西一学就会。后来,经人指点,给当地的官员跑腿,混上了泗水亭长。从此,他与县里一班官员有了来往,如萧何、曹参、夏侯婴。虽然已是个地方小官,但因为有劣迹在前,此时仍娶不到老婆,良家不愿把闺女嫁给这个“流氓”。据说吕雉的父亲会相面,觉得刘邦相貌不俗,将来必成大器,于是将当时已是“大龄女青年”的闺女吕雉嫁给刘邦,刘邦这才有了老婆。其实,在今天看来吕雉嫁给刘邦时并不算大,才25岁。当时乡亲们都嘲笑刘邦的老丈人嫁女行为很愚蠢。谁想,刘邦后来做了皇帝。据说,吕雉当年也觉得丈夫将来会有出息,说是刘邦到哪头顶上总有一团祥云跟着。
吕雉给刘邦生了一儿一女,即惠帝刘盈和鲁元公主。但吕雉好争风吃醋,在当了皇后后更做了许多“人做不出来”的事情,如把戚夫人制成“人彘”,成就了她中国历史上最毒“毒妇”的骂名。
刘邦是很有女人缘的,结婚之前就把一曹姓女人勾上手了,在婚后一样走桃花运。在与项羽争夺江山期间,前期老吃败仗,但却收获到了一个年轻美貌、后来影响后宫的女人——戚夫人。得到戚夫人的故事很浪漫,说是有一次败给项羽后,连饭也没得吃,逃到一村子里遇见一个老人。老人姓戚,带着18岁的闺女在此躲避战乱。一见带兵的刘邦,老人吓得连忙下拜,并带他回家里弄菜弄酒给他吃。刘邦见到老人的闺女,顿时动了心思,得知女孩尚未嫁人后,心中窃喜。老人看出意思,就说相面先生讲他闺女有贵人之相,难道遇到大王,就是她的前世姻缘?于是要把闺女许给刘邦为妻。虽然说刘邦心里暗喜,考虑家有妻室,已有吕雉,也客气了一番才应下。据说,刘邦是解下自己的玉带作为定情之物,老人当晚便让闺女陪刘邦睡觉了,刘邦这个老岳父看来比今天的父母们还想得开呢。
图:现代影视作品中的刘邦之皇后吕雉(,吴倩莲饰,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的刘邦之妃戚夫人(嘉碧仪饰,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的刘邦之情人曹女(沈傲君饰,图源于网络,摄影者不详,如有侵权请指出)
到此,刘邦已有了三个女人,一个情人曹氏,第一房妻子吕氏,第二妻子戚氏。刘邦与吕雉的感情本来是不错的,但在夺了天下后,情况却发生了变化。吕雉比戚夫人大多了,戚献身刘邦是才18女人的黄花大闺女,也是中国历史上有名的美女之一,而吕当年是有嫁不出之嫌的女人,年龄一大了自然就成了“豆腐渣”,年老色衰的吕雉敌不过戚。分别当了皇后和爱妃(夫人)后的两个女人,就开始明争暗斗起来了。
起先戚夫人占上风,刘邦每次外出都由戚夫人陪侍,而把吕后丢在后宫。戚夫人长得漂亮,歌舞也好。乐得刘邦天天把美人搂在怀里,而冷落了吕后,渐渐刘邦与吕后之间的情感就出了问题。本来已定下吕后生的儿子刘盈为太子,戚夫人却希望让自己10岁的儿子如意继位。刘邦也看不好刘盈,觉得性格不像自己,而如意却很聪明,有自己年轻时的样子。当刘邦把自己废太子想法拿到朝中商议时,如果不是有口吃的大臣周昌冒死力谏,戚夫人的阴谋差点就成了。后来,戚夫人又多次向刘邦提出立自己儿子为太子的事情,但年老的刘邦心有余而力不足了,因为在吕后的精心策划下,太子的势力已形成,没有办法废了。年幼的如意被迫离开京城到三千外的封地为王。
刘邦死后,刘盈继位,史称惠帝。贵为太后的吕雉卷土重来,“恶毒妇人心”显露了出来。她第一件事情是把“情故”戚夫人罚为奴隶,让人用钳子把她的一头秀发统统拨光,搞成了秃子,罚她去舂米劳动,限每天要舂一石,如果少半升则要打她一百棍。据史书上记载,自知命运不济的戚夫人悲中心中来:“子为王,母为虏,终日舂,薄暮常与死相伍,相隔三千里,谁当使告汝?”吕后闻讯,心生毒计,把戚夫人的儿子如意透进京城,暗暗给毒死了。如意死时是七窍出血,连已称帝的刘盈也于心不忍,大哭了一场,用王的礼仪将同父螶母的如意葬了,谥号隐王。
但就这样还不解恨,吕雉最后用“人彘”之刑把戚夫人活活给弄死了。自己的兄弟死后,刘盈很悲伤的,但吕后竟然让他去看“人彘”表演。刘盈也不知“人彘”为何物,便跟着太监去看了,七弯八绕到一间厕所里,看到一个血人,四肢全被砍了,眼珠被挖了,剩下两个血窟窿,人还没有死,身子还能动,嘴一张一张的。刘盈便问太监这是什么,一听是戚夫人,他差点被吓晕了。原来,吕雉对戚夫人下了毒手,施了酷刑后,又给她硬灌了药,让她听不见,不能语,半死不活地扔到了厕所里。惠帝因为受此惊吓,从此也不敢“治天下”了,终日饮酒作乐,仅做了七年皇帝就死了。
吕后的恶毒其实与刘邦有直接关系:他没有处理好夫妻之间的感情问题,特别是在称帝后十分好色,纵欲,把宠爱全给了年轻美貌的戚夫人,让结发之妻吕后独守冷宫,从常理上讲,吕后对戚夫人怀有不满是可以理解的。戚夫人希望自己的儿子当太子,也是感到刘邦死后自己的日子会很难过的,所以才希望刘邦废了刘盈。
这里再说一下,刘邦不仅十分好女色,性取向也十分混乱,是一个“双性恋”。他的男宠据说叫籍孺,刘邦经常与他同寝。这种性取向的存在可能与汉代人相信“美男破老”的习俗有关,当时人认为与年轻的美男子同房可以延年益寿。从这里可以看出,在女色方面,刘邦确实是不能与朱元璋相比的。
再聊聊朱元璋的后宫。
刘邦没有一个好的皇后,朱元璋的后宫却很幸福,自然是因为皇后马秀英的仁慈。因为马皇后的出现,中国帝王的后宫里才多了一位值得称道的女性。
图:现代影视作品中的马皇后之徐帆版(《传奇皇帝朱元璋》,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的马皇后之吕丽萍版(《大脚马皇后》,图源于网络,摄影者不详,如有侵权请指出)
图:现代影视作品中的马皇后之剧雪版(《朱元璋》,图源于网络,摄影者不详,如有侵权请指出)
在与马秀英认识前,朱元璋不像刘邦那样有前科,既无情人,也不游手好闲。他放过牛,做过和尚。因为瘟疫,家里的人全死光了;因为贫穷,父母哥兄死后只能用草席埋了了事。他成了孤儿,可以说家境比当年的刘邦差多了。但就是这样,朱元璋“奋起淮甸,仗剑渡江,英贤云集,平伪汉,伐伪昊,定关中,廓清中原,遂平元都,混一海宇,不十年而成大业。”(《太祖实录》)
与刘邦一样,朱元璋的妻室也是人家“送”的。不同的地方是,刘邦是名声不好,娶不到,朱元璋则因家里贫寒,娶不起。元顺帝至正十二年(1352年)三月年,朱元璋投奔郭子兴时,其时还是一个穷和尚。郭子兴是安徽定远县有名的土财主,因无法忍受元人的欺侮,在濠州发动起义。收了朱元璋后,郭子兴常带他在身边,当亲兵用。
在智慧上,朱元璋与刘邦都有过人的地方。因为有勇有谋,才受到郭子兴的信任和器重,投奔两个月后,郭子兴与夫人张氏作主,将义女马秀英嫁给了朱元璋,这样也好拴着朱元璋的野心,让他忠心效劳。马秀英是安徽宿州人,父亲名字不详,史书上只称“马公”,母亲叫郑媪,在马秀英很小的时候就死了。马秀英的父亲因为杀了人,从宿州逃到定远,把闺女托付给有交情的郭子兴,这样马秀英成了郭子兴的义女,寄养郭家。后来,马父客死他乡,郭子兴待马秀英更如亲生闺女,据说亲自教她读书写字。马氏长大后,端庄秀丽,但天生一双大足,时人称天足,未缠过脚。因为这双脚,民间戏称马秀英为“马大脚”。
马秀英嫁给朱元璋后,很是疼爱自己这位小和尚出身的丈夫。据说有一次因为伤了郭子兴的面子,郭一气之下将他关了禁闭,也不给吃的。马秀英一听急了,从伙房偷了一个刚出锅的馒头送给朱元璋,路上碰巧碰到了义母张氏,便慌忙把馒头往怀里藏,结果把乳房都烫伤了,可见朱元璋与马秀英之间的恩爱程度。正因为这样,朱元璋当皇帝后,天不怕地不怕,就怕皇后马娘娘,生怕马秀英不高兴。而马氏因为恪守妇道,人品好,后宫嫔妃没有人不服,史学家称马氏是一个称职贤惠宽厚仁慈的正宫娘娘。
史书上对马皇后多有褒言,《明通鉴》称,“后,宿州人,仁慈有智鉴,好书史,佐上定天下,恒劝以不嗜杀人为本。及册为皇后,勤于内治,暇则讲求古训,告六宫以宋多贤后,命女史录其家法,朝夕省览。·······妃嫔、宫人皆厚待之。命妇入朝,如家人礼。爱诵《小学》,尝求上表章。上决事或震怒,辄随事微谏。虽上性严,为缓刑,戮者数矣。”可见,吕雉与马秀英是两个完全不能相比同论的皇后,一个恶毒,一个仁慈;一个不守妇道,搞乱后宫,一个恪守女道,稳定后宫;一个烦神,一个省心。
在这一点,刘邦确实是不幸的,而朱元璋则是幸运的。马皇后为他生育了不少儿子,《历代陵寝备考》称,“后生懿文太子、泰王樉、晋王桐、成祖、周王”(注,有史书称马皇后不能生育,或是朱棣非其亲生,见:《明成祖朱棣与四个女人说不清道不明的关系》),还为他的政事操心。马皇后多次劝朱元璋,“诚如陛下言。妾与陛下起贫贱,至今日,恒恐骄纵起于奢侈,危亡起于细微。故欲得贤人,共理天下。”如果不是马皇后,朱元璋还不知要滥杀多少人呢。而刘邦的皇后吕雉呢,则嫉贤妒能,为了坐稳自己的皇后,什么事都干得出来。
朱元璋也深知自己妻子的贤能,在马皇后生病后,朱元璋为她请来了良医,还亲自送饭,亲手喂药,大臣也为她祷祀。《明通鉴》载,马皇后告诉朱元璋,“死生命也,祷祀何益?且医何能活人,使服药不效,得毋以妾故罪诸医平?”《国榷》也称,“后微时,依郭子兴家,事上备极艰苦。每佐征讨大策,补缝行间,虽贵极,谦素不渝。上或谴怒,辄婉辞。朝夕尚食,手剂之,其谨微类此。疾笃,不复饮药。曰:‘药无益,徒为医者累’。”临死时,朱元璋问她有什么话留下,她说,“愿陛下求贤纳诛,慎终如始。”洪武15年,马皇后死了,时年51岁。当时朱元璋是泪如雨下,至死也没有再立一个皇后。
死后,朱元璋给马皇后很高的荣誉,谥之“孝慈昭宪至仁文德承天顺圣高皇后”,孝陵之名即由此而来。嘉靖十七年,加谥“孝慈贞化哲顺仁徽成天育圣至德高皇后”(《明史·后妃传》)。
虽然朱元璋与马秀英两人之间感情极好,但并不能说朱元璋的后宫生活就不丰富,朱元璋也是男人,是男人就喜欢美女,他性生活同样出色。《明会典》中称,“太祖四十妃嫔,惟二妃葬陵之东西,余俱从葬。”又有史书称是四十六女嫔妃。不论到底哪一个数字正确,至少可以证明一点,朱元璋死前享用的女人不低于40名啊。《国榷》中记载,有昭敬充妃胡氏、成穆贵妃孙氏、淑妃李氏、安妃郑氏、庄清安荣惠妃崔氏、安妃达氏、碽妃、宁妃郭氏、惠妃郭氏、顺妃胡氏、郜氏、韩氏、余氏、杨氏、周氏、贵妃赵氏、贤妃李氏、惠妃刘氏、丽妃万氏。等等。
汉、明两朝的帝王生活都是很荒淫的,两朝都出了很多风流帝王,如汉武帝“金屋藏娇”、汉成帝“牡丹花下死”、明武帝“豹房纵欲”、明世宗“炼丹恋色”。而朱元璋虽有众多嫔妃,却独独没有“荒淫皇帝”的骂名,令人称奇。刘邦不同了,同样是开国之君,民间则认为他是一位“流氓皇帝”。这到底为何?我前面说了,原因除了生理需要上差异之外,也许刘邦性欲比朱元璋强嘛,但主要是各人在对待女色、对待皇后态度上的不同所致。
刘邦一见吕后年老色衰,就拿结发妻子不当妻子了,而独宠戚夫人。朱元璋则不同,虽然马皇后生的是一双大脚,这在过去是很丑的女人,但朱元璋一直视之如贤妻。马皇后病了,他是“朝夕尚食,手剂之”。这种只能在寻常夫妻中才能看到的情形,出现在朱元璋的后宫中,实在是难得啊。而马皇后在朱元璋的女色消费上,也不是不管不问的,但她对朱元璋并不采取性控制的手段,让他专宠她一人,而是充许、甚至鼓励朱元璋纳妃子,包括前朝元顺帝的妃子洪吉喇氏(有人称是朱棣生母)、朝鲜女人李氏、对手陈友谅的小老婆。如果是吕后,这些女人恐怕早给折磨死了。但马皇后却很好地理顺了这么多女人之间的关系,宽厚仁慈,同样难得!
俗话说,家有贤妻旺夫啊,对于帝王来说,这道理是一样的。刘邦和朱元璋虽然都出生平民,但在史上留下了不同的评价,我想与两人皇后的优劣不无关系,但归根到底,还与两人对性生活态度的不同造成的。这里再补充说一下,刘邦的老婆还曾“红杏出墙”呢。据说,在刘邦与项羽南征北战,连性命都不保时,吕雉却在家里与同村的名叫审食其的男人勾搭成奸。本来刘邦考虑自己常年征战在外,家里无人照应,让审食其帮着照料自己妻小的,谁想性欲难忍的吕雉却与他眉来眼去,日久生情,在家过起了“夫妻生活”。后来,项羽把他们作为人质扣留时,吕雉与审食其仍同食同宿,外人竟然发现不了,故有史学家称吕雉不只是“毒妇”,还是“偷情高手”。
刘邦称帝后,吕雉还提请封审食其为“辟阳侯”,为刘邦同意。据说此后,俩人“偷情”时,审令其在床上更卖力了,答谢吕雉为自己的努力。刘邦虽然是战场上的大丈夫,但在情场上则是戴绿帽的君子,后宫失守啊。可叹的是,他死时也不知此事啊(也许是故意装着不知)!这是不是一种报应,有一种因果关系?如果刘邦如朱元璋那样,对老婆忠贞不渝,性生活讲点规矩,吕雉的行为或许也会收敛一些的,或许吕雉当年就是这样想的,你能偷人我为什么不能养汉?而按照以性问题为研究对象的社会学家李银河女士的观点,吕雉这么做也是争取性生活的平等,呵呵。(作者 倪方六)
Beyond,我很早就喜欢的乐队,也是到目前为止,在我心里最后震撼力的一支乐队!我喜欢他们的歌曲、喜欢他们的作风!Beyond的歌曲,很让人振作、让人聯想...然而世界总在发生一些让人惋惜的事,家駒的早逝就属于这一类。对于家駒的早逝,除了更多的伤感与哀叹,剩下的只有回忆与再回忆...
偶然又特殊的一天-6月1日儿童节,在MSN的RSS上面发现了如此精彩的文章—《十年BEYOND十年歌》,亲爱的作者,请允许我收藏,感谢你的辛苦劳动! -- Marco.chan
[39] ---下文为转载内容---
转载地址:http://msn.dzh.mop.com/static/msn/5476531.html
十年BEYOND十年歌
十年BEYOND十年歌,十几年的时光,BEYOND的音乐陪伴我度过少年和青年时代,直到步入社会, 动人的音乐鼓舞震撼着我和许许多多的人.没有家驹的日子里,我会一遍一遍的重温那二百余首佳作,我盼望着能和许许多多的朋友共享,尤其是年轻的朋友.近二百首作品无法一一回顾,不得已,采取一个大众化的办法,评论我心中的十大吧
1.[海阔天空]:词/曲:黄家驹
毋庸质疑的BEYOND的经典,家驹艺术生涯的颠峰之作.这首1993年初推出的作品情感如此深沉,无数人为之流泪。天尽头,苍凉的钢琴声缓缓而起,"今天我,长夜里看雪飘过...",是家驹一个人的声音,随着和声越来越多,感情越来越炽热,我感到自己对实现理想的渴望随着歌声 爆发出来,无保留的...,我相信无数的人和我一样加入到这个队伍中来,一起来唱"原谅我这一生不羁放纵爱自由,哪会怕有一天会跌倒...".[海阔天空]是家驹一生信念的写照,就在这一年 他的创作车轮嘎然而止,三十一岁,音乐创作的黄金时代才刚刚开始,如果他没有走,他的吉他里还会再流淌出比"海阔天空"更为出色的声音.也许这是命运的安排--"天才是脆弱的","海阔天空"成了绝笔,永远留在人们的记忆中了.
今天我 寒夜里看雪飘过
怀着冷却了的心窝漂远方
风雨里追赶
雾里分不清影踪
天空海阔你与我 可会变(谁没在变)
多少次 迎着冷眼与嘲笑
从没有放弃过心中的理想
一刹那恍惚
若有所失的感觉
不知不觉已变淡 心里爱(谁明白我)
原谅我这一生不羁放纵爱自由
也会怕有一天会跌倒
背弃了理想 谁人都可以
哪会怕有一天只你共我(OH!YEAH!)
仍然自由自我
永远高唱我歌
走遍千里
2.[大地]:曲:黄家驹 词:刘卓辉
这首作品的风格和其它BEYOND的作品有所不同,宽广而平和的感觉,传统的文化底蕴.听了无数遍终于明白了为什么要黄贯中演绎这首歌,他当时的声音是那种略显高亢的男声,和歌曲的配器风格浑然一体,象一望无际的苍茫大地.
在那些苍翠的路上
历遍了多少创伤
在那张苍老的面上 亦记载了风霜
秋风秋雨的度日 是青春少年时
迫不得已的话别 没说再见
回望昨日在异乡那门前
唏嘘的感慨一年年
但日落日出永没改变
这刻在望着父亲时
竟不知不觉的无言
让日落暮色渗满泪眼
在那些开放的路上
踏碎过多少理想 在那张高挂的面上
被引证了几多
千秋不变的日月 在相惜里共存
姑息分割的大地 划了界线
3.[光辉岁月]:词/曲:黄家驹
这首为曼德拉而作的歌曾经入选1990年香港十大金曲,真不知道在那种乱烘烘的颁奖晚会上唱这首歌是什么感觉.不能不说这首作品的成功之处在于它的节奏.细细品味它的歌词,"今天只有苍老的躯壳,迎接光辉岁月,问谁又能作到?",我惊叹家驹在词曲上都具有如此强的表现力.
钟声响起归家的讯号
在他生命里彷佛带点唏嘘
黑色肌肤给他的意义
是一生奉献肤色斗争中
年月把拥有变做失去
疲倦的双眼带着期望
今天只有残留的躯壳
迎接光辉岁月
风雨中抱紧自由
一生经过彷徨的挣扎
自信可改变未来
问谁又能做到
可否不分肤色的界限
愿这土地里 不分你我高低
缤纷色彩闪出的美丽
是因它没有 分开每种色彩
4.[喜欢你]:词/曲:黄家驹
最喜欢它的几句歌词:"满带理想的我曾经多冲动,埋怨与她相爱难有自由,愿你此刻可会知,是我衷心地说声:喜欢你".没有唧唧我我,没有喊出来的海誓山盟,只有那朴实无华的三个字"喜欢你",它深入我的心里,也打动了人们.朴实,是BEYOND的情歌最大的特点,流行乐坛充满如 此多的矫饰和做作的爱情,"朴实"如同一阵清风掠过,却又那么无力.
细雨带风湿透黄昏的街道
抹去双眼无辜的仰望
望问孤单的晚灯
是那伤感的记忆
再次返起心里无数的思恋
以往片刻欢笑永挂在面上
愿你此刻可会知
是我忠心地说声
**喜欢你 那双眼动人
笑声更迷人
愿再可 轻抚你
那可爱面容
挽手说梦话
像昨天 你共我
满带理想的我曾经多冲动
埋怨与她相爱难有自由
愿你此刻可会知
是我忠心地说声
每晚夜里自我独行
随处荡 多冰冷
以往为了自我挣扎
从不知她的痛苦
should be do ...shouldbe do...
5.[真的爱你](国语:[你知道我的迷惘])曲:黄家驹,词:小美
一首献给母亲的歌,BEYOND四人合唱,深入人心的经典作品.整首歌曲没有提到母亲两字,只是用直白的话唱出母亲的恩情.歌曲最后重复的和声十分出色,这里必须提到BEYOND由于发挥了每个人的演唱特点,他们的和声表现力很强.也许这是他们具有自己特色的原因之一吧.
无法可修饰的一对手
带出温暖永远在背后
纵使罗嗦始终关注
不懂珍惜太内疚
沉醉于音阶她不赞赏
母亲的爱却永未退让
决心冲开心中挣扎
亲恩总可报答
春风化雨暖透我的心
一生眷顾无言地送赠
** 是你多么温馨的目光
教我坚毅望着前路
叮嘱我跌倒不应放弃
没法解释怎可报尽亲恩
爱意宽大是无限
请准我说声真的爱你
仍记起温馨的一对手
始终给我照顾未变样
理想一天终于等到
分享光辉盼做到
6.[遥望]:词/曲:黄家驹
又一首BEYOND风格的情歌,它和"喜欢你"不同,它的特色在用配器营造的意境上,绝大多数人一听到它就被深深吸引住了,吉他的声音那么空旷悠远,家驹的声音仿佛从天际传来,使人如醉如痴.其实"遥望"只有几句歌词,旋律也不复杂,在BEYOND的众多作品中,它是比较特殊的一首.
仍是雨夜 凝望窗外 沉默的天际
问苍天可会知 心里的感觉
无尽爱意 藏在于心里
象冰封的眼光 失去了方向
让雨点轻轻的洒过
强把犹豫再掩盖
像碎星闪闪于天空 叫唤你
遥望盼望 能像轻风陪伴她飘去
让孤单的臂弯 一再抱紧你
回望往日 如雾似梦
无奈的轻叹 是她的欢笑声
风似轻吹过
每天多么多么的需要
永远与你抱拥着
忘掉世间一切痛苦悲哀
纵使分开分开多么远
也会听到你呼唤
期待我这 一生再会你
7.[长城]:词/曲:黄家驹
与"光辉岁月"一脉相承,对人类历史文化的思考.音乐风格象"岁月无声",雄浑有力.重摇滚风格非常突出.
遥远的东方 辽阔的边疆
还有远古的破墙
前世的沧桑 后世的风光
万里千山牢牢接壤
围着老去的国度
围着事实的真相
围着浩瀚的岁月
围着欲望与理想(叫嚷)
迷信的村庄 神秘的中央
还有昨天的战场
皇帝的新衣 热血的缨枪
谁却甘心流连塞上 朦着耳朵
那里那天不再听到在呼号的人(像呼号神)
WOO AH WOO AH AH AH
朦着眼睛
再见往昔景仰的那样一道疤痕
WOO AH WOO AH AH AH
留在地壳头上
无冕的身躯 忘我的思想
还有显赫的破墙
谁也冲不开 谁也抛不低
谁要一生流离浪荡
8.[农民]:词/曲:黄家驹
风格有些象"大地",因为传媒的原因这首佳作不为大众所知,可能因为<继续革命>这张专辑中好歌太多了.对仗工整,如诗如画的歌词,流畅的旋律,铿锵的带有些许进行曲节奏,"农民"让人们看到BEYOND进入90年代后的迅速成熟.
忘掉远方是否可有出路
忘掉夜里月黑风高
踏雪过山双脚难渐老
但靠两手一切达到
见面再喝到了薰醉
风雨中细说到心里
是与非过眼似烟吹
笑泪渗进了老井里
春与秋撒满了希冀
夏与冬看透了生死
世代辈辈永远紧记
忘掉世间万顷广阔土地
忘掉命里是否悲与喜
雾里看花一生走万里
但已了解不变道理
一天加一天
每分耕种 汗与血
粒粒皆辛酸
永不改变 人定胜天
9.[AMANI]:词/曲:黄家驹
歌唱社会问题的代表作,1991年BEYOND去非洲探访,为非洲儿童而唱.歌中使用了非洲肯尼亚 的语言,非常具有表现力.其实我觉得前半部分的歌词更为动人,"权力与拥有的斗争"伤痛是儿童.音乐转为高亢,感人至深. 这首歌更反映了 Beyond 对世界大同的憧憬。
AMANI NAKUPENDA NAKUPENDAWE WE
AMANI NAKUPENDA NAKUPENDAWE WE
他 主宰世上一切 他的歌唱出爱
他的真理遍布这地球
他 怎么一去不返 他可否会感到
烽烟掩盖天空与未来
无助与冰冷的眼睛
流泪看天际带悲愤
是控诉战争到最后伤痛是儿童
**我向世界呼叫
AMANI NAKUPENDA NAKUPENDAWE WE
TUNA TUKA WE WE (再次再次呼叫)
AMANI NAKUPENDA NAKUPENDAWE WE
天 天空可见飞鸟 惊慌展翅飞舞
穿梭天际只想觅自由
心 心中千亿颗爱心碎
今天一切厄困
仿佛真理消失在地球
权力与拥有的斗争
愚昧与偏见的争斗
若这里战争到最后怎会是和平
曲中:NAKUPENDA = 爱
NAKUPENDA WE WE = 我们爱你
TUNA TAKA WE WE = 我们需要你.....
10.[无悔这一生]:曲:黄家驹 词:卢国宏
这首歌是无线电视剧【香港云起时】的主题曲。也是Beyond从摇滚,情歌以外另开的新蹊径。将怨曲的元素放进流行歌曲内,正好表达出香港社会对前途迷茫的普遍感受,证明了家驹在音乐创作上的灵活性,多元化,能回应时代,也表现出Beyond在本地乐坛的独竖一帜。
"没有泪光,风里劲闯","无意与一切话别,无意再远走他乡",理想与现实的距离,人生的抉择感人至深.这首歌由黄家驹与黄贯中合唱,音乐上"海阔天空"和"大地"的意境各有一些,音乐旋律动人.
阳光历次消散别去
无理冲击我心绪
前景没法打算怎么
谁会偷生远方里
每次记忆哭笑
将心意再变改 一分一秒
无意对一切话别
无意却远走它方
没有泪光 风里尽闯
怀着心中新希望
能冲一次 多一次 不息自强
没有泪光 风里尽闯
重植根于小岛岸
如天可变 风可转 不息自强 这方向
无奈静静不舍心声
和我偏偏正呼应
前方或会一生奔波 无悔这一生经过
纵有冷风飘过
将心绪再痛悲 紧守不变
十年来BEYOND的佳作层出不穷,信手写到这里才发现十个位置实在难以取舍,只得再分类简单回顾一下其它决不逊色的作品,这是多么遗憾的事!
理想,人生:
[再见理想]:BEYOND早期的代表作,抒发彷徨于理想与现实中的苦闷,"海阔天空"仿佛它的续篇,却比它成熟得多.
[谁伴我闯荡]:自传体电影<莫欺少年穷>的主题歌,声音高亢舒缓,仿佛在诉说苦闷,非常动听.
[岁月无声]:铿锵有力,歌词的情绪却十分悲苦,在金钱主宰的社会中要做多少迫不得已的事?
[午夜怨曲]:"总有挫折打碎我的心,写下每句冰冷冷的诗",唱出苦闷的心声.
[灰色轨迹]:情绪灰暗如歌名,如泣如诉的感觉.
[逝去的日子]:"面对抉择背向了初衷,不知不觉世故已学懂",青年人面对现实心情的真实写照.
[不再犹豫]:一首流行摇滚,旋律流畅动听,适合学生听.
[无尽空虚]:后期的一首佳作,音乐比上述作品复杂,旋律动人.
[随意飘荡]:早期的一首作品,歌词和旋律都非常优美.
社会:
[旧日的足迹]:BEYOND的朋友从北京回港,从他的谈话中激发灵感所做,和"大地"一样,有苍凉感.
[交织千个心]:和AMANI一样宣传和平.歌的结尾有吉他模仿的枪炮声,很有意思.
[阿拉伯跳舞女郎]:阿拉伯风格的歌曲,BEYOND音乐上的尝试
[城市猎人]:被忽略的佳作,容入电子音乐风格,与其他BEYOND歌曲有很大区别.
爱情:
[情人]:BEYOND的情歌的经典,感人至深,让人心碎.收录于最后一张专辑<乐与怒>中综合了"喜欢你"和"遥望"的特点,却比它们更上一层楼.我自认为没有上述两者有代表性,才忍痛将它写在这里.
[曾是拥有]:旋律优美的动人情歌,被其他优秀歌曲的光芒所掩盖.
[无泪的遗憾]:和"曾是拥有"一样,旋律高亢一些,后半部分情绪激昂.
[早班火车]:节奏模仿火车的声音,词曲感人,后期的一首优秀情歌.
[为了你,为了我]:一首好听的歌曲.
[完全地拥有]:个人感觉比"为了你为了我"好听.
[完全地爱吧]:快节奏的情歌,音乐性强.
有多少好歌印在心里挥之不去,我们只有回忆,更好的歌再也不会从他的吉他中流出了.我们只有努力不去淡忘.今天我写下这些歌与朋友们分享,让更多的人知道他,喜欢他,尽管他已离开我们
--------------END
偶然又特殊的一天-6月1日儿童节,在MSN的RSS上面发现了如此精彩的文章—《十年BEYOND十年歌》,亲爱的作者,请允许我收藏,感谢你的辛苦劳动! -- Marco.chan
[39] ---下文为转载内容---
转载地址:http://msn.dzh.mop.com/static/msn/5476531.html
十年BEYOND十年歌
十年BEYOND十年歌,十几年的时光,BEYOND的音乐陪伴我度过少年和青年时代,直到步入社会, 动人的音乐鼓舞震撼着我和许许多多的人.没有家驹的日子里,我会一遍一遍的重温那二百余首佳作,我盼望着能和许许多多的朋友共享,尤其是年轻的朋友.近二百首作品无法一一回顾,不得已,采取一个大众化的办法,评论我心中的十大吧
1.[海阔天空]:词/曲:黄家驹
毋庸质疑的BEYOND的经典,家驹艺术生涯的颠峰之作.这首1993年初推出的作品情感如此深沉,无数人为之流泪。天尽头,苍凉的钢琴声缓缓而起,"今天我,长夜里看雪飘过...",是家驹一个人的声音,随着和声越来越多,感情越来越炽热,我感到自己对实现理想的渴望随着歌声 爆发出来,无保留的...,我相信无数的人和我一样加入到这个队伍中来,一起来唱"原谅我这一生不羁放纵爱自由,哪会怕有一天会跌倒...".[海阔天空]是家驹一生信念的写照,就在这一年 他的创作车轮嘎然而止,三十一岁,音乐创作的黄金时代才刚刚开始,如果他没有走,他的吉他里还会再流淌出比"海阔天空"更为出色的声音.也许这是命运的安排--"天才是脆弱的","海阔天空"成了绝笔,永远留在人们的记忆中了.
今天我 寒夜里看雪飘过
怀着冷却了的心窝漂远方
风雨里追赶
雾里分不清影踪
天空海阔你与我 可会变(谁没在变)
多少次 迎着冷眼与嘲笑
从没有放弃过心中的理想
一刹那恍惚
若有所失的感觉
不知不觉已变淡 心里爱(谁明白我)
原谅我这一生不羁放纵爱自由
也会怕有一天会跌倒
背弃了理想 谁人都可以
哪会怕有一天只你共我(OH!YEAH!)
仍然自由自我
永远高唱我歌
走遍千里
2.[大地]:曲:黄家驹 词:刘卓辉
这首作品的风格和其它BEYOND的作品有所不同,宽广而平和的感觉,传统的文化底蕴.听了无数遍终于明白了为什么要黄贯中演绎这首歌,他当时的声音是那种略显高亢的男声,和歌曲的配器风格浑然一体,象一望无际的苍茫大地.
在那些苍翠的路上
历遍了多少创伤
在那张苍老的面上 亦记载了风霜
秋风秋雨的度日 是青春少年时
迫不得已的话别 没说再见
回望昨日在异乡那门前
唏嘘的感慨一年年
但日落日出永没改变
这刻在望着父亲时
竟不知不觉的无言
让日落暮色渗满泪眼
在那些开放的路上
踏碎过多少理想 在那张高挂的面上
被引证了几多
千秋不变的日月 在相惜里共存
姑息分割的大地 划了界线
3.[光辉岁月]:词/曲:黄家驹
这首为曼德拉而作的歌曾经入选1990年香港十大金曲,真不知道在那种乱烘烘的颁奖晚会上唱这首歌是什么感觉.不能不说这首作品的成功之处在于它的节奏.细细品味它的歌词,"今天只有苍老的躯壳,迎接光辉岁月,问谁又能作到?",我惊叹家驹在词曲上都具有如此强的表现力.
钟声响起归家的讯号
在他生命里彷佛带点唏嘘
黑色肌肤给他的意义
是一生奉献肤色斗争中
年月把拥有变做失去
疲倦的双眼带着期望
今天只有残留的躯壳
迎接光辉岁月
风雨中抱紧自由
一生经过彷徨的挣扎
自信可改变未来
问谁又能做到
可否不分肤色的界限
愿这土地里 不分你我高低
缤纷色彩闪出的美丽
是因它没有 分开每种色彩
4.[喜欢你]:词/曲:黄家驹
最喜欢它的几句歌词:"满带理想的我曾经多冲动,埋怨与她相爱难有自由,愿你此刻可会知,是我衷心地说声:喜欢你".没有唧唧我我,没有喊出来的海誓山盟,只有那朴实无华的三个字"喜欢你",它深入我的心里,也打动了人们.朴实,是BEYOND的情歌最大的特点,流行乐坛充满如 此多的矫饰和做作的爱情,"朴实"如同一阵清风掠过,却又那么无力.
细雨带风湿透黄昏的街道
抹去双眼无辜的仰望
望问孤单的晚灯
是那伤感的记忆
再次返起心里无数的思恋
以往片刻欢笑永挂在面上
愿你此刻可会知
是我忠心地说声
**喜欢你 那双眼动人
笑声更迷人
愿再可 轻抚你
那可爱面容
挽手说梦话
像昨天 你共我
满带理想的我曾经多冲动
埋怨与她相爱难有自由
愿你此刻可会知
是我忠心地说声
每晚夜里自我独行
随处荡 多冰冷
以往为了自我挣扎
从不知她的痛苦
should be do ...shouldbe do...
5.[真的爱你](国语:[你知道我的迷惘])曲:黄家驹,词:小美
一首献给母亲的歌,BEYOND四人合唱,深入人心的经典作品.整首歌曲没有提到母亲两字,只是用直白的话唱出母亲的恩情.歌曲最后重复的和声十分出色,这里必须提到BEYOND由于发挥了每个人的演唱特点,他们的和声表现力很强.也许这是他们具有自己特色的原因之一吧.
无法可修饰的一对手
带出温暖永远在背后
纵使罗嗦始终关注
不懂珍惜太内疚
沉醉于音阶她不赞赏
母亲的爱却永未退让
决心冲开心中挣扎
亲恩总可报答
春风化雨暖透我的心
一生眷顾无言地送赠
** 是你多么温馨的目光
教我坚毅望着前路
叮嘱我跌倒不应放弃
没法解释怎可报尽亲恩
爱意宽大是无限
请准我说声真的爱你
仍记起温馨的一对手
始终给我照顾未变样
理想一天终于等到
分享光辉盼做到
6.[遥望]:词/曲:黄家驹
又一首BEYOND风格的情歌,它和"喜欢你"不同,它的特色在用配器营造的意境上,绝大多数人一听到它就被深深吸引住了,吉他的声音那么空旷悠远,家驹的声音仿佛从天际传来,使人如醉如痴.其实"遥望"只有几句歌词,旋律也不复杂,在BEYOND的众多作品中,它是比较特殊的一首.
仍是雨夜 凝望窗外 沉默的天际
问苍天可会知 心里的感觉
无尽爱意 藏在于心里
象冰封的眼光 失去了方向
让雨点轻轻的洒过
强把犹豫再掩盖
像碎星闪闪于天空 叫唤你
遥望盼望 能像轻风陪伴她飘去
让孤单的臂弯 一再抱紧你
回望往日 如雾似梦
无奈的轻叹 是她的欢笑声
风似轻吹过
每天多么多么的需要
永远与你抱拥着
忘掉世间一切痛苦悲哀
纵使分开分开多么远
也会听到你呼唤
期待我这 一生再会你
7.[长城]:词/曲:黄家驹
与"光辉岁月"一脉相承,对人类历史文化的思考.音乐风格象"岁月无声",雄浑有力.重摇滚风格非常突出.
遥远的东方 辽阔的边疆
还有远古的破墙
前世的沧桑 后世的风光
万里千山牢牢接壤
围着老去的国度
围着事实的真相
围着浩瀚的岁月
围着欲望与理想(叫嚷)
迷信的村庄 神秘的中央
还有昨天的战场
皇帝的新衣 热血的缨枪
谁却甘心流连塞上 朦着耳朵
那里那天不再听到在呼号的人(像呼号神)
WOO AH WOO AH AH AH
朦着眼睛
再见往昔景仰的那样一道疤痕
WOO AH WOO AH AH AH
留在地壳头上
无冕的身躯 忘我的思想
还有显赫的破墙
谁也冲不开 谁也抛不低
谁要一生流离浪荡
8.[农民]:词/曲:黄家驹
风格有些象"大地",因为传媒的原因这首佳作不为大众所知,可能因为<继续革命>这张专辑中好歌太多了.对仗工整,如诗如画的歌词,流畅的旋律,铿锵的带有些许进行曲节奏,"农民"让人们看到BEYOND进入90年代后的迅速成熟.
忘掉远方是否可有出路
忘掉夜里月黑风高
踏雪过山双脚难渐老
但靠两手一切达到
见面再喝到了薰醉
风雨中细说到心里
是与非过眼似烟吹
笑泪渗进了老井里
春与秋撒满了希冀
夏与冬看透了生死
世代辈辈永远紧记
忘掉世间万顷广阔土地
忘掉命里是否悲与喜
雾里看花一生走万里
但已了解不变道理
一天加一天
每分耕种 汗与血
粒粒皆辛酸
永不改变 人定胜天
9.[AMANI]:词/曲:黄家驹
歌唱社会问题的代表作,1991年BEYOND去非洲探访,为非洲儿童而唱.歌中使用了非洲肯尼亚 的语言,非常具有表现力.其实我觉得前半部分的歌词更为动人,"权力与拥有的斗争"伤痛是儿童.音乐转为高亢,感人至深. 这首歌更反映了 Beyond 对世界大同的憧憬。
AMANI NAKUPENDA NAKUPENDAWE WE
AMANI NAKUPENDA NAKUPENDAWE WE
他 主宰世上一切 他的歌唱出爱
他的真理遍布这地球
他 怎么一去不返 他可否会感到
烽烟掩盖天空与未来
无助与冰冷的眼睛
流泪看天际带悲愤
是控诉战争到最后伤痛是儿童
**我向世界呼叫
AMANI NAKUPENDA NAKUPENDAWE WE
TUNA TUKA WE WE (再次再次呼叫)
AMANI NAKUPENDA NAKUPENDAWE WE
天 天空可见飞鸟 惊慌展翅飞舞
穿梭天际只想觅自由
心 心中千亿颗爱心碎
今天一切厄困
仿佛真理消失在地球
权力与拥有的斗争
愚昧与偏见的争斗
若这里战争到最后怎会是和平
曲中:NAKUPENDA = 爱
NAKUPENDA WE WE = 我们爱你
TUNA TAKA WE WE = 我们需要你.....
10.[无悔这一生]:曲:黄家驹 词:卢国宏
这首歌是无线电视剧【香港云起时】的主题曲。也是Beyond从摇滚,情歌以外另开的新蹊径。将怨曲的元素放进流行歌曲内,正好表达出香港社会对前途迷茫的普遍感受,证明了家驹在音乐创作上的灵活性,多元化,能回应时代,也表现出Beyond在本地乐坛的独竖一帜。
"没有泪光,风里劲闯","无意与一切话别,无意再远走他乡",理想与现实的距离,人生的抉择感人至深.这首歌由黄家驹与黄贯中合唱,音乐上"海阔天空"和"大地"的意境各有一些,音乐旋律动人.
阳光历次消散别去
无理冲击我心绪
前景没法打算怎么
谁会偷生远方里
每次记忆哭笑
将心意再变改 一分一秒
无意对一切话别
无意却远走它方
没有泪光 风里尽闯
怀着心中新希望
能冲一次 多一次 不息自强
没有泪光 风里尽闯
重植根于小岛岸
如天可变 风可转 不息自强 这方向
无奈静静不舍心声
和我偏偏正呼应
前方或会一生奔波 无悔这一生经过
纵有冷风飘过
将心绪再痛悲 紧守不变
十年来BEYOND的佳作层出不穷,信手写到这里才发现十个位置实在难以取舍,只得再分类简单回顾一下其它决不逊色的作品,这是多么遗憾的事!
理想,人生:
[再见理想]:BEYOND早期的代表作,抒发彷徨于理想与现实中的苦闷,"海阔天空"仿佛它的续篇,却比它成熟得多.
[谁伴我闯荡]:自传体电影<莫欺少年穷>的主题歌,声音高亢舒缓,仿佛在诉说苦闷,非常动听.
[岁月无声]:铿锵有力,歌词的情绪却十分悲苦,在金钱主宰的社会中要做多少迫不得已的事?
[午夜怨曲]:"总有挫折打碎我的心,写下每句冰冷冷的诗",唱出苦闷的心声.
[灰色轨迹]:情绪灰暗如歌名,如泣如诉的感觉.
[逝去的日子]:"面对抉择背向了初衷,不知不觉世故已学懂",青年人面对现实心情的真实写照.
[不再犹豫]:一首流行摇滚,旋律流畅动听,适合学生听.
[无尽空虚]:后期的一首佳作,音乐比上述作品复杂,旋律动人.
[随意飘荡]:早期的一首作品,歌词和旋律都非常优美.
社会:
[旧日的足迹]:BEYOND的朋友从北京回港,从他的谈话中激发灵感所做,和"大地"一样,有苍凉感.
[交织千个心]:和AMANI一样宣传和平.歌的结尾有吉他模仿的枪炮声,很有意思.
[阿拉伯跳舞女郎]:阿拉伯风格的歌曲,BEYOND音乐上的尝试
[城市猎人]:被忽略的佳作,容入电子音乐风格,与其他BEYOND歌曲有很大区别.
爱情:
[情人]:BEYOND的情歌的经典,感人至深,让人心碎.收录于最后一张专辑<乐与怒>中综合了"喜欢你"和"遥望"的特点,却比它们更上一层楼.我自认为没有上述两者有代表性,才忍痛将它写在这里.
[曾是拥有]:旋律优美的动人情歌,被其他优秀歌曲的光芒所掩盖.
[无泪的遗憾]:和"曾是拥有"一样,旋律高亢一些,后半部分情绪激昂.
[早班火车]:节奏模仿火车的声音,词曲感人,后期的一首优秀情歌.
[为了你,为了我]:一首好听的歌曲.
[完全地拥有]:个人感觉比"为了你为了我"好听.
[完全地爱吧]:快节奏的情歌,音乐性强.
有多少好歌印在心里挥之不去,我们只有回忆,更好的歌再也不会从他的吉他中流出了.我们只有努力不去淡忘.今天我写下这些歌与朋友们分享,让更多的人知道他,喜欢他,尽管他已离开我们
--------------END
c语言struct的一种初始化方法
在linux的内核代码中几乎都是用这种方法的
#include <stdio.h>
typedef struct str
{
int a;
int b;
char name[20];
}Str;
int main()
{
Str s={a:1,b:2,name:"xiangdong"};//注意这里的冒号
printf("a=%d\nb=%d\nname=%s\n",s.a,s.b,s.name);
}
原文是在linux内核2.4.18的linux/fs/ext2/super.c文件里的,如下:
static struct super_operations ext2_sops = {
read_inode: ext2_read_inode,
write_inode: ext2_write_inode,
put_inode: ext2_put_inode,
delete_inode:ext2_delete_inode,
put_super: ext2_put_super,
write_super: ext2_write_super,
statfs: ext2_statfs,
remount_fs: ext2_remount,
};
在linux的内核代码中几乎都是用这种方法的
#include <stdio.h>
typedef struct str
{
int a;
int b;
char name[20];
}Str;
int main()
{
Str s={a:1,b:2,name:"xiangdong"};//注意这里的冒号
printf("a=%d\nb=%d\nname=%s\n",s.a,s.b,s.name);
}
原文是在linux内核2.4.18的linux/fs/ext2/super.c文件里的,如下:
static struct super_operations ext2_sops = {
read_inode: ext2_read_inode,
write_inode: ext2_write_inode,
put_inode: ext2_put_inode,
delete_inode:ext2_delete_inode,
put_super: ext2_put_super,
write_super: ext2_write_super,
statfs: ext2_statfs,
remount_fs: ext2_remount,
};
随着现代社会信息化进程的加快,嵌入式系统被广泛的地应用于军事、家用、工业、商业、办公、医疗等社会各个方面,表现出很强的投资价值。从国际范围来看,作为数字化电子信息产品核心的嵌入式系统目前其硬件和软件开发工具市场已经突破2000亿美元,嵌入式系统带来的全球工业年产值更是达到了一万亿美元,随着全球经济的持续增长以及信息化的加速发展,嵌入式系统市场必将进一步增长。
学习步骤如下:
1、Linux 基础
安装Linux操作系统
Linux文件系统
Linux常用命令
Linux启动过程详解
熟悉Linux服务能够独立安装Linux操作系统
能够熟练使用Linux系统的基本命令
认识Linux系统的常用服务安装Linux操作系统
Linux基本命令实践
设置Linux环境变量
定制Linux的服务 Shell 编程基础使用vi编辑文件
使用Emacs编辑文件
使用其他编辑器
2、Shell 编程基础
Shell简介
认识后台程序
Bash编程熟悉Linux系统下的编辑环境
熟悉Linux下的各种Shell
熟练进行shell编程熟悉vi基本操作
熟悉Emacs的基本操作
比较不同shell的区别
编写一个测试服务器是否连通的shell脚本程序
编写一个查看进程是否存在的shell脚本程序
编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述
Gcc使用方法
Gdb调试技术
Autoconf
Automake
Makefile
代码优化 熟悉Linux系统下的开发环境
熟悉Gcc编译器
熟悉Makefile规则编写Hello,World程序
使用 make命令编译程序
编写带有一个循环的程序
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述
交叉编译
配置TFTP服务
配置NFS服务
下载Bootloader和内核
嵌入式Linux应用软件开发流程
熟悉嵌入式系统概念以及开发流程
建立嵌入式系统开发环境制作cross_gcc工具链
编译并下载U-boot
编译并下载Linux内核
编译并下载Linux应用程序
嵌入式系统移植
Linux内核代码
平台相关代码分析
ARM平台介绍
平台移植的关键技术
移植Linux内核到 ARM平台 了解移植的概念
能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念
嵌入式Linux应用软件开发流程
Linux系统的文件和设备
与文件相关的系统调用
配置超级终端和MiniCOM 能够熟悉进行串口通信
熟悉文件I/O 编写串口通信程序
编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述
嵌入式系统的进程特点
进程操作
守护进程
相关的系统调用了解Linux系统中进程的概念
能够编写多进程程序编写多进程程序
编写一个守护进程程序
sleep系统调用任务管理、同步与通信 Linux任务概述
任务调度
管道
信号
共享内存
任务管理 API 了解Linux系统任务管理机制
熟悉进程间通信的几种方式
熟悉嵌入式Linux中的任务间同步与通信
编写一个简单的管道程序实现文件传输
编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识
多线程编程方法
线程应用中的同步问题了解线程的概念
能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识
嵌入式Linux中TCP/IP网络结构
socket 编程
常用 API函数
分析Ping命令的实现
基本UDP套接口编程
许可证管理
PPP协议
GPRS 了解嵌入式Linux网络体系结构
能够进行嵌入式Linux环境下的socket 编程
熟悉UDP协议、PPP协议
熟悉GPRS 使用socket 编写代理服务器
使用socket 编写路由器
编写许可证服务器
指出TCP和UDP的优缺点
编写一个web服务器
编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础
嵌入式系统GUI类型
编译QT
进行QT开发熟悉嵌入式系统常用的GUI
能够进行QT编程使用QT编写“Hello,World”程序
调试一个加入信号/槽的实例
通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识
Linux系统的模块
字符设备驱动分析
fs_operation结构
加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构
能够编写字符设备驱动程序编写Skull驱动
编写键盘驱动
编写I/O驱动
分析一个看门狗驱动程序
对比Linux2.6内核与2.4内核中字符设备驱动的不同
Linux 块设备驱动程序块设备驱动程序工作原理
典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构
能够编写简单的块设备驱动程序比较字符设备与块设备的异同
编写MMC卡驱动程序
分析一个文件系统
对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统
文件系统的建立
ramfs内存文件系统
proc文件系统
devfs 文件系统
MTD技术简介
MTD块设备初始化
MTD块设备的读写操作了解Linux系统的文件系统
了解嵌入式Linux的文件系统
了解MTD技术
能够编写简单的文件系统为 ARM9开发板添加 MTD支持
移植JFFS2文件系统
通过proc文件系统修改操作系统参数
分析romfs 文件系统源代码
创建一个cramfs 文件系统
学习步骤如下:
1、Linux 基础
安装Linux操作系统
Linux文件系统
Linux常用命令
Linux启动过程详解
熟悉Linux服务能够独立安装Linux操作系统
能够熟练使用Linux系统的基本命令
认识Linux系统的常用服务安装Linux操作系统
Linux基本命令实践
设置Linux环境变量
定制Linux的服务 Shell 编程基础使用vi编辑文件
使用Emacs编辑文件
使用其他编辑器
2、Shell 编程基础
Shell简介
认识后台程序
Bash编程熟悉Linux系统下的编辑环境
熟悉Linux下的各种Shell
熟练进行shell编程熟悉vi基本操作
熟悉Emacs的基本操作
比较不同shell的区别
编写一个测试服务器是否连通的shell脚本程序
编写一个查看进程是否存在的shell脚本程序
编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述
Gcc使用方法
Gdb调试技术
Autoconf
Automake
Makefile
代码优化 熟悉Linux系统下的开发环境
熟悉Gcc编译器
熟悉Makefile规则编写Hello,World程序
使用 make命令编译程序
编写带有一个循环的程序
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述
交叉编译
配置TFTP服务
配置NFS服务
下载Bootloader和内核
嵌入式Linux应用软件开发流程
熟悉嵌入式系统概念以及开发流程
建立嵌入式系统开发环境制作cross_gcc工具链
编译并下载U-boot
编译并下载Linux内核
编译并下载Linux应用程序
嵌入式系统移植
Linux内核代码
平台相关代码分析
ARM平台介绍
平台移植的关键技术
移植Linux内核到 ARM平台 了解移植的概念
能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念
嵌入式Linux应用软件开发流程
Linux系统的文件和设备
与文件相关的系统调用
配置超级终端和MiniCOM 能够熟悉进行串口通信
熟悉文件I/O 编写串口通信程序
编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述
嵌入式系统的进程特点
进程操作
守护进程
相关的系统调用了解Linux系统中进程的概念
能够编写多进程程序编写多进程程序
编写一个守护进程程序
sleep系统调用任务管理、同步与通信 Linux任务概述
任务调度
管道
信号
共享内存
任务管理 API 了解Linux系统任务管理机制
熟悉进程间通信的几种方式
熟悉嵌入式Linux中的任务间同步与通信
编写一个简单的管道程序实现文件传输
编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识
多线程编程方法
线程应用中的同步问题了解线程的概念
能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识
嵌入式Linux中TCP/IP网络结构
socket 编程
常用 API函数
分析Ping命令的实现
基本UDP套接口编程
许可证管理
PPP协议
GPRS 了解嵌入式Linux网络体系结构
能够进行嵌入式Linux环境下的socket 编程
熟悉UDP协议、PPP协议
熟悉GPRS 使用socket 编写代理服务器
使用socket 编写路由器
编写许可证服务器
指出TCP和UDP的优缺点
编写一个web服务器
编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础
嵌入式系统GUI类型
编译QT
进行QT开发熟悉嵌入式系统常用的GUI
能够进行QT编程使用QT编写“Hello,World”程序
调试一个加入信号/槽的实例
通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识
Linux系统的模块
字符设备驱动分析
fs_operation结构
加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构
能够编写字符设备驱动程序编写Skull驱动
编写键盘驱动
编写I/O驱动
分析一个看门狗驱动程序
对比Linux2.6内核与2.4内核中字符设备驱动的不同
Linux 块设备驱动程序块设备驱动程序工作原理
典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构
能够编写简单的块设备驱动程序比较字符设备与块设备的异同
编写MMC卡驱动程序
分析一个文件系统
对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统
文件系统的建立
ramfs内存文件系统
proc文件系统
devfs 文件系统
MTD技术简介
MTD块设备初始化
MTD块设备的读写操作了解Linux系统的文件系统
了解嵌入式Linux的文件系统
了解MTD技术
能够编写简单的文件系统为 ARM9开发板添加 MTD支持
移植JFFS2文件系统
通过proc文件系统修改操作系统参数
分析romfs 文件系统源代码
创建一个cramfs 文件系统
魅族M8 | 苹果iPhone | |
网络制式 | GSM/TD-SCDMA | GSM 850/900/1800/1900,EDGE |
CPU | ARM11+video Codec(MPEG4/H.263/H.264) | Intel XScale处理器 |
操作系统 | WinCE 6.0 | Mac OS X |
外型尺寸 | 105×57×11.5mm | 115×61×11.6mm |
显示屏 | VGA+720×480像素3.3英寸触摸屏 | 320×480像素3.5英寸触摸屏 |
摄像头 | 300万+30万像素双摄像头 | 200万像素 |
接口 | 蓝牙,30PIN扩展接口(TV OUT,LINE IN/OUT) | 蓝牙2.0,802.11b/g Wi-Fi等 |
最近,想买手机,听说国外的还不错,于是差了一下他们的cpu,尽管出现过高频低能的笑话,但我自己觉得频率高还是好的,呵呵,为此,我就对M8和iphone做一个对比:
Cpu:
Xscanle处理器频率在我估计:CPU处理速度在高频的情况下可以达到650 MHz,功耗较低水平,但XScale源于ARM内核。有人说iPhone处理器频率高达806MHz!至少使用3颗ARM芯片,这种说法好像不太靠谱喔,误导观众,纯属炒作(ARM控股公司CEO Warren East又抛出了新的说法,他认为iPhone的触摸屏幕下面至少有三颗ARM处理器在工作),苹果iPhone主处理器将是ARM架构下Marvell公司的PXA320。该处理器由Intel开发,(但有人说苹果用的就是三星的S3C6400处理器. )其真实型号是S5L8900B01,但我认为还是S3C6400,(基于ARM1176JZF-S内核)懂了吧,否则3D效果不会那么好,在功耗上才有如此低的表现水平。
ARM11:
M8将采用ARM11,533Mhz的CPU。大家一致认为这款CPU应该是三星的S3C6400,根据目前公布的配置,M8将采用ARM11,533Mhz的CPU。大家一致认为这款CPU应该是三星的S3C6400,。
语出惊人:
根据目前公布的配置,M8将采用ARM11,533Mhz的CPU。大家一致认为这款CPU应该是三星的S3C6400。
得出结论:M8的cpu和苹果一样。。。。。:-)
国人抄袭本领:
够牛,连cpu都給抄袭了,统一用三星,苹果说我是用的Intel Xscale处理器,国人说我用的就是ARM11,你苹果还是基于我ARM1176内核构造的呢,难道就比你苹果差很多了吗?佩服。。。。佩服。
但不得不佩服魅族的M8研发人员还是很牛B的。。
此文章代表个人观点。。。。谢谢,有漏笔之出还请尽量!
用优化精灵测试到内存是172MB。
今天偶然探到WIN CE的底层硬件测试了下 的确内存是170M多。远远达不到256M
CPU的确是三星的6410的
首先要对坚决立志做处女到结婚的人表示钦佩,为有处女情结的男人深表同情并悲哀。为这个社会还有这种女同胞倍感可贵,但我却认为一般情况下一个女人做处女身到结婚,存在了巨大的风险。
幸福和是处女与否无关
这个现象分析起来不好分析,但可以反过来看这个问题。那就是婚姻幸福的人当中,这个做妻子的以前是否热烈地恋爱过没有关系,与和这个女人的观念和开放程度没关系。从某种角度来看,很多开放和在社会里混得走,活动能力十分强劲的人似乎下半辈子都过得很幸福,甚至不少嫁给了声名显赫的男人过着耀眼的生活。
相反地,很多传统的女人结婚后,过着传统软弱的生活,并不能保证幸福的婚姻和未来。因为男人的变化是不可确定的,离婚的人当中,传统的人也不少,甚至随着社会发展那种爹妈负责相亲的人离婚的会越来越多,这些情况下处女与否已经不再重要。
那么,单纯以为是处女了就幸福的女人是痴人做梦;而不是处女的女同胞来说,这个也不是决定因素,因为一个人是要看综合的很多方面。但为那些只为了自己的信仰,而不是为了男人看法保持处女身的女性表示敬仰。
做处女要付出很多代价
我有一个朋友,读书时一个女生宿舍的同学多次笑取她太传统了,在大学的环境里这种取笑有点讽刺的意思,简单说就是这个女人太落后了。这种优点在特定环境里反而成了缺点,一直感受到各方压力。如今的社会里能进行着柏拉图式精神恋爱的是凤毛麟角,非常之少。我这个朋友的经历一直让人觉得付出的代价太多,开始谈了好几个男朋友,结果都和我说,她没有哪个男朋友保持到三个月以上。很简单的道理,女人呢觉得你爱我,你就不能伤害我;男人呢觉得你爱我,你就影响相信我,愿意和做任何事情。而很多情况下,性的确有足于让大家更默契和更有感情,也能化解不少矛盾。男人单独和女朋友一起相处到一定程度都是情不自禁希望发生性关系,并非不对。
这样的结果就是,自尊心强的男人经常提出要求后被拒绝,自尊心受到很多伤害,自然对这个女孩子有很多抵触。到后来的失望、绝望。那么坚持做处女的人就会在这个过程里因为这个观念放弃一个又一个男人,男人也一个又一个离去。也许有一天,不排除这样的情况,当这个一直做处女的女孩子结婚后觉得很不幸福,或者觉得男人很不如别人,很怀念当初和其谈过恋爱的人,可惜已经错过。
除非是遇到其他一些特殊情况——要么这个女人是否优秀,在某些领域十分出众,最好是明星;要么遇到一个男人十分欣赏这个女人的很多方面,包括追求、信仰甚至地位等等,并在很多方面有一致的观点。否则怎么坚持下去,是个巨大的挑战。
一直当处女的人大多缺乏魅力
大多数情况下,很多一直做处女的女孩子并没有真正体味过爱情的滋味,没有经历过热烈的爱情的感受。导致其实这样的女孩子其实很多不懂爱情,甚至不懂得怎么去处理爱情上的事情。这样的女人在男人眼中缺乏魅力,经常很传统羞涩十分,没有浪漫的特征。在性技巧和营造一个征服男人的性氛围方面,就更不用提了。一方面男人不喜欢自己的女人过去和其他男人过多的关系,但另一个方面却是男人更希望自己的女人拥有十分优秀的性技巧。
如果没有一个经营爱情的能力和享受爱情的能力,那么这个女人即使到了婚嫁年龄准备找个男人嫁了,但却因为能力不足不断错过自己心仪的对象。这个时候女人在爱情上屡尝挫折一旦失去了信心,这种情况就会恶性循环。到后来就是保住了身子嫁了一个不中意的男人。
如果最后结婚的人都不是自己最中意的,那么为了这个男人一直做处女十分有这个必要,有待大家讨论。奉劝要做处女的人一定要多学习点东西,对爱情掌控自如。
男人大多没有处女情结,不值得刻意
这里想给大家说个故事,这个故事就是“坐怀不乱”这个典故。现代有社会学家分析,发生这个事情可能有三种情况,一是这个男人身体有问题;二是这个男人性取向有问题;三就是这个女人实在太丑。甚至有后来者分析说,晚上单独和一个女人相处一室,对这个女人做了事情就是犯罪,但要是连想做的念头都没,那就是更大的犯罪。说到底,七情六欲人之常情,大家都不要看得过重。
大多数男人是没有处女情结的。男人喜欢处女只是为了显示自己的占有欲,如果单纯从快乐的角度来看,男人并不喜欢和处女发生性,会觉得很没趣。现代社会里大多数男人都不是很在意自己的老婆是否是处女,因为自己大多也不是处男,除非这个老婆没有其他任何优点而言。男人只是不喜欢知道自己的女人属于过别人。
但要给女同胞们一个忠告:千万别让自己老公过多知道自己过去和前男友的亲密关系,更不要让其联想到过去和其他男人发生性的细节,否则男人都会很难受。
最后表达一个观点:鄙视自己不是处男却要找处女结婚的男人,但强烈鄙视修补处女膜去结婚的女人,支持这种女人一旦发现男人们将其立即开除。
幸福和是处女与否无关
这个现象分析起来不好分析,但可以反过来看这个问题。那就是婚姻幸福的人当中,这个做妻子的以前是否热烈地恋爱过没有关系,与和这个女人的观念和开放程度没关系。从某种角度来看,很多开放和在社会里混得走,活动能力十分强劲的人似乎下半辈子都过得很幸福,甚至不少嫁给了声名显赫的男人过着耀眼的生活。
相反地,很多传统的女人结婚后,过着传统软弱的生活,并不能保证幸福的婚姻和未来。因为男人的变化是不可确定的,离婚的人当中,传统的人也不少,甚至随着社会发展那种爹妈负责相亲的人离婚的会越来越多,这些情况下处女与否已经不再重要。
那么,单纯以为是处女了就幸福的女人是痴人做梦;而不是处女的女同胞来说,这个也不是决定因素,因为一个人是要看综合的很多方面。但为那些只为了自己的信仰,而不是为了男人看法保持处女身的女性表示敬仰。
做处女要付出很多代价
我有一个朋友,读书时一个女生宿舍的同学多次笑取她太传统了,在大学的环境里这种取笑有点讽刺的意思,简单说就是这个女人太落后了。这种优点在特定环境里反而成了缺点,一直感受到各方压力。如今的社会里能进行着柏拉图式精神恋爱的是凤毛麟角,非常之少。我这个朋友的经历一直让人觉得付出的代价太多,开始谈了好几个男朋友,结果都和我说,她没有哪个男朋友保持到三个月以上。很简单的道理,女人呢觉得你爱我,你就不能伤害我;男人呢觉得你爱我,你就影响相信我,愿意和做任何事情。而很多情况下,性的确有足于让大家更默契和更有感情,也能化解不少矛盾。男人单独和女朋友一起相处到一定程度都是情不自禁希望发生性关系,并非不对。
这样的结果就是,自尊心强的男人经常提出要求后被拒绝,自尊心受到很多伤害,自然对这个女孩子有很多抵触。到后来的失望、绝望。那么坚持做处女的人就会在这个过程里因为这个观念放弃一个又一个男人,男人也一个又一个离去。也许有一天,不排除这样的情况,当这个一直做处女的女孩子结婚后觉得很不幸福,或者觉得男人很不如别人,很怀念当初和其谈过恋爱的人,可惜已经错过。
除非是遇到其他一些特殊情况——要么这个女人是否优秀,在某些领域十分出众,最好是明星;要么遇到一个男人十分欣赏这个女人的很多方面,包括追求、信仰甚至地位等等,并在很多方面有一致的观点。否则怎么坚持下去,是个巨大的挑战。
一直当处女的人大多缺乏魅力
大多数情况下,很多一直做处女的女孩子并没有真正体味过爱情的滋味,没有经历过热烈的爱情的感受。导致其实这样的女孩子其实很多不懂爱情,甚至不懂得怎么去处理爱情上的事情。这样的女人在男人眼中缺乏魅力,经常很传统羞涩十分,没有浪漫的特征。在性技巧和营造一个征服男人的性氛围方面,就更不用提了。一方面男人不喜欢自己的女人过去和其他男人过多的关系,但另一个方面却是男人更希望自己的女人拥有十分优秀的性技巧。
如果没有一个经营爱情的能力和享受爱情的能力,那么这个女人即使到了婚嫁年龄准备找个男人嫁了,但却因为能力不足不断错过自己心仪的对象。这个时候女人在爱情上屡尝挫折一旦失去了信心,这种情况就会恶性循环。到后来就是保住了身子嫁了一个不中意的男人。
如果最后结婚的人都不是自己最中意的,那么为了这个男人一直做处女十分有这个必要,有待大家讨论。奉劝要做处女的人一定要多学习点东西,对爱情掌控自如。
男人大多没有处女情结,不值得刻意
这里想给大家说个故事,这个故事就是“坐怀不乱”这个典故。现代有社会学家分析,发生这个事情可能有三种情况,一是这个男人身体有问题;二是这个男人性取向有问题;三就是这个女人实在太丑。甚至有后来者分析说,晚上单独和一个女人相处一室,对这个女人做了事情就是犯罪,但要是连想做的念头都没,那就是更大的犯罪。说到底,七情六欲人之常情,大家都不要看得过重。
大多数男人是没有处女情结的。男人喜欢处女只是为了显示自己的占有欲,如果单纯从快乐的角度来看,男人并不喜欢和处女发生性,会觉得很没趣。现代社会里大多数男人都不是很在意自己的老婆是否是处女,因为自己大多也不是处男,除非这个老婆没有其他任何优点而言。男人只是不喜欢知道自己的女人属于过别人。
但要给女同胞们一个忠告:千万别让自己老公过多知道自己过去和前男友的亲密关系,更不要让其联想到过去和其他男人发生性的细节,否则男人都会很难受。
最后表达一个观点:鄙视自己不是处男却要找处女结婚的男人,但强烈鄙视修补处女膜去结婚的女人,支持这种女人一旦发现男人们将其立即开除。
早起者并不一定收获最多,但成功者一定是方向对,善管理风险的人。不管是寿国梁、曹军这样的无奈者,还是张树新、王峻涛这样的迷失者,其先发优势都已消失殆净。从“先驱”到“先烈”的转变,折射出的是市场的易
变性和持续成功的“无规律性”。这种“无规律性”既表现在你所需要坚持的东西上,也表现在日常的经营管理中。
8848和王峻涛的“失败”,曾经令绝大部分的专业人士对B2B产生了动摇;张树新、张征宇也并不是不知道迅速扩张的风险;邓国顺当然更是不会想到,专利保护竟然没有能够使自己快速成长。这些遗憾其实何止发生在这七个遗憾者的身上,绝大部分的行业跟随者甚至那些成功者,也多多少少存在着的问题。但对比少数成功者的成功原因,可以得出这样一个结论:那些遗憾者真正遗憾的是,看到了机会,也抢先跑出去了,却没找对方向。
如果再去细究“没找对方向”的原因,那么基本上可以认为,与“智造中国”中的那10个代表人物相比,“遗憾人物”的最大缺陷就是资源利用和行业整合能力的欠缺,以及企业管理能力的平庸。
NO.1 张树新:不是我不明白Internet变化快
第一个做Internet
第一个从Internet中赚到了“大钱”
是明星也是流星
如果要有“中国硅谷”之称的中关村的那些生意人去回忆,1996年是什么给他们留下的印象最深?那么答案肯定不是“联想在那一年拿下中国pc市场第一”这件事,而是号称中国互联网代名词的瀛海威公司,以及它的那句广告词--“中国人离信息高速公路还有多远?向北1500米。”
当时,42岁的柳传志已经带领联想的创业者辛辛苦苦走过了的12年,才开始进入辉煌期。可这一过程对于张树新来说,却只需要2年的时间。
没有人怀疑作为中国科技大学历史上第一位女学生会主席、当时已经33岁的张树新的能力。她在一年前(即1995年9月)将一台486电脑联上网时,所有的中国人都把她视为“中国互联网的传教士”。在当时网友的嘴里,“瀛海威=网络=Internet!”而在这些网友中间,还有丁磊、王峻涛、王志东的影子。
但在出现了1个月最高净收益900万元的可喜业绩之后,瀛海威这个曾经令中国无数网民无比振奋的名字,却早早地在1997年就出现了衰落:公开消息显示,在1996年至1997年间,张树新带领的瀛海威进行了大量的网络接入站点投资,但因中国电信的介入及接入价格的走低,瀛海威公司出现了大幅的亏损
转到第二年(即1998年),干了3年的张树新正式辞职,离开了瀛海威。从此,张树新和这家曾是互联网代名词的公司一样,淡出了人们的视线。
NO.2 王峻涛:B2B没有选择痴情的我
第一个站出来说B2B,做B2B
当时很受VC的青睐
竞争对手做成了世界NO.1
1997年,当33岁的杭州人马云从自己做的“中国黄页”网站上脱身出来,参与到原外经贸部做的网上商品交易市场中去时,比他年长2岁、号称“中国电子商务第一人”的福州人王峻涛正在用他的后来很出名的网名“老榕”,发帖子呢,其中包括那个也许是他一生中最出名的帖子--《大连金州不相信眼泪》。
两年过去,马云创立了名字带点外国神话色彩的阿里巴巴网,而王峻涛则使用了一个在中国妇孺皆知的名字--珠穆朗玛(8848),这又好记又吉利。后来的发展也印证了这个名字的优势:很快,所有的人包括VC都记住了8848这个中国B2B的标杆;但吉利的名字没有让8848享受到幸运,就连已经大大出名的“老榕”王峻涛,也在经历了8848的股东与管理层之变后,辗转到MY8848,igo5,最后还是落在B2B网站6688上。
这些名字看起来还是脱不了B2B和8848的影子,但就像B2B被提及的数次越来越少一样,“老榕”王峻涛这个名字也越来越少有人提及;反之,曾经比他名气小得多的马云和阿里巴巴却在2003年像横空出世一样震惊了世界,因为马云称阿里巴巴已经做到了世界B2B网站的NO.1。到此时人们彻底对王峻涛和6688失去了兴趣。
NO.3 曹军:努力到了,只欠东风
拥有WAPI标准下的部分核心 产品的技术
我国最终采用了WI-Fi联盟的标准
尽管两家公司前途迷茫的原因都跟WAPI标准强制执行政策的失效有关,但是跟具有18年海外工作经历的寿国梁不同,曹军一直在国内做生意,而且本身并不是做技术出身。但也许就是因为并非技术出身,曹军显然比寿国梁更善于从市场中去找机会。显然,曹军一开始就已经敏锐地意识到,通过政府的力量来推进他所看重的西安电子科技大学的无线局域网研究成果,也许是一个比较有利的途径。
事实也证明了曹军卓越的政府公关能力:从2000年底开始成立西电捷通公司,到2001年6月信息产业部下达WAPI标准起草任务,同年11月西电捷通发起中国宽带无线IP标准工作组并完成标准草案,再到2003年5月WAPI正式颁布,2003年11月26日出台WAPI标准强制执行政策,这中间每一步都不超过半年的时间。
经过这一系列的推进,此时的西电捷通已经开发出基于WAPI标准下的关键设备--WLAN网卡、无线接入点等成型产品。可惜的是,这一怎么看都是利好的生意,当然也包括曹军的西电捷通公司,最终因人所共知的原因还是没有发展起来。
NO.4 寿国梁:没成功,不是自己的错
拥有WAPI核心芯片组技术
我国最终采用了Wi-Fi联盟的标准
如果没有2004年初的那场“中外WAPI标准之争”的风波,也许到现在为止还都没几个IT从业者听说过寿国梁和六合万通的名字。跟其他回国创业者--如中星微邓中翰类似,在日本一呆就是18年的绍兴人寿国梁在日本已经有了一定的事业基础。1999年底回到国内时,他同样也选择了在有中国IT硅谷之称的中关村创业。而且,比邓大6岁的寿国梁也选择了自己已经在国外开展过的业务--芯片设计。然而,与邓中翰稍有不同的是,寿国梁设计的“万通芯”的竞争对手是INTEL,而邓的“星光”芯则不是。这一点在当初可能并没有引起寿国梁足够的重视。
在2004年4月22日之前,包括寿国梁在内的所有国内业界人士都愿意相信,2004年6月1日是英特尔用于WI-Fi设备的迅驰移动芯片在中国市场的死期,因为我国政府有关部门在2003年11月26日已经出台相关政策,准备在这天强制执行与INTEL的WI-Fi联盟标准不同的中国标准--WAPI。而六合万通的“万通1号”是WAPI标准下的核心芯片组。如果这个“事实”成真,没有人会怀疑“万通1号”和六合万通的前景。
但后来的事实是,以全球芯片巨头INTEL为代表的WI-Fi联盟在这场并不太长的标准之争中最终获胜。
NO.5 邓国顺:拿了专利丢了市场
开发出世界第一款U盘
曾占据一半的中国U盘市场
很快被竞争对手超越
1993年,一个清华大学毕业的江苏人在中关村创立了自己的公司--华旗资讯;同年,一个从中山大学毕业后在联想干了一段时间的湖南人,于当年去新加坡进了Philips公司工作。这两个在当时看来前途各异、毫不相干的人,却在后来成了针锋相对的竞争对手。后者虽然占有天时之优势,却最终没有战胜前者。这两个人,前者就是排在本刊“智造中国十大人物”中的冯军,后者就是拥有最多闪存(也称U盘)专利的深圳朗科公司总裁邓国顺。
1999年,32岁的邓国顺从新加坡回国后,和成晓华研发出了替代传统软盘的革命性产品--世界第一款闪存盘。而小邓国顺两岁的冯军正续“小太阳键盘”他做了6年的这个电脑外设生意。与邓国顺不同,尽管冯军已经在事业上有了积累,也有了自己的品牌“爱国者”。但就革命性的技术来说,冯军一个也没有;而邓国顺不但有,并且仅U盘申请的专利就已经超过150件。
专利的优势也阶段性地体现到了朗科的业绩上。据朗科提供的数据,2003年该公司占据了国内U盘市场50%,销量达150多万个。但到了2004年,据CCID的数据,华旗的U盘市场份额达31.2%,朗科只占18.1%。在这一变化的背后,是发生在2004年中的热闹一时的朗科诉华旗、索尼等多家公司侵犯专利权案。
尽管朗科在今年4月初停产1.1标准U盘全面升级到2.0标准的做法,目的仍是希望通过专利权保护来获得市场的认可,但这时的U盘市场早已不是3年前的样子,朗科的声音也显得越来越弱。
NO.6 张征宇:我一直没有转过弯来
商务通“成了PDA代名词
做两年就做到10亿元年营业额
智能手机领域的弱者
呼机,手机,商务通,一个都不能少。”这句广告词成就了一家公司--恒基伟业,和一个40岁才创业的博士--杭州人张征宇。即使用“一夜暴福”来形容张征宇也不为过:刚成立两年的公司2000年的现金收入就达10个亿。即使现在的中国网络公司都没有这样的业绩。
但这家公司跟这句广告词的命运有惊人的相似处:作为PDA代名词的“商务通”,跟呼机一样似乎又在一夜之间就消失了;而手机却越来越热门,甚至中国货一度抢过了洋手机的风头。当张征宇看中智能手机的机会时,小他3岁的多普达公司总裁杨兴平还在美国做研究呢。
遗憾的是,在2000年“商务通”达到巅峰之后,价格战和消费者兴趣的转移,使“商务通”很快成为一种过季商品。但张征宇显然不甘于PDA的没落:他毅然决然地在广西北海兴建恒基伟业工业园,并计划5年内投资18亿。但销售额的直线下滑已经让张征宇无力四顾,对智能手机这一新业务的投入也就成为了空中楼阁。
而从2002年开始做智能手机的杨兴平,在经历了3年的艰苦开拓之后,终于让多普达在智能手机领域站稳了脚跟。眼下,既没人怀念PDA和“商务通”,也没有人知道恒基伟业的智能手机。
NO.7 边晓春:聪明总被聪明误
创立中国第一个游戏公司前导软件有限公司
第一个接受风险投资的游戏公司
创造中国游戏的多个第一,包括第一个倒下当今天人们在谈论年轻的陈天桥及其天文数字一样的财富时,没有多少人能想起边晓春和中国第一个游戏公司--前导。
1996年,尽管国内第一部策略游戏《官渡》的销量不尽如人意,但却从海外收回了7万美元的版税。同年底,前导引进《命令与征服》并创下一周内出货1万套且全部结款的记录。1997年,《赤壁》与联想电脑捆绑销售,率先突破了国产游戏软件销量10万套的大关。
但过度发展不但没有创造神话,反而要了前导软件公司的命。《赤壁》投入97万元,《水浒》投入145万元,《齐天大圣》成本则升至170万元。成本如此迅猛增长使得游戏开发风险加大,1998年下半年公司就已经负债1000万元。
此外,前导软件曾被视为成功吸引风险投资的典范。1998年初,边晓春在谈到他对风险投资的理解时打了个比方:“如果你手里有50元钱,通常的做法是投入市场,得到10元利润,再用60元继续经营。我的做法是,只拿出30元投入一个主要市场,而将另外两个10元分别开始两个新项目,然后把这3个项目捆在一起去寻找投资者,用得到的200元投资去发展这3个项目。”
然而仅仅过了半年,前导公司就宣布退出游戏市场。一年后,边晓春对自己的“50元理论”作了反思:“我确实错了,因为这种理念并未使前导公司摆脱危机。那么到底错在哪里呢?我目前的认识是:如果你把那30元都赔光了,也就不会有人给你的三个项目投资了,尽管这三个项目在未来确实可能是好项目。也就是说,作为风险投资企业,虽然必须也只能从资本市场得到快速发展的动力;然而,只有产品市场,才是企业的立身之本。”
变性和持续成功的“无规律性”。这种“无规律性”既表现在你所需要坚持的东西上,也表现在日常的经营管理中。
8848和王峻涛的“失败”,曾经令绝大部分的专业人士对B2B产生了动摇;张树新、张征宇也并不是不知道迅速扩张的风险;邓国顺当然更是不会想到,专利保护竟然没有能够使自己快速成长。这些遗憾其实何止发生在这七个遗憾者的身上,绝大部分的行业跟随者甚至那些成功者,也多多少少存在着的问题。但对比少数成功者的成功原因,可以得出这样一个结论:那些遗憾者真正遗憾的是,看到了机会,也抢先跑出去了,却没找对方向。
如果再去细究“没找对方向”的原因,那么基本上可以认为,与“智造中国”中的那10个代表人物相比,“遗憾人物”的最大缺陷就是资源利用和行业整合能力的欠缺,以及企业管理能力的平庸。
NO.1 张树新:不是我不明白Internet变化快
第一个做Internet
第一个从Internet中赚到了“大钱”
是明星也是流星
如果要有“中国硅谷”之称的中关村的那些生意人去回忆,1996年是什么给他们留下的印象最深?那么答案肯定不是“联想在那一年拿下中国pc市场第一”这件事,而是号称中国互联网代名词的瀛海威公司,以及它的那句广告词--“中国人离信息高速公路还有多远?向北1500米。”
当时,42岁的柳传志已经带领联想的创业者辛辛苦苦走过了的12年,才开始进入辉煌期。可这一过程对于张树新来说,却只需要2年的时间。
没有人怀疑作为中国科技大学历史上第一位女学生会主席、当时已经33岁的张树新的能力。她在一年前(即1995年9月)将一台486电脑联上网时,所有的中国人都把她视为“中国互联网的传教士”。在当时网友的嘴里,“瀛海威=网络=Internet!”而在这些网友中间,还有丁磊、王峻涛、王志东的影子。
但在出现了1个月最高净收益900万元的可喜业绩之后,瀛海威这个曾经令中国无数网民无比振奋的名字,却早早地在1997年就出现了衰落:公开消息显示,在1996年至1997年间,张树新带领的瀛海威进行了大量的网络接入站点投资,但因中国电信的介入及接入价格的走低,瀛海威公司出现了大幅的亏损
转到第二年(即1998年),干了3年的张树新正式辞职,离开了瀛海威。从此,张树新和这家曾是互联网代名词的公司一样,淡出了人们的视线。
NO.2 王峻涛:B2B没有选择痴情的我
第一个站出来说B2B,做B2B
当时很受VC的青睐
竞争对手做成了世界NO.1
1997年,当33岁的杭州人马云从自己做的“中国黄页”网站上脱身出来,参与到原外经贸部做的网上商品交易市场中去时,比他年长2岁、号称“中国电子商务第一人”的福州人王峻涛正在用他的后来很出名的网名“老榕”,发帖子呢,其中包括那个也许是他一生中最出名的帖子--《大连金州不相信眼泪》。
两年过去,马云创立了名字带点外国神话色彩的阿里巴巴网,而王峻涛则使用了一个在中国妇孺皆知的名字--珠穆朗玛(8848),这又好记又吉利。后来的发展也印证了这个名字的优势:很快,所有的人包括VC都记住了8848这个中国B2B的标杆;但吉利的名字没有让8848享受到幸运,就连已经大大出名的“老榕”王峻涛,也在经历了8848的股东与管理层之变后,辗转到MY8848,igo5,最后还是落在B2B网站6688上。
这些名字看起来还是脱不了B2B和8848的影子,但就像B2B被提及的数次越来越少一样,“老榕”王峻涛这个名字也越来越少有人提及;反之,曾经比他名气小得多的马云和阿里巴巴却在2003年像横空出世一样震惊了世界,因为马云称阿里巴巴已经做到了世界B2B网站的NO.1。到此时人们彻底对王峻涛和6688失去了兴趣。
NO.3 曹军:努力到了,只欠东风
拥有WAPI标准下的部分核心 产品的技术
我国最终采用了WI-Fi联盟的标准
尽管两家公司前途迷茫的原因都跟WAPI标准强制执行政策的失效有关,但是跟具有18年海外工作经历的寿国梁不同,曹军一直在国内做生意,而且本身并不是做技术出身。但也许就是因为并非技术出身,曹军显然比寿国梁更善于从市场中去找机会。显然,曹军一开始就已经敏锐地意识到,通过政府的力量来推进他所看重的西安电子科技大学的无线局域网研究成果,也许是一个比较有利的途径。
事实也证明了曹军卓越的政府公关能力:从2000年底开始成立西电捷通公司,到2001年6月信息产业部下达WAPI标准起草任务,同年11月西电捷通发起中国宽带无线IP标准工作组并完成标准草案,再到2003年5月WAPI正式颁布,2003年11月26日出台WAPI标准强制执行政策,这中间每一步都不超过半年的时间。
经过这一系列的推进,此时的西电捷通已经开发出基于WAPI标准下的关键设备--WLAN网卡、无线接入点等成型产品。可惜的是,这一怎么看都是利好的生意,当然也包括曹军的西电捷通公司,最终因人所共知的原因还是没有发展起来。
NO.4 寿国梁:没成功,不是自己的错
拥有WAPI核心芯片组技术
我国最终采用了Wi-Fi联盟的标准
如果没有2004年初的那场“中外WAPI标准之争”的风波,也许到现在为止还都没几个IT从业者听说过寿国梁和六合万通的名字。跟其他回国创业者--如中星微邓中翰类似,在日本一呆就是18年的绍兴人寿国梁在日本已经有了一定的事业基础。1999年底回到国内时,他同样也选择了在有中国IT硅谷之称的中关村创业。而且,比邓大6岁的寿国梁也选择了自己已经在国外开展过的业务--芯片设计。然而,与邓中翰稍有不同的是,寿国梁设计的“万通芯”的竞争对手是INTEL,而邓的“星光”芯则不是。这一点在当初可能并没有引起寿国梁足够的重视。
在2004年4月22日之前,包括寿国梁在内的所有国内业界人士都愿意相信,2004年6月1日是英特尔用于WI-Fi设备的迅驰移动芯片在中国市场的死期,因为我国政府有关部门在2003年11月26日已经出台相关政策,准备在这天强制执行与INTEL的WI-Fi联盟标准不同的中国标准--WAPI。而六合万通的“万通1号”是WAPI标准下的核心芯片组。如果这个“事实”成真,没有人会怀疑“万通1号”和六合万通的前景。
但后来的事实是,以全球芯片巨头INTEL为代表的WI-Fi联盟在这场并不太长的标准之争中最终获胜。
NO.5 邓国顺:拿了专利丢了市场
开发出世界第一款U盘
曾占据一半的中国U盘市场
很快被竞争对手超越
1993年,一个清华大学毕业的江苏人在中关村创立了自己的公司--华旗资讯;同年,一个从中山大学毕业后在联想干了一段时间的湖南人,于当年去新加坡进了Philips公司工作。这两个在当时看来前途各异、毫不相干的人,却在后来成了针锋相对的竞争对手。后者虽然占有天时之优势,却最终没有战胜前者。这两个人,前者就是排在本刊“智造中国十大人物”中的冯军,后者就是拥有最多闪存(也称U盘)专利的深圳朗科公司总裁邓国顺。
1999年,32岁的邓国顺从新加坡回国后,和成晓华研发出了替代传统软盘的革命性产品--世界第一款闪存盘。而小邓国顺两岁的冯军正续“小太阳键盘”他做了6年的这个电脑外设生意。与邓国顺不同,尽管冯军已经在事业上有了积累,也有了自己的品牌“爱国者”。但就革命性的技术来说,冯军一个也没有;而邓国顺不但有,并且仅U盘申请的专利就已经超过150件。
专利的优势也阶段性地体现到了朗科的业绩上。据朗科提供的数据,2003年该公司占据了国内U盘市场50%,销量达150多万个。但到了2004年,据CCID的数据,华旗的U盘市场份额达31.2%,朗科只占18.1%。在这一变化的背后,是发生在2004年中的热闹一时的朗科诉华旗、索尼等多家公司侵犯专利权案。
尽管朗科在今年4月初停产1.1标准U盘全面升级到2.0标准的做法,目的仍是希望通过专利权保护来获得市场的认可,但这时的U盘市场早已不是3年前的样子,朗科的声音也显得越来越弱。
NO.6 张征宇:我一直没有转过弯来
商务通“成了PDA代名词
做两年就做到10亿元年营业额
智能手机领域的弱者
呼机,手机,商务通,一个都不能少。”这句广告词成就了一家公司--恒基伟业,和一个40岁才创业的博士--杭州人张征宇。即使用“一夜暴福”来形容张征宇也不为过:刚成立两年的公司2000年的现金收入就达10个亿。即使现在的中国网络公司都没有这样的业绩。
但这家公司跟这句广告词的命运有惊人的相似处:作为PDA代名词的“商务通”,跟呼机一样似乎又在一夜之间就消失了;而手机却越来越热门,甚至中国货一度抢过了洋手机的风头。当张征宇看中智能手机的机会时,小他3岁的多普达公司总裁杨兴平还在美国做研究呢。
遗憾的是,在2000年“商务通”达到巅峰之后,价格战和消费者兴趣的转移,使“商务通”很快成为一种过季商品。但张征宇显然不甘于PDA的没落:他毅然决然地在广西北海兴建恒基伟业工业园,并计划5年内投资18亿。但销售额的直线下滑已经让张征宇无力四顾,对智能手机这一新业务的投入也就成为了空中楼阁。
而从2002年开始做智能手机的杨兴平,在经历了3年的艰苦开拓之后,终于让多普达在智能手机领域站稳了脚跟。眼下,既没人怀念PDA和“商务通”,也没有人知道恒基伟业的智能手机。
NO.7 边晓春:聪明总被聪明误
创立中国第一个游戏公司前导软件有限公司
第一个接受风险投资的游戏公司
创造中国游戏的多个第一,包括第一个倒下当今天人们在谈论年轻的陈天桥及其天文数字一样的财富时,没有多少人能想起边晓春和中国第一个游戏公司--前导。
1996年,尽管国内第一部策略游戏《官渡》的销量不尽如人意,但却从海外收回了7万美元的版税。同年底,前导引进《命令与征服》并创下一周内出货1万套且全部结款的记录。1997年,《赤壁》与联想电脑捆绑销售,率先突破了国产游戏软件销量10万套的大关。
但过度发展不但没有创造神话,反而要了前导软件公司的命。《赤壁》投入97万元,《水浒》投入145万元,《齐天大圣》成本则升至170万元。成本如此迅猛增长使得游戏开发风险加大,1998年下半年公司就已经负债1000万元。
此外,前导软件曾被视为成功吸引风险投资的典范。1998年初,边晓春在谈到他对风险投资的理解时打了个比方:“如果你手里有50元钱,通常的做法是投入市场,得到10元利润,再用60元继续经营。我的做法是,只拿出30元投入一个主要市场,而将另外两个10元分别开始两个新项目,然后把这3个项目捆在一起去寻找投资者,用得到的200元投资去发展这3个项目。”
然而仅仅过了半年,前导公司就宣布退出游戏市场。一年后,边晓春对自己的“50元理论”作了反思:“我确实错了,因为这种理念并未使前导公司摆脱危机。那么到底错在哪里呢?我目前的认识是:如果你把那30元都赔光了,也就不会有人给你的三个项目投资了,尽管这三个项目在未来确实可能是好项目。也就是说,作为风险投资企业,虽然必须也只能从资本市场得到快速发展的动力;然而,只有产品市场,才是企业的立身之本。”
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)
#define SIZE 80
int write_buffer(int fd,char *buf,int count);
void case8(int i,char *j);
void default8();
int main(int argc, char * argv[])
{
int outfile,i;
char filename[]={"test.dat"};
char buffer[SIZE];
char *buf;
char *argv2;
printf("%d\n\n\n",argc);
if(argc<=2)
{
default8();
exit(0);
}
switch(atoi(argv[1]))
{
case 0:
{
case8(atoi(argv[1]),argv[2]);
break;
}
case 1:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
case 2:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
case 3:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
default:
{
default8();
}
}
}
/*
for(i=0;i<argc;i++)
{
printf("the argv's value is %d\n",argc);
printf("argv[%d]=%s\n",i,argv[i]);
}
*/
/*
buf = argv[1];
if((outfile=open(filename,NEWFILE,0640))==-1)
{
printf("ERRO,OPEN FILE FAILED!\n");
exit(255);
}
//printf("%s",buf);
fgets(buffer,SIZE-1,stdin);
printf("%s\n",buffer);
if(write_buffer(outfile,buffer,SIZE)==-1)
{
printf("ERROR,WRITE FAILED:\n",strerror(errno));
exit(255);
}
close(outfile);
return 0;
int write_buffer(int fd,char *buf,int count)
{
int n;
n=write(fd,buf,strlen(buf));
return 1;
}
*/
void case8(int i,char *j){
printf("you enter is ./a.o %d %s\n",i,j);
}
void default8(){
printf("which you put a not suitable for our need:");
printf("填加测试企业:../bin/example 0\n");
printf("按照企业id删除企业:../bin/example 1 100071\n");
printf("按照企业名称删除企业:../bin/example 2 \"my enterprise name\"\n");
printf("按照企业名称取得g级邮箱标识:../bin/example 3 \"my enterprise name\"\n");
printf("按照企业id取得g级邮箱标识:../bin/example 4 \"my enterprise ID\"\n");
printf("other:待补充\n");
}
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#define NEWFILE (O_WRONLY|O_CREAT|O_TRUNC)
#define SIZE 80
int write_buffer(int fd,char *buf,int count);
void case8(int i,char *j);
void default8();
int main(int argc, char * argv[])
{
int outfile,i;
char filename[]={"test.dat"};
char buffer[SIZE];
char *buf;
char *argv2;
printf("%d\n\n\n",argc);
if(argc<=2)
{
default8();
exit(0);
}
switch(atoi(argv[1]))
{
case 0:
{
case8(atoi(argv[1]),argv[2]);
break;
}
case 1:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
case 2:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
case 3:
{
argv2=argv[2];
case8(atoi(argv[1]),argv[2]);
break;
}
default:
{
default8();
}
}
}
/*
for(i=0;i<argc;i++)
{
printf("the argv's value is %d\n",argc);
printf("argv[%d]=%s\n",i,argv[i]);
}
*/
/*
buf = argv[1];
if((outfile=open(filename,NEWFILE,0640))==-1)
{
printf("ERRO,OPEN FILE FAILED!\n");
exit(255);
}
//printf("%s",buf);
fgets(buffer,SIZE-1,stdin);
printf("%s\n",buffer);
if(write_buffer(outfile,buffer,SIZE)==-1)
{
printf("ERROR,WRITE FAILED:\n",strerror(errno));
exit(255);
}
close(outfile);
return 0;
int write_buffer(int fd,char *buf,int count)
{
int n;
n=write(fd,buf,strlen(buf));
return 1;
}
*/
void case8(int i,char *j){
printf("you enter is ./a.o %d %s\n",i,j);
}
void default8(){
printf("which you put a not suitable for our need:");
printf("填加测试企业:../bin/example 0\n");
printf("按照企业id删除企业:../bin/example 1 100071\n");
printf("按照企业名称删除企业:../bin/example 2 \"my enterprise name\"\n");
printf("按照企业名称取得g级邮箱标识:../bin/example 3 \"my enterprise name\"\n");
printf("按照企业id取得g级邮箱标识:../bin/example 4 \"my enterprise ID\"\n");
printf("other:待补充\n");
}
若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。
错误代码
EBADF 参数fd 不是有效的文件描述词
EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。
EINVAL 参数start、length 或offset有一个不合法。
EAGAIN 文件被锁住,或是有太多内存被锁住。
ENOMEM 内存不足。
范例
/* 利用mmap()来读取/etc/passwd 文件内容*/
#include
#include
#include
#include
#include
main()
{
int fd;
void *start;
struct stat sb;
fd=open(“/etc/passwd”,O_RDONLY); /*打开/etc/passwd*/
fstat(fd,&sb); /*取得文件大小*/
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(start= = MAP_FAILED) /*判断是否映射成功*/
return;
printf(“%s”,start);
munma(start,sb.st_size); /*解除映射*/ freebsd下这一行报错。。
closed(fd);
}
错误代码
EBADF 参数fd 不是有效的文件描述词
EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。
EINVAL 参数start、length 或offset有一个不合法。
EAGAIN 文件被锁住,或是有太多内存被锁住。
ENOMEM 内存不足。
范例
/* 利用mmap()来读取/etc/passwd 文件内容*/
#include
#include
#include
#include
#include
main()
{
int fd;
void *start;
struct stat sb;
fd=open(“/etc/passwd”,O_RDONLY); /*打开/etc/passwd*/
fstat(fd,&sb); /*取得文件大小*/
start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
if(start= = MAP_FAILED) /*判断是否映射成功*/
return;
printf(“%s”,start);
munma(start,sb.st_size); /*解除映射*/ freebsd下这一行报错。。
closed(fd);
}
fgets问题
fgets(由文件中读取一字符串)
相关函数
open,fread,fscanf,getc
表头文件
include
定义函数
har * fgets(char * s,int size,FILE * stream);
函数说明
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例
#include
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}
执行
this is a test /*输入*/
this is a test /*输出*/
这里是函数的说明
代码:
--------------------------------------------------------------------------------
typedef char (*ARRAYPTR)[10];
typedef char ARRAY[10];
main(void)
{
ARRAYPTR ap;
ARRAY a;
printf("Input a string : ");
fgets(a,100,stdin);
ap=&a;
printf("\nECHO : %s\n",ap);
}
100就是size,你上面已经写了。stdin是“标准输入”,一般指终端输入(键盘输入)。这一句的意思是从键盘输入一个字符串,这个字符串加上换行符不能超过100个字节,因此实际最多可以输入99个字符。
fgets(由文件中读取一字符串)
相关函数
open,fread,fscanf,getc
表头文件
include
定义函数
har * fgets(char * s,int size,FILE * stream);
函数说明
fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值
gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例
#include
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}
执行
this is a test /*输入*/
this is a test /*输出*/
这里是函数的说明
代码:
--------------------------------------------------------------------------------
typedef char (*ARRAYPTR)[10];
typedef char ARRAY[10];
main(void)
{
ARRAYPTR ap;
ARRAY a;
printf("Input a string : ");
fgets(a,100,stdin);
ap=&a;
printf("\nECHO : %s\n",ap);
}
100就是size,你上面已经写了。stdin是“标准输入”,一般指终端输入(键盘输入)。这一句的意思是从键盘输入一个字符串,这个字符串加上换行符不能超过100个字节,因此实际最多可以输入99个字符。