由买买提看人间百态

topics

全部话题 - 话题: stdio
首页 上页 1 2 3 4 5 6 7 8 9 10 (共10页)
g***i
发帖数: 4272
1
#include
#include
typedef void (*callback_fn_t)(void*);
typedef struct cb_st{
void *user_data;
callback_fn_t user_fn;
}callback_t;
void do_callback(const callback_t *cb){
((callback_fn_t) cb)(cb->user_data);//这里会出错
}
void my_cb(void *data){
printf("Hello, %s!\n", (char*)data);
}
int main(int argc, const char * argv[])
{
callback_t cb;
cb.user_data = (void *)"Stephen";
cb.user_fn = &my_cb;
do_callback(&cb);
return 0;
}
请问出错的原因是什么?
是不是不能把cb ... 阅读全帖
d****n
发帖数: 1637
2
来自主题: Programming版 - 如何设计一个停车场。
My implementation using min heap
//file name parkinglots.c
#include
#include
int *lots; //parking lots
#define LOTSMAX 16 //lots size
void Heapify( int i, int mx);
void car_enter();
void car_leave(int i);
void print_lots();
int main(){
int i;
lots=(int *)calloc( (LOTSMAX), sizeof(int));
printf("car enter\n");
for(i=0;i if(lots[0]!=1){
car_enter();
print_lots();
}
}
printf("car leave\n");
for(i=LOTSM... 阅读全帖
d****n
发帖数: 1637
3
来自主题: Programming版 - 如何设计一个停车场。
My implementation using min heap
//file name parkinglots.c
#include
#include
int *lots; //parking lots
#define LOTSMAX 16 //lots size
void Heapify( int i, int mx);
void car_enter();
void car_leave(int i);
void print_lots();
int main(){
int i;
lots=(int *)calloc( (LOTSMAX), sizeof(int));
printf("car enter\n");
for(i=0;i if(lots[0]!=1){
car_enter();
print_lots();
}
}
printf("car leave\n");
for(i=LOTSM... 阅读全帖
s******n
发帖数: 3946
4
【 以下文字转载自 JobHunting 讨论区 】
发信人: swanswan (swan), 信区: JobHunting
标 题: 有个SB interviewer和我说++i比i++好
发信站: BBS 未名空间站 (Thu Mar 22 16:09:09 2012, 美东)
他的意思是假设是operator重载
++i先做++再放在stack上,i++则先复制一份copy到stack上再做++,多了一份复制(假
设编译无优化)
大家看有道理吗?
I did a real test on arm compiler turn off optimization:
the O0 code is exactly the same, except that post operator++()(int dummy)
has an extra dummy parameter which is required by c++ to identify the
difference of prefix and postfix.
2nd, even I change the Test& ope... 阅读全帖
d****n
发帖数: 1637
5
来自主题: Programming版 - 请教怎么用#define实现如下的功能
I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=transfer("abc") ;
int i;
for(i... 阅读全帖
k****t
发帖数: 2288
6
来自主题: Programming版 - 请教怎么用#define实现如下的功能
你这个编译有错~~~
说syntex error。
应该是这个define有问题

I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=tran... 阅读全帖
d****n
发帖数: 1637
7
来自主题: Programming版 - 请教怎么用#define实现如下的功能
Try this.
Fill as many char size as you could reach
//file define.c
//transfer must be put at the end of array if overrun index
// and you dont want to calculate the size.
// precisely use trans(x, n) macro
//if you really assign a large char array, then take my first approach.
#include
#include
//unsafe but ok
#define transfer(x) trans(x, 10)
#define trans(x, n) trans##n(x), #x[n]
#define trans10(x) trans9(x), #x[9]
#define trans9(x) trans8(x), #x[8]
#define trans8(x) tra... 阅读全帖
d****n
发帖数: 1637
8
来自主题: Programming版 - 标 题: 发包子 echo 求助
if unknown number of paramers.
#include
#define MAX 1000
int main(){
int params[MAX];
int i=0,j, t;
while(scanf("%d",&t)!=EOF && i while(i>=0) printf("%d ", params[--i]);
}
////output1////
$ echo 1 2 3 4 5 6 7 8 |./a.out
8 7 6 5 4 3 2 1
///output2///
echo 1234 5678 9101 4567 | ./a.out
4567 9101 5678 1234
F********g
发帖数: 475
9
请高人解释一下为啥这个输出总是"HELLO-ERR"
#include
#include
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
F********g
发帖数: 475
10
Thanks, 思考猪, now it's working
#include
#include
int main()
{
while(1)
{
fprintf(stdout,"hello-out");
fflush(stdout);
fprintf(stderr,"hello-err");
sleep(1);
}
return 0;
}
d****n
发帖数: 1637
11
if you dont mind change the output to adding '\n'
then it will work.
'\n' can flush, no need to call fflush()
#include
#include
int main()
{
while(1)
{
fprintf(stdout,"hello-out\n");
fprintf(stderr,"hello-err\n");
sleep(1);
}
return 0;
}
F********g
发帖数: 475
12
谢。再问
#include
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}
Just by looking at the program one "might" expect the output to be, the same
for both the printf statements. But on running the program you get it as:
bash$ ./a.out
12
f(1,2)
第二个MACRO输出为啥不是12
l******d
发帖数: 530
13
来自主题: Programming版 - printf("%s\n", NULL)的结果
#include
int main(){
printf("Hello %s\n", NULL);
fflush(stdout);
printf("%s\n", NULL);
fflush(stdout);
return 0;
}
在linux上用gcc编译运行结果为
Hello (null)
Segmentation fault
什么原理?
d**d
发帖数: 389
14
来自主题: Programming版 - 关于C++中 extern "C"的问题。
有没有详细的说明什么情况下定义的函数要加extern "C"啊?
1. 没有使用/调用class的函数都属于 C 函数?
2. 只是用standard C library的函数? 就是只调用stdio.h, stdlib.h....的函数?
3. 哪些调用cstdio,cstdlib的函数是不是属于C 函数?
d**d
发帖数: 389
15
来自主题: Programming版 - 关于C++中 extern "C"的问题。
比如我已经用C写好了几个独立的函数去处理一个xml文件,调用的库是现有的libxml2,
这个是标准的C library.
在parser.c中,
#include
#include
#include
void parser();
1. 如果我把这个文件放到我其他的C++程序中,还是parser.c,那么在调用G++编译的
时间,parser.c就要变成
#ifdef _cplusplus
extern "C"{
endif
void parser();
#ifdef _cplusplus
}
#endif
是这样吧?
2. 如果我重新生成一个parser.cpp文件:
#include
#include
#include
void parser();
这样的话,用g++来编译就没有问题了?
谢谢。
d**d
发帖数: 389
16
来自主题: Programming版 - 关于C++中 extern "C"的问题。
好像明白了一些。
1. 一个函数,调用标准的C库,stdio.h什么的,如果C++的程序想要调用这个函数的话
,那么在编译的实际就有两种选择:
a, 存在.c 文件中,用gcc来编译,需要加extern "C"。
b, 存在.cpp文件中,把所有的 stdlib.h等等换成 cstdlib等等,用g++来编译,不需
要加 extern "C".
对不对? 对于情况b,是不是必须把所有的 stdlib.h等等换成 cstdlib等等?
如果不换的话,用g++来编译会有什么问题吗?C++里面的cstdlib是不是完全等同于
stdlib.h?
以前一个项目要么是C++,要不就是全是C的。现在有一个项目需要用到一些很老的C写
的库,以前写的时间,完全没有想到要给C++用的,搞的现在很麻烦,又没有人去把这
些库用C++从新写。
谢谢了。
g***a
发帖数: 114
17
来自主题: Programming版 - C++class指针转换
thinking in C++ 的一道作业题,关于class的指针转换,想说明C中存在此类"hole",
而C++可以规避。可是自己编程发现程序结果与solution刚好相反,望指点。
原题如下
Create a class called bird that can fly( ) and a class rock that can’t.
Create a rock object, take its address, and assign that to a void*. Now take
the void*, assign it to a bird* (you’ll have to use a cast), and call fly(
) through that pointer. Is it clear why C’s permission to openly assign
via a void* (without a cast) is a “hole” in the language, which couldn’t
be propagated into C++?
solution:... 阅读全帖
c********t
发帖数: 27
18
1)
B=`echo "scale=4;4/3"| bc`
echo $B
1.3333
2)
#include
getenv and setenv
man getenv
man setenv
Note: Do not modify strings returned from getenv; they are pointers to
data that belongs to the system.
Or If you want to look into it.
#include
#include
int main(int argc, char *argv, char *envp[]){
while(1){
printf("%s\n", envp++);
}//segfault here
}
p**o
发帖数: 3409
19
手写了一些C扩展,有些返回多重指针的函数不知道怎么用SWIG来包来供Python调用……
比如下面这个strsplit()函数,返回的是char**,怎么改才能让Python收到一个list (
of strings)?
http://www.swig.org/tutorial.html
我只是照tutorial简单地把函数声明抄进.i文件,Python中调用时返回的是

#include
#include
#include
/* Split an input string 'instr', using a set of given delimiters, to an
array of strings of at most 'maxparts' parts. */
char **strsplit (const char *instr, const char *delimiters, size_t maxparts)
{
char *... 阅读全帖
g*****e
发帖数: 766
20
来自主题: Programming版 - 请问这个C++程序有什么问题吗
#include
#include
template < class T >
class A
{
T a;
public:
void set( T const t_a ){ a = t_a; }
T const & get() { return a; }
};
int main( int, char ** ) {
int n_b(100);
A< int > * a_ptr;
if ( true ) {
A< int > b_a;
b_a.set( n_b );
a_ptr = &b_a;
}
std::cout << a_ptr->get() << std::endl;
return 0;
}
谢谢,还是就没问题了?
t**********y
发帖数: 374
21
来自主题: Programming版 - 简单的c code问题
#include
#include
int change (int x)
{
x += 5;
return x;
}
int main (){
int y =5;
change (y);
printf ("%d",y);
return 0;
}
------------------
第一次写C, 这个小程序, 我期望输出为10,但结果是5, 为什么? 多谢解释:)
G****u
发帖数: 51
22
有下面这段code, 为什么fun1()输出乱码, 而fun2()输出正确: ABC.
====== code ============
#include
int main() {
char *fun1(), *fun2();
printf("%s\n%s\n", fun1(), fun2());
return 0;
}
char *fun1() {
char str[]="ABC";
return (str);
}
char *fun2() {
char (*str)[]="ABC";
return (str);
}
p*********t
发帖数: 2690
23
fun1()在返回一个局部变量的地址,所以输出的是這個地址的值,因为fun1()的局部变
量在函数结束时消失,那个地址可能又被分配了新的值,所以是乱码。
要想输出abc,可以在fun1()的str设为static,这样即使fun1()函数结束,str[]还是在
内存存在。
char *fun1() {
static char str[]="ABC";
return (str);
}

有下面这段code, 为什么fun1()输出乱码, 而fun2()输出正确: ABC.
====== code ============
#include
int main() {
char *fun1(), *fun2();
printf("%s\n%s\n", fun1(), fun2());
return 0;
}
char *fun1() {
char str[]="ABC";
return (str);
}
char *fun2() {
char (*str)[]="ABC";
return (str);
... 阅读全帖
d****n
发帖数: 1637
24
来自主题: Programming版 - 10个包子请教一个简单的编程问题
递归的
#include
#include
void print_a(int a[], int n){
int i;
for(i=0;i printf("%d ", a[i]);
}
printf("\n");
}
void loop(int a[], int n, int N ){
if(n==0){print_a(a, N) ;return;}
int i;
for(i=0;i a[n-1]=i;
loop(a, n-1, N);
}
}
int main(){
int N=6;
int a[N] ;
loop( a, N, N);
}
a***n
发帖数: 538
25
来自主题: Programming版 - int F::*x = &F::x是什么意思?
完整的code
https://gist.github.com/3343011
#include
int main()
{
struct F {
int x;
} foo, *foo_ptr = &foo;
int F::*x = &F::x;
foo.*x = 42;
printf("%d\n", foo_ptr->*x);
}
怎么也看不明白第8行啊
a***n
发帖数: 538
26
来自主题: Programming版 - int F::*x = &F::x是什么意思?
#include
int main()
{
struct F {
int x;
} f1;
f1.x = 41;
int F::*px = &F::x;
F f2;
f2.x = 42;
printf("%d %d\n", f1.*px, f2.*px);
}
为什么f1.*px也是对的啊?
d****n
发帖数: 1637
27
来自主题: Programming版 - 请教一道题 (转载)
All data structure can be single array
my code 见笑了
#include
#include
int main( int argc, char *argv[]){
int i;
//当前的array index
int num=atoi(argv[1]);
//穷举出当先index所在level: i
int sum=0;
for(i=0;sum sum+= i*(i+1)/2 ;

int left,right;
//左面的child index
left=num+i-1;
//右面的 child index
right=num+i;
printf("num %d ; left %d ; right %d\n",num,left, r... 阅读全帖
d****n
发帖数: 1637
28
来自主题: Programming版 - 请教一道题 (转载)
又拓展了一下,给出parent link和buffed level computation
#include
#include
int *buff=NULL;
int buff_size=1024;
int buff_used=0;
int level(int query ){
while( buff[buff_used-1] {
if ( buff_size <=buff_used ){
buff_size<=1;
buff=(int *)realloc( buff,sizeof(int)*buff_size );
}
buff_used++;
buff[buff_used]=(buff_used+1 )*(buff_used+1+1)/2;
}
... 阅读全帖
d****n
发帖数: 1637
29
来自主题: Programming版 - C++ Segment Fault
献丑了,have fun!
#include
#include
#include
#include
#define IS_WHITE_SPACE(c ) ( isblank((c)))
char * replace_white_space( const char *source, size_t source_len){
size_t used=0, inc=0, allocated=source_len+1;
char *ret= (char *)malloc(sizeof(char)*allocated );
const char *s=source;
while(*s++){
(IS_WHITE_SPACE (*(s-1)))? (inc=3):(inc=1);
if ((used+=inc)>=allocated)
ret=(char *)realloc(ret, sizeof(char)*(alloc... 阅读全帖
t*******s
发帖数: 7
30
#include
#include // malloc ,free
#include //memcpy
typedef double data_t ;
typedef struct {
size_t dims; //number of dimensions
size_t *dim_define; //dim1=10, dim2=10, dim3=20, etc.
data_t *data; //one dimension storage
size_t size ;//size of (data) -optional
}matrix_t ;
matrix_t * matrix_new( size_t dims, size_t *dim_define)
{
size_t i, size=1;

for(i=0; i size*=dim_define[i];
}
matrix_t *ret=malloc( siz... 阅读全帖
j*****y
发帖数: 1071
31
来自主题: Programming版 - 关于 c malloc的一个问题
#include
#include
int main()
{
int * p = (int *)malloc(100);
printf("%d\n", *(p - 1));
return 0;
}
这个 code是想理解系统是怎么知道多少memory 该被释放的,当
我们调用 free的时候。 有的说是在 p-1的位置存储有总的内存的大小。
可是这里的输出是 105. 我觉得应该是 104 阿
多谢.
r**u
发帖数: 1567
32
来自主题: Programming版 - static initialization dependency c++
Thanks.
I tried the following code.
File1.c
int x = 1;
File2.c
#include
extern int x;
int y = x + 1;
int main() {
printf("x: %d y: %d\n", x, y);
}
If compile with gcc, it gives an error "initializer element is not constant"
. But it compile with g++. I guess in C it's not allow to initialize a
global variable from another variable. So no dependency problem in C.

file
m*******l
发帖数: 12782
33
fflush (NULL) flushes all stdio output stream
perror non buffered as I remembered
W**********4
发帖数: 322
34
WhatIfIWereU大牛认为,gcc -Wextra -Werror -c就会编译不通过
digua大神不相信他的两行C代码编译通不过
究竟谁更靠谱呢?让事实说话吧。
用 gcc -Wextra -Werror -c编译一下代码:
#include
main()
{
int a,max;
a=3;
max=0;
if(a>max);
max=a;
}
果然通不过,错误信息如下:
cc1: warnings being treated as errors
comma.c: In function 'main':
comma.c:8: error: suggest braces around empty body in an 'if' statement
如果去掉if()后面的分号, 顺利通过。
WhatIfIWereU的说法比较靠谱。
W**********4
发帖数: 322
35
WhatIfIWereU认为,gcc -Wextra -Werror -c就会编译不通过
digua不相信他的两行C代码编译通不过
究竟谁更靠谱呢?让事实说话吧。
用 gcc -Wextra -Werror -c编译一下代码:
#include
main()
{
int a,max;
a=3;
max=0;
if(a>max);
max=a;
}
果然通不过,错误信息如下:
cc1: warnings being treated as errors
comma.c: In function 'main':
comma.c:8: error: suggest braces around empty body in an 'if' statement
如果去掉if()后面的分号, 顺利通过。
WhatIfIWereU的说法比较靠谱。
c*******y
发帖数: 3529
36
~digua的说法:

~WaterDegree4的回复:
“C语言编程不怕少个分号” 这是真的吗?
看看以下代码:
#include
int main()
{
int pn,id,ps;
pn=0;
ps=25;
for(id=0;id<100;id++);
pn += ps;
return 0;
}
这段代码的本意是:用一个for循环做延迟,然后让pn累加25。
最后pn的结果是25.
如果for()后面少个分号,会怎样呢?
结果会是pn 被累加了100次,跟原来设想完全不一样了。
糟糕的是,编译器不会报错也不warning,即使Wextra Werror Wall全用上。
看来少个分号,照样可怕,照样编译器不报错,照样要进入debugging阶段
才能查出。
S***P
发帖数: 194
37
来自主题: Programming版 - c语言abort时怎么清理堆空间?
那我纳闷了,即使这样也不泄漏内存?那要free干啥呀?
#include
#include
int main (int argc, char* argv[])
{
char * buffer;
buffer = (char*) malloc (100000);
if (buffer==NULL) exit (1);
return 0;
}
g********e
发帖数: 131
38
来自主题: Programming版 - 问个简单的c程序
#include
int main(int argc, char* argv[])
{
int i, j, *p;
i = 25;
j = 100;
p = &i;
printf("%f\n", i/(*p));
printf("%f\n", (float)i/(*p));
return 0;
}
为什么第一个输出是0.000000?不是1.000000?
m********o
发帖数: 69
39
谢谢你的解答。
我也不知道用了哪些库文件,是指头文件吗?
#include "math.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
我把*.cpp加到源文件中,然后按了几下F7,就有了EXE
cpp也很简单,就是一百行左右的读取文本文件和简单计算。
有没有办法把dll都整合到EXE中,这样拷到任何一个电脑都能运行?
我是新手,问题可能有些小白。感谢指点。
w*****1
发帖数: 15
40
来自主题: Programming版 - A string replacement problem from leetcode
一个奇怪的现象。下面的code来自 http://leetcode.com/2010/11/microsoft-string-replacement-problem.html
我试了VS2010, VS2012. All get Access violation error on
if (matched)
*pSlow++ = 'X'; // <----error here
First-chance exception at 0x00AD14A3 in test.exe: 0xC0000005: Access
violation writing location 0x00AD586C.
读code和用debugger都看不出问题。 请哪位高人火眼金睛指点一下
#include
#include
#include
bool isMatch(char *str, const char* pattern) {
while (*pattern)
if (*str++ != *pattern++)
... 阅读全帖
c*******h
发帖数: 1096
41
刚google了一下,可以这样搞
#include
int f(int x, int y) {
return x+y;
}
int g(int (*Afun)(int x), int x) {
return Afun(x);
}
int main(void) {
int y = 100;
int (*Afun)(int);
Afun = ({ int $(int x){ return f(x,y); } $; });
int x = 20;
int z = g(Afun, x);
printf("z = %d\n", z);
}
gcc是work的,不过我换到intel的compiler就不work了
i****d
发帖数: 255
42
来自主题: Programming版 - 关于在C中定义常量
一个简单的小程序,给pi定义了两个常量,但结果不一样:
#include
#include
#define pi 4.0*atan(1.0)
#define VPI 3.1415926535897931e+0
int main()
{
printf(" pi = %22.16e VPI = %22.16e t1 = %22.16e t2 = %22.16e n", pi, VPI
, 1.5/pi, 1.5/VPI);
return 0;
}
结果是
pi = 3.1415926535897931e+00 VPI = 3.1415926535897931e+00 t1 = 2.
9452431127404310e-01 t2 = 4.7746482927568601e-01
说明这两个pi是有区别的。第二个总是对的,第一个时对时错。有高手给讲一下?
S*A
发帖数: 7142
43
我的机器没有Wei 的好,
但是相对结果还是可以看出来的。
原来的测试程序是严格顺序向后找, 虽然看上去
跳了 40 byte, 但是仍然小于 64 byte 的cache line
size. 但是从访问内存的次序来看是严格增加的。
这个是 cache 最爽的状态。
我改变了输入的次序,变成随机定票段,从输入数组
里面进来,其他的不变。构造输入数组的时间是刨去的。
程序里面 USE_RAND = 1 vs 0
仅仅变的是订票的次序,结果呢?
速度差了整整 4 倍。从 28M 暴减少到7M.当然实际订票
更接近与随机分布。谁排好了一个接一个定。
这就是为什么我会担心 IO 是瓶颈的问题。外部进来的数据,
全部都是 cache miss。这些纯计算的模拟还不能很好的代表真实
的负载情况。
程序如下:
比较快的机器建议增加 ITER 大小,使得总共运行时间超过几十秒。
#include
#include
#include
#define SEGMENTS 10000000
#define INPUTS 1000... 阅读全帖
n*****t
发帖数: 22014
44
来自主题: Programming版 - 狠偷懒狠偷懒的一个测试
我们蓝翔技校水平差,码的程序肯定错误百出,大家不许笑。
单进程,也不用锁了。5M 票,320M request,原始数据都是偷 memory 的,测试结果是
3 秒不到。request 前 2 bit 是 opcode,最后几位是 ticket ID。
1、我这个没搜空闲票,先声明一下。
2、IO 会多占一点时间,呵呵,不过估计也就多几秒的时间,懒得整太复杂了。
3、HW 就不提了,丢脸,唯一能透露的是 virtualpc
#include
#include
#include
#define SIZE 5*1024*1024
#define LOOPS 64
unsigned char tickets[SIZE];
unsigned long *reqs;
unsigned char *results;
int main() {
int i;
unsigned char op;
unsigned char *ticket;
unsigned long *... 阅读全帖
d****i
发帖数: 4809
45
来自主题: Programming版 - 一个dot net浮点运算的问题
有意思,同样的乘法用C的话,得到的结果完全一样:
#include
int main(int argc, char **argv)
{
double outcome4 = 12.6*0.11985;
double x = 12.6;
double y = 0.11985;
double outcome5 = x * y;
printf("outcome4=%10.8fn", outcome4);
printf("outcome5=%10.8fn", outcome5);
}
>outcome4=1.51011000
>outcome5=1.51011000
难道是.net的问题?
t****t
发帖数: 6806
46
来自主题: Programming版 - 一个dot net浮点运算的问题
我不懂C#, 不过很显然这是浮点精度不同的结果. 写了个小程序做试验:
#include
double mul(double a, double b); // return a*b, in another compilation unit
int main(int argc, char **argv)
{
printf("12.6 * 0.11985 = %20.18fn", mul(12.6, 0.11985));
printf("float(12.6 * 0.11985) = %20.18fn", (float)mul(12.6, 0.11985));
printf("12.6f * 0.11985 = %20.18fn", mul(12.6f, 0.11985));
printf("float(12.6f * 0.11985) = %20.18fn", (float)mul(12.6f, 0.11985));
printf("12.6 * 0.11985f = %20.18fn", mul(12.6, 0.11985f)... 阅读全帖
S*A
发帖数: 7142
47
来自主题: Programming版 - C10M 练习 step 1: 10M sockets
我觉得大家讨论很热情,
我们来做点练习吧,不要光说不练。
下面这个程序是暴露一些写 C10M 可能碰到的问题,
看看大家有没有神魔解决方法。如果有,请贴程序或者
脚本,方便他人重复实验.
如果实在没有人贴答案,我也可以公布我自己的。
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 1024*1024*10; i++) {
int s;
s = socket(PF_INET, SOCK_STREAM, 0);
if (s < 0) {
char buffer[1024];
snprintf(buffer, sizeof buffer, "socket #%d", i);
perror(buffer);
... 阅读全帖
S*A
发帖数: 7142
48
来自主题: Programming版 - C10M 练习2: 空TCP 连接,1M per 4G RAM
这个练习1 已经发现了,C10M 没有强壮的内存支持是
没戏的。单单是 kernel 部分就已经消耗很多内存了。
所以我们把目标调整一下,1M per 4G RAM。
这样 64G 内存就有可能实现 10M。
练习2 就是看看,我们如果保留 1M/4G 的空TCP
连接,可不可以。完全不往 TCP 里面发东西。就是
建立连接而已。这样也不存在 epoll 问题。
和实验1一样,我会发些拍脑瓜想出来的简单代码。
你直接用这个代码冲刺 1M/4G 会碰到些实际问题。
有兴趣的同学跟着做一下实验,看看有没有办法解
决这些问题。
BTW,我是实验出了 1M/4G (服务器方),所以是
有可能的。建立1M 连接还花了不少时间。
服务器方代码。端口是80, 大家可以自己改。
include
#include
#include
#include
#include
#include
#include
#include 阅读全帖
S*A
发帖数: 7142
49
来自主题: Programming版 - C10M 练习2: 空TCP 连接,1M per 4G RAM
拍脑瓜的简单客户端。假设端口是 80, 启动指定服务器 IP 地址,
不用域名。当然会碰到一个 IP 地址只能发出去 65K 个连接的限制。
如何用 ip alias 使用多个 IP 地址解决这个问题留给大家自己改。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void die(char *reason)
{
perror(reason);
exit(1);
}
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in... 阅读全帖
S*A
发帖数: 7142
50
来自主题: Programming版 - C10M 练习2: 空TCP 连接,1M per 4G RAM
这个练习1 已经发现了,C10M 没有强壮的内存支持是
没戏的。单单是 kernel 部分就已经消耗很多内存了。
所以我们把目标调整一下,1M per 4G RAM。
这样 64G 内存就有可能实现 10M。
练习2 就是看看,我们如果保留 1M/4G 的空TCP
连接,可不可以。完全不往 TCP 里面发东西。就是
建立连接而已。这样也不存在 epoll 问题。
和实验1一样,我会发些拍脑瓜想出来的简单代码。
你直接用这个代码冲刺 1M/4G 会碰到些实际问题。
有兴趣的同学跟着做一下实验,看看有没有办法解
决这些问题。
BTW,我是实验出了 1M/4G (服务器方),所以是
有可能的。建立1M 连接还花了不少时间。
服务器方代码。端口是80, 大家可以自己改。
include
#include
#include
#include
#include
#include
#include
#include 阅读全帖
首页 上页 1 2 3 4 5 6 7 8 9 10 (共10页)