分类存档: C/C++

FastCGI开发学习

1. 下载fastcgi开发包,编译安装

http://www.fastcgi.com/dist/fcgi-current.tar.gz

wget http://www.fastcgi.com/dist/fcgi-current.tar.gz
tar zvzf fcgi-current.tar.gz
cd fcgi-current
./configure
make
make install

2. 下载spawn-fcgi,编译安装

http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz

wget http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz
tar zxvf spawn-fcgi-1.6.0.tar.gz
cd spawn-fcgi-1.6.0
./configure
make
make install

3. 编写测试的c fastcgi代码,存为 hello.c

#include 
int main( int argc, char *argv[] )
{
    while( FCGI_Accept() >= 0 ) {
        printf( "Content-Type: text/plain\n\n" );
        printf( "Hello FastCGI\n" );
    }
    return 0;
}

编译c源文件,运行时有可能会报找不到lib包,这里我复制了一份,也可以做一个软链接。我这里用的是64位的机器,所以复制到了:/usr/lib64,32位的用:/usr/lib。

gcc -o hello hello.c -lfcgi

4. 修改nginx.conf配置文件,重新启动nginx

server {
            listen   80;
            server_name _;

            location / {
                  root   /home/user/www;
                  index  index.html;
                  fastcgi_pass 127.0.0.1:9000;
            }
}

5. 启动hello

spawn-fcgi -a127.0.0.1 -p9000 -n ./hello

6. 访问nginx服务器,浏览器就会输出:Hello FastCGI

一个nginx c fastcgi学习环境搭建完毕。

fastcgi 开发学习资料:

FastCGI中文参考手册

http://man.lupaworld.com/content/develop/Perl/FastCGI_handbook_cn.pdf

Nginx下配置FastCGI

http://202.108.59.116/docs/Nginx%CF%C2%C5%E4%D6%C3FastCGI.pdf

Linux中C/C++头文件说明

1、 Linux中一些头文件的作用:
<assert.h>:ANSI C。提供断言,assert(表达式)
<glib.h>:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包 含<glib.h>
<dirent.h>:GCC。文件夹操作函数。struct dirent,struct DIR,opendir(),closedir(),readdir(),readdir64()等<ctype.h>:ANSI C。字符测试函数。isdigit(),islower()等
<errno.h>:ANSI C。查看错误代码errno是调试程序的一个重要方法。当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较 麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h
<getopt.h>:处理命令行参数。 getopt_r()

2、linux常用头文件如下:
POSIX标准定义的头文件
<dirent.h>        目录项
<fcntl.h>         文件控制
<fnmatch.h>    文件名匹配类型
<glob.h>    路径名模式匹配类型
<grp.h>        组文件
<netdb.h>    网络数据库操作
<pwd.h>        口令文件
<regex.h>    正则表达式
<tar.h>        TAR归档值
<termios.h>    终端I/O
<unistd.h>    符号常量
<utime.h>    文件时间
<wordexp.h>    字符扩展类型
————————-
<arpa/inet.h>    INTERNET定义
<net/if.h>    套接字本地接口
<netinet/in.h>    INTERNET地址族
<netinet/tcp.h>    传输控制协议定义
————————-
<sys/mman.h>    内存管理声明
<sys/select.h>    Select函数
<sys/socket.h>    套接字借口
<sys/stat.h>    文件状态
<sys/times.h>    进程时间
<sys/types.h>    基本系统数据类型
<sys/un.h>    UNIX域套接字定义
<sys/utsname.h>    系统名
<sys/wait.h>    进程控制
——————————
POSIX定义的XSI扩展头文件
<cpio.h>    cpio归档值
<dlfcn.h>    动态链接
<fmtmsg.h>    消息显示结构
<ftw.h>        文件树漫游
<iconv.h>    代码集转换使用程序
<langinfo.h>    语言信息常量
<libgen.h>    模式匹配函数定义
<monetary.h>    货币类型
<ndbm.h>    数据库操作
<nl_types.h>    消息类别
<poll.h>    轮询函数
<search.h>    搜索表
<strings.h>    字符串操作
<syslog.h>    系统出错日志记录
<ucontext.h>    用户上下文
<ulimit.h>    用户限制
<utmpx.h>    用户帐户数据库
—————————–
<sys/ipc.h>    IPC(命名管道)
<sys/msg.h>    消息队列
<sys/resource.h>资源操作
<sys/sem.h>    信号量
<sys/shm.h>    共享存储
<sys/statvfs.h>    文件系统信息
<sys/time.h>    时间类型
<sys/timeb.h>    附加的日期和时间定义
<sys/uio.h>    矢量I/O操作
——————————
POSIX定义的可选头文件
<aio.h>        异步I/O
<mqueue.h>    消息队列
<pthread.h>    线程
<sched.h>    执行调度
<semaphore.h>    信号量
<spawn.h>     实时spawn接口
<stropts.h>    XSI STREAMS接口
<trace.h>     事件跟踪

3、 C/C++头文件一览
C
#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <iso646.h>        //对应各种运算符的宏
#include <limits.h>    //定义各种数据类型最值的常量
#include <locale.h>    //定义本地化C函数
#include <math.h>     //定义数学函数
#include <setjmp.h>        //异常处理支持
#include <signal.h>        //信号机制支持
#include <stdarg.h>        //不定参数列表支持
#include <stddef.h>        //常用常量
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类

