- 论坛徽章:
- 0
|
1、typedef的两种用法;2、callback函数;3、char与unsigned char;socket基础知识。
1、typedef的两种用法:
a、typedef struct{
int a;
int b;
}MYTYPE;
MYTYPE tmp;
typedef unsigned long UL;
b、typedef int(*MYFUN)(int,int);
2、callback函数:
[color="#555555"]有函数
func1( int a, callback b , void *data);
func2是回调函数。
如下调用
int *data
int c()
{
func1(a,func2,data)
d();
}
fun1完成后, func2 并没有被调用, 等事件发生后才被调用。
上面的说明完全是实际程序的情况。
因为我没有fun1的源代码, 我想问的是此时c 函数所在的进程 和 fun2所在的进程是同一
进程么, 如果是,那么系统是如何实现的,fun2运行的时候,会打断正在运行的d()么。
如果不是,那么为什么 fun2还可以使用 全局变量 data.和c共享堆栈(请注意,fun1决没有生成子进程)。希望高手能帮助解答 谢谢
[color="#333333"] 回调函数分同步回调和异步回调,具体情况又分几种,用户层回调和系统层回调,需要具体分析^_^
根据你提供的信息我还分析不出来,抱歉!!
实现原理就是:某个进程调用你的fun2,这个进程可能是系统进程,也可能就是你应用程序的进程.
如果是系统进程的话,则由于系统层权利很大,可以访问所有资源,能访问你的全局变量等不奇怪.
如果是你自己的进程,则当然可以访问你自己的变量.
同步回调是跟你的fun1一起返回的,类比c++的sort函数
异步回调则是fun1返回后,fun2也可能被调用,类比系统的hook函数
3、char与unsigned char
char的表数范围:
unsigned char的表数范围:
有无符号啊,char是否有符号我印象中是编译器相关的,但是实际上大多数编译器都是带符号的。
有无符号的区别是很大的, 比如这样的比较
char a = getc(stdin);
if(a == 255)
{
foo();
}
foo 将永远不会被调用。
char就是单字节数据 , 放数据值的。有效数据位是8位
无符号的有效数据位为7位,第一位为符号位
char -127~128
unsigned char 0~255
楼上说的对,“ 如果不进行数字相关的操作,关系倒不大”。但如果用于计算则应当小心符号的问题。
3、socket编程基础:
socket()
SOCKET PASCAL FAR socket (int af int type,int protocol);
af:AF_UNIX,AF_INET,AF_NS;
type:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW;
protocol:通常置0;
bind()
int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR*name,int namelen);
如果有错误发生返回0,否则返回SOCKET_ERROR;
struct sockaddr_in{
short sin_family;AF_NET
u_short sin_port;16位端口号,网络字节顺序
struct in_addr sin_addr;32位ip地址,网络字节顺序
char sin_zero[8];保留
}
connet()
int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen)
成功返回0,否则返回SOCKET_ERROR;
accept()
SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR*addr,int FAR *addrlen)
成功返回SOCKET,否则返回IVALID_SOCKET;
listen()
int PASCAL FAR listen(SOCKET s,int backlog);
成功返回0,否则返回SOCKET_ERROR;
[color="#555555"]
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11897/showart_59375.html |
|