博文

用宏区分操作系统和编译器(转)(2013-05-23 14:48:00)

摘要: 原文地址: http://blog.chinaunix.net/uid-24520020-id-2976765.html   编码的时候经常要用到条件编译,每次都到网上去查比较浪费时间,今天总结一下以备后用
编译器 GCC
#ifdef __GNUC__ #if __GNUC__ >= 3 // GCC3.0以上 Visual C++
#ifdef _MSC_VER(非VC编译器很多地方也有定义) #if _MSC_VER >=1000 // VC++4.0以上 #if _MSC_VER >=1100 // VC++5.0以上 #if _MSC_VER >=1200 // VC++6.0以上 #if _MSC_VER >=1300 // VC2003以上 #if _MSC_VER >=1400 // VC2005以上 Borland C++
#ifdef __BORLANDC__ UNIX UNIX
#ifdef __unix
or
#ifdef __unix__ Linux
#ifdef __linux
or
#ifdef __linux__ FreeBSD
#ifdef __FreeBSD__ NetBSD
#ifdef __NetBSD__ Windows 32bit
......

阅读全文(3207) | 评论:1

非阻塞Connect对于select时应注意问题(转)(2012-11-01 12:09:00)

摘要:对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后必须调用bind绑定到一个指定的地址,然后调用int listen(int sockfd, int backlog);进行监听。此时服务器socket允许客户端进行连接,backlog提示没被accept的客户连接请求队列的大小,系统决定实际的值,最大值定义为SOMAXCONN在头文件<sys/socket.h>里面。如果某种原因导致服务器端进程未及时accpet客户连接而导致此队列满了的话则新的客户端连接请求被拒绝(在工作中遇到过此情况,IONA ORBIX(CORBA中间件)由于没有配置超时时间结果在WIFI网络中传输数据出现异常情况一直阻塞而无机会调用accept接受新的客户请求,于是最终队列满导致新的客户连接被拒绝)。

  调用listen之后当有客户端连接到达的时候调用int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);接受客户端连接建立起连接返回用于连接数据传送的socket描述符,进行监听的socket可以用于继续监听客户端的连接请求,返回的socket描述符跟监听的socket类型一致。如果addr不为NULL,则客户端发起连接请求的socket地址信息会通过addr进行返回。如果监听的socket描述符为阻塞模式则accept一直会阻塞直到有客户发起连接请求,如果监听的socket描述符为非阻塞模式则如果当前没有可用的客户连接请求,则返回-1(errno设置为EAGAIN)。可以使用select函数对监听的socket描述符进行多路分离,如果有客户连接......

阅读全文(5282) | 评论:0

linux下递归删除目录下所有指定类型文件(2012-07-07 17:38:00)