传统C++
#include <fstream.h>    //改用<fstream>
#include <iomanip.h>    //改用<iomainip>
#include <iostream.h>   //改用<iostream>
#include <strstrea.h>   //该类不再支持,改用<sstream>中的stringstream
————————————————————————————————

标准C++
#include <algorithm>    //STL 通用算法
#include <bitset>     //STL 位集容器
#include <cctype>          //字符处理
#include <cerrno>      //定义错误码
#include <cfloat>     //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits>     //定义各种数据类型最值的常量
#include <clocale>     //定义本地化函数
#include <cmath>      //定义数学函数
#include <complex>     //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio>      //定义输入/输出函数
#include <cstdlib>     //定义杂项函数及内存分配函数
#include <cstring>     //字符串处理
#include <ctime>      //定义关于时间的函数
#include <cwchar>      //宽字符处理及输入/输出
#include <cwctype>     //宽字符分类
#include <deque>      //STL 双端队列容器
#include <exception>    //异常处理类
#include <fstream>     //文件输入/输出
#include <functional>   //STL 定义运算函数(代替运算符)
#include <limits>      //定义各种数据类型最值常量
#include <list>      //STL 线性列表容器
#include <locale>          //本地化特定信息
#include <map>       //STL 映射容器
#include <memory>          //STL通过分配器进行的内存分配
#include <new>             //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip>     //参数化输入/输出
#include <ios>       //基本输入/输出支持
#include <iosfwd>     //输入/输出系统使用的前置声明
#include <iostream>     //数据流输入/输出
#include <istream>     //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>     //基本输出流
#include <queue>      //STL 队列容器
#include <set>       //STL 集合容器
#include <sstream>     //基于字符串的流
#include <stack>      //STL 堆栈容器
#include <stdexcept>    //标准异常类
#include <streambuf>    //底层输入/输出支持
#include <string>     //字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>     //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>     //STL 动态数组容器
————————————————————————————————

C99增加的部分
#include <complex.h>   //复数处理
#include <fenv.h>    //浮点环境
#include <inttypes.h>  //整数格式转换
#include <stdbool.h>   //布尔环境
#include <stdint.h>   //整型环境
#include <tgmath.h>   //通用类型数学宏

python 调用so dll动态链接库

ctypes使得python能够直接调用c语言开发的动态链接库,非常强大。
为了使用CTypes,你必须依次完成以下步骤:
* 编写动态连接库程序
* 载入动态连接库
* 将Python的对象转换为ctypes所能识别的参数
* 使用ctypes的参数调用动态连接库中的函数

一、Windows下使用Python的ctypes调用Dll动态链接库

  1. 编写dll文件
  2. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目,用程序类型选择DLL………
    调用方式见Linux调用方式。

二、Linux下使用Python的ctypes调用so动态链接库

  1. 编写so文件
  2. //test.h
    #include   "stdio.h"
    
    void test();
    float add(float, float);
    //test.c
    #include "test.h"
    
    void test()
    {
    	printf("Hello Dll...\n");
    }
    
    float add(float a, float b)
    {
        return a + b;
    }
    gcc -fPIC -shared test.c -o libtest.so
    
    #-fPIC  编译成位置无关代码,必须  不然你的程序在别的地方肯可能运行不了
    #-shared  当然是说要编译成共享库了
  3. Python调用so动态链接库
  4. #!/usr/bin/env python
    # -*-coding:UTF-8-*-
    
    print "sss"
    
    from ctypes import *
    
    test = cdll.LoadLibrary("./libtest.so")
    
    test.test()
    
    add = test.add
    add.argtypes = [c_float, c_float] # 参数类型,两个float(c_float内ctypes类型)
    add.restype = c_float
    
    print add(1.2, 19.2)

发的

eclipse 函数编译时报错:undefined reference to `pthread_create’

Eclipse + CDT:

pthread_create函数编译时报错:undefined reference to `pthread_create’

undefined reference to `pthread_create’
undefined reference to `MD5′

由于pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,在编译中要加 -lpthread参数。

例如:在加了头文件#include 之后执行 pthread.c文件,需要使用如下命令:

gcc thread.c -o thread -lpthread

这种情况类似于
的使用,需在编译时加 -m 参数。

+++++++++
Linux上编译pthread程序,默认会出错。如题。原因如下。

-pthread
Add support for multithreading using the POSIX threads library.
This option sets flags for both the preprocessor and linker. It
does not affect the thread safety of object code produced by the
compiler or that of libraries supplied with it. These are HP-UX
specific flags.

所以如果在gcc的编译中(更准确的说是链接中)没有启动pthread的话,就会出现如下的链接错误。
pthread_test.c:(.text+0x8a): undefined reference to `pthread_create’
collect2: ld returned 1 exit status

另外一个参数-lpthread也能起到同样的作用。所以可以看出-pthread的本质应当时引入了thread对应的library。默认情况下,pthread对应的library在gcc编译链接中是不会被引入的。
所以 gcc -o backupfile backupfiles.c -pthread

出现如下错误:
undefined reference to ‘pthread_create’
undefined reference to ‘pthread_join’

问题原因:
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。

问题解决:
在编译中要加 -lpthread参数
gcc thread.c -o thread -lpthread
thread.c为你些的源文件,不要忘了加上头文件#include

+++++++++

eclipse
解决方法如下:
Project->Properties->C/C++ Build->Settings->GCC C++ Linker->Libraries
在Libraries(-l)中添加pthread即可
在Libraries(-l)中添加crypto即可