下文将记录本文阅读此代码中遇到的名词解释和问题总结,其中会有对多篇他人文章的引用,致谢先。
====================================================================================
1 fork()
父进程创建一个子进程,调用fork()后就返回了,此进程继续执行;而新建的进程会copy父进程的上下文,然后继续执行。(两者之后独立)
http://blog.youkuaiyun.com/jason314/archive/2010/06/01/5640969.aspx
2 ssize_t
http://blog.youkuaiyun.com/winer632/archive/2009/01/08/3734503.aspx
http://hi.baidu.com/xiexin/blog/item/6df1d7ca9c590e46f21fe7f1.html
3 fd_set
http://blog.youkuaiyun.com/beyondjjw/archive/2007/09/06/1774873.aspx
使用select函数的过程一般是:先调用宏FD_ZERO将指定的fd_set清零,然后调用宏FD_SET将需要测试的fd加入fd_set,接着调用函数select测试fd_set中的所有fd,最后用宏FD_ISSET检查某个fd在函数select调用后,相应位是否仍然为1。
以下是一个测试单个文件描述字可读性的例子:
int isready(int fd)
{
int rc;
fd_set fds;
struct tim tv;
FD_ZERO(&fds);
FD_SET(fd,&fds);
tv.tv_sec = tv.tv_usec = 0;
rc = select(fd+1, &fds, NULL, NULL, &tv);
if (rc < 0) //error
return -1;
return FD_ISSET(fd,&fds) ? 1 : 0;
}
4 socket编程
TCP:
服务端:socket->bind->listen->accept->recv
客户端:socket->connect->send
UDP: recvfrom, sendto , 没有bind,listen
http://blog.163.com/a3563@126/blog/static/54675706200872723659838/
http://blog.youkuaiyun.com/sws9999/archive/2010/03/08/5355528.aspx
5 文件描述符
http://blog.youkuaiyun.com/seraphsky/archive/2007/10/30/1856191.aspx
值:
http://baike.baidu.com/view/1303430.htm
6 va_list va_start va_end 宏
【1当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表
void foo(...);
void foo(parm_list,...);2:函数参数的传递原理:函数参数是以数据结构:栈的形式存取,从右至左入栈. 3获取省略号指定的参数:在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。4 va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。】
http://blog.youkuaiyun.com/ast_224/archive/2009/02/18/3906167.aspx
http://blog.youkuaiyun.com/zxianrong/archive/2009/01/04/3706405.aspx
7 http://www.lupaworld.com/thread-29876-1-1.html
用gcc编译c程序的时候 经常会出现 implicit declaration of function '...' 的warning 偶经过这几天的经验,发现主要有2种情况会产生这种warning 7.1 没有把函数所在的c文件生成.o目标文件 7.2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明 |
8 把源文件放入eclipse-cdt中分开编译运行,服务端:运行configure(自定义)ok,客户端报错:undefined reference to 'pthread_create'
解决:
http://blog.youkuaiyun.com/llqkk/archive/2008/08/31/2854558.aspx
问题原因:
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。
问题解决:
在编译中要加 -lpthread参数
gcc thread.c -o thread -lpthread
thread.c为你些的源文件,不要忘了加上头文件#include<pthread.h>
如果是在eclipse中build,也可为eclipse配置参数:
http://blog.tianya.cn/blogger/post_read.asp?BlogID=797111&PostID=23966420
http://www.linuxdiyf.com/bbs/thread-83304-1-1.html
(可悲的是,我使用以上方法都没有获得成功,只要采用9中的方法,让eclipse来运行我自己的makefile,在其中我自己加上了-pthread参数)
9 eclipse编译 原有eclipse的方法:
New ->
C++ Project -> next
输入 Project name,你也可以指定在其它位置。 选择 Makefile project, Ohter toolchain,然后Next,next完成,如果有makefile文件,则会自动使用make all来build.
(自己定义make命令:Project ->Properties ->C/C++ Build ->右边 Use default build command)
http://hi.baidu.com/yuan07804017/blog/item/f3b2a21cd8b8fac6a68669e4.html
通过以上调整,终于在eclipse中将客户端生成成功(服务端不存在pthread问题,因此没经过波折就ok了),
10 同时通过run as configuration启动Botserv和bot,两者链接成功,但是报错说无法打开/db/user,明天再调试。(但是直接shell下运行倒是美文题,eclipse的打开文件权限问题?)
11 后来发现botserv中的很多函数都是暂时没有使用的,如与用户相关的函数等,而且这些函数在bot客户端函数中也有一模一样的存在。botserver的大概了解就到这里。