摘要: find . -name '*.exe' -type f -print -exec rm -rf {} \; (1) "."    表示从当前目录开始递归查找 (2) “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件 (3) " -type f "查找的类型为文件 (4) "-print" 输出查找的文件目录名 (5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。      exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号 ......

阅读全文(4956) | 评论:0

AI网站(2012-07-07 09:31:00)

摘要:http://www.aisharing.com/......

阅读全文(1549) | 评论:0

distcc(2012-07-04 19:33:00)

摘要:ttp://forums.gentoo.org/viewtopic.php?t=66930......

阅读全文(1377) | 评论:0

cygwin 下如何建立用户账户(2012-07-04 17:28:00)

摘要:cygwin 下如何建立用户账户.(域环境)
1. 在域里建立一个账户123456
2. 在需要ssh登录的主机上,配置好cygwin和sshd.
3.使用mkpasswd -l > /etc/passwd 来建立local password条目,别忘记先备份一下.
3.是用mkpasswd -d -u 123456 >> /etc/passwd 在passwd里追加一个域用户. -d 表示domain
4.如果这个时候登录,不会成功,因为里面gid还不在group文件里呢.需要这样mkgroup -d >> /etc/group,把用户所在的组gid也添加进去.
5.其实意思就是,利用mkpasswd来添加用户,可以是本地的也可以是域里的,利用mkgroup添加用户相应的组信息能识别.
6.域用户如果在本地组里,也就是说混合用也可以.
......

阅读全文(2236) | 评论:0

分布式编译(转)(2012-07-04 16:15:00)

摘要: http://blog.chinaunix.net/uid-9012903-id-2011523.html http://blog.csdn.net/chenee543216/article/details/4339577 http://wenku.baidu.com/view/79925c36f111f18583d05a29.html   ......

阅读全文(1266) | 评论:0

分布式编译(转)(2012-07-04 16:02:00)

摘要: 今天写netsurf的一篇blog,顺便把之前做的的一个东西给写了,写blog真的是蛮辛苦的一件事。。。就都今天苦了吧,呵呵

用distcc,ccache是两年前,项目结束的空隙,自己拿来玩的。当时是在arm上做的一个很大的工程,当时的PC,只编UI部分就需要3个小时,这也是为什么后来我用分布式编译的原因。那个项目是c++加adobe的flash,仿iphone做一款很炫的手机,其中UI全部用flash做,效果很炫,速度就比较差了。后来,我也试过在arm9261(200MHz)上用gnash播放flash,效果确实比较一般。言归正传,还是来说下分布式编译,其实它的原理很简单,把c文件在本机预编译,然后发到其他主机进行编译,编译的后的o文件再传回本机,最后在本机进行链接。没有看过代码,猜测对于每个编译的c文件对应产生一个编译任务,下发到其他机器或本机,最终完成编译。

我们的环境是ADS1.2+cygwin,用tcc,tcpp进行编译。distcc,ccache本来是在cygwin上直接装的的,但后来在使用时发现会碰到一些问题。所以从源码编译了。distcc产生的中间文件是.i的格式,tcc无法识别该文件类型,需要修改源码。就一句话,网上可以搜到的。if(dcc_getenv_bool("DISTCC_KEEP_FILETYPE", 1)).然后,./configure; make; make install。ccache问题是一样的,无法识别.i文件,修改ccache.c,把中间文件i/ii改为c/cpp,一样的方式安装。

然后要对安装的东西进行配置,我当时的配置如下,10.19.5.0网段的主机都可以做协同编译的主机,当然ads的licence只有20个啦。此处目录设置至关重要,tcc无法识别cygwin环境,tcc -c /cygdriver/c/a.c,  tcc无法读取文件,错误码为C3052E。利用了cygwin既可以win32的路径,又可以识别posix路径。
export DISTCC_LOG='/var/log/distcc.log'
export DISTCC_HOSTS='localhost 10.19.5.0/24......

阅读全文(2982) | 评论:0

打开21端口(2012-07-02 16:06:00)

摘要:1。安装vsftp,启动ftp服务即可以开放21端口。
   yum install vsftpd

  /etc/init.d/vsftpd start

2。修改vsftp的配置文件
  vi /etc/vsftpd/vsftpd.conf
      anonymous_enable=YES
      anon_upload_enable=YES
  添加以上选项即可使服务支持匿名上传

3。修改文件系统权限
   chmod 777 /var/ftp/pub/

4。重启服务即可。

......

阅读全文(1338) | 评论:0

bat命令(2011-12-13 14:35:00)

摘要:在Unix环境下,命令行或者shell中sleep和kill是常见的动作,在Windows的.bat文件中处理类似的任务就不那么直接了,备忘如下:

[sleep]
ping 127.0.0.1 -n 需要的秒数+1 -w 1000 > nul

[kill]
taskkill /f /im "进程名(如notepad.exe)"
taskkill /f /fi "WINDOWTITLE eq notepad*"

其中/f表示强制,/im表示image镜像名(可执行文件名),/fi表示filter,后面跟表达式,比如这里的"窗体标题等于notepad*",支持wildcast通配符。
......

阅读全文(1685) | 评论:0