C语言中指针变量和数组的组合

int a[10];
int * p;
C语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:

p = &a[0];
p = a;

 

摘自:C语言程序设计(第二版)p211
(5)指针变量的值是可以改变的,见下例。

例10.20 改变指针变量的值。

#include <stdio.h>
void main()
{
char *a = "I love China!":
a = a + 7;
printf("%s", a);
}

运行结果如下:

China!

指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:

char str[] = {“I love China!”};
str = str + 7;
printf(“%s”, str);

需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。

例10.21 用带下标的字符指针变量引用字符串中的字符:

#include <stdio.h>
void main()
{
char *a = "I love China!";
int i;
printf("The sixth character is %C\n", a[5] );
for(i=0; a[i] != '\0'; i++)
printf(%c" a[i]);

printf("\n");
}

运行结果如下:

The sixth character is e
I love China!

程序中虽然并未定义数组a,但字符串在内存中是以字符数组形式存放的。a[5] 按*(a+5)处理,即从a当前所指向的元素下移5个元素位置,取出其单元中的值。

用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。

例如:

char *format;
format = "a=%d,b=%f\n";
printf(format,a,b);

它相当于:

printf(“a=%d,b=%f\n”,a,b);

因此只要改变指针变量format所指向的字符串,就可以改变输入输出的格式。这种printf函数称为可变格式输出函数。也可以用数组实现。例如:

char format[]=”a=%d,b=%f\n”;
printf(format,a,b);

但由于不能采用赋值语句对数组整体赋值,例如:

char format[];
format = “a=%d,b=%d\n”;

因此,用指针变量指向字符串的方式更为方便。

又拍网架构中的分库设计

又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。

又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括MySQLPHPnginxPythonmemcachedredisSolrHadoopRabbitMQ等等。又拍网的服务器端开发语言主要是PHPPython,其中PHP用于编写Web逻辑(通过HTTP和用户直接打交道), 而Python则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下MooTools这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从PHP进程里独立出来变成一个服务。这个服务基于nginx,但是是作为nginx的一个模块而开放REST API。

开发语言

图1:开发语言

Continue reading

解剖Twitter:Twitter系统架构设计分析

随着信息爆炸的加剧,微博客网站Twitter横空出世了。用横空出世这个词来形容Twitter的成长,并不夸张。从2006年5月Twitter上线,到2007年12月,一年半的时间里,Twitter用户数从0增长到6.6万。又过了一年,2008年12月,Twitter的用户数达到5百万。[1]

Twitter网站的成功,先决条件是能够同时给千万用户提供服务,而且提供服务的速度要快。[2,3,4]

有观点认为,Twitter的业务逻辑简单,所以竞争门槛低。前半句正确,但是后半句有商榷余地。Twitter的竞争力,离不开严谨的系统架构设计。

【1】万事开头易

Twitter的核心业务逻辑,在于Following和Be followed。[5]

进入Twitter个人主页,你会看到你following的那些作者,最近发表的微博客。所谓微博客,就是一则短信,Twitter规定,短信的长度不得超过140个字。短信不仅可以包含普通文字信息,也可以包含URL,指向某个网页,或者照片及视频等等。这就是following的过程。

当你写了一则短信并发表以后,你的followers会立刻在他们的个人主页中看到你写的最新短信。这就是be followed的过程。

实现这个业务流程似乎很容易。 Continue reading

软件架构设计中的同步与异步问题(修改版)

内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。

关键词:同步,异步,消息队列,效率,并发

一.基本概念

同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。

一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这称之为同步模式。反之,在某一时间段,这个程序系统的不同功能模块可以独立运行完成一件任务的子任务,无须等待其他功能模块完成子任务就可以继续处理下一件任务的子任务,功能模块是并行运行,这称之为异步模式。 Continue reading

FreeBSD 单网卡绑定多个IP

假设网卡lnc0原IP地址为192.168.0.2,现在为它绑定另一个IP:

# ifconfig lnc0 192.168.0.3 netmask 255.255.255.255 alias

解释:

如果别名IP地址和网卡原IP地址在同一个子网上,就需要设置掩码为255.255.255.255

如果位于不同的子网,就直接使用相应子网的正常网络掩码

从TCP/IP的角度来看,这样做意味着什么呢?

网络掩码的所有位都设置成1,就会保证ICP/IP栈这样来看待包: Continue reading

centos下快速同步时间

安装ntpdate

yum -y install ntp

vi /etc/crontab 添加下面这行

30 21 * * * root /usr/sbin/ntpdate cn.pool.ntp.org && /sbin/hwclock -w

:wq (保存退出)
手动更新时间方法:ntpdate cn.pool.ntp.org
hwclock -w 这里是更新ROM的时间

文件格式为:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 周(0-7) user command
意思是:root用户 在每天21:30 分执行ntpdate comamnd 同步到 cn.pool.ntp.org 这个时间池,并且将更新的时间写入到 ROM里保存。

备注:不要忘记开启服务啊!
chkconfig ntpd –list                (查看0~6个runlevel 是否按照阁下意愿开启或关闭 ntpd服务)
chkconfig ntpd –level 35 on   (开启runlevel 3和5的ntpd服务)
chkconfig ntpd on                    (开启runlevel 2345的ntpd服务)
chkconfig ntpd off                    (关闭所有runlevel的ntpd服务)

更多时间服务器地址:

server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org

ipvsadm+keepalived 实现高可用负载均衡

一.使用系统Red Hat Enterprise Linux Server release 5.4

二.安装环境

1.说明

realserver:192.168.1.11

realserver:192.168.1.12

lvs控制机 MASTER:192.168.1.100

BACKUP:192.168.1.101

虚拟VIP:192.168.1.200

其中:realserver上只需要简单的安装apache即可

lvs控制机需要安装:ipvsadm,keepalived

2.lvs控制机安装,主备机分别安装ipvsadm

实现LVS/DR最重要的两个东西是ipvs内核模块和ipvsadm工具包,现在的系统已经包含ip_vs模块

1)检查内核模块,看一下ip_vs 是否被加载

# lsmod |grep ip_vs

ip_vs    35009    0

如果没有显示,则说明没有加载,执行命令 modprobe ip_vs 就可以把ip_vs模块加载到内核 Continue reading

c语言中的scanf语法

scanf函数,与printf函数一样,都被定义在stdio.h里,因此在使用scanf函数时要加上#include<stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。

scanf函数的一般形式

scanf(格式控制,地址表列)

int scanf(char *format[,argument,…]);

“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。

例:使用scanf函数输入数据。 Continue reading

Centos5下配置 lvs DR

系统环境如下:

server1:192.168.1.206 vip server centos5
server2:192.168.1.210 apache centos5
server3:192.168.1.211 apache centos5

vip:192.168.1.208
port:80

============================================

下面的安装是在vip server上进行的

1、查看自己的操作系统的内核 #uname -a

2、这个内核已经包括了ipvs的补丁,进行如下的操作就可以

3、下面建立一个指向,为了保证ipvsadm安装

  1. modprobe ip_vs
  2. cat /proc/net/ip_vs

出现如下的提示

IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags Continue reading

linux route 命令

懂得网络配置命令是一般技术人员必备的技术,经过一段时间的研究和学习,总结了一些常用的命令和示例以便日后查阅.
传统的在1–3点,ip高级路由命令在4–12点,两者部分可以通用,并达到同样的目的,但ip的功能更强大,可以实现更多的配置目的.
首先,先了解传统的网络配置命令:
1. 使用ifconfig命令配置并查看网络接口情况
示例1: 配置eth0的IP,同时激活设备:
# ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up
示例2: 配置eth0别名设备 eth0:1 的IP,并添加路由 Continue reading