??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产99国产精偷,亚洲国产成人久久一区WWW,久久天天躁狠狠躁夜夜96流白浆 http://www.shnenglu.com/tankzhouqiang/category/16135.htmlzh-cnTue, 08 Jan 2013 15:02:30 GMTTue, 08 Jan 2013 15:02:30 GMT60【操作系l】Linux性能监控——CPU、Memory、IO、NetworkQ{载)http://www.shnenglu.com/tankzhouqiang/archive/2012/12/26/196699.html周强周强Wed, 26 Dec 2012 14:02:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2012/12/26/196699.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/196699.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2012/12/26/196699.html#Feedback0http://www.shnenglu.com/tankzhouqiang/comments/commentRss/196699.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/196699.html阅读全文

周强 2012-12-26 22:02 发表评论
]]>
top命o(h)(转蝲)http://www.shnenglu.com/tankzhouqiang/archive/2012/08/28/188551.html周强周强Tue, 28 Aug 2012 12:42:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2012/08/28/188551.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/188551.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2012/08/28/188551.html#Feedback0http://www.shnenglu.com/tankzhouqiang/comments/commentRss/188551.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/188551.html阅读全文

周强 2012-08-28 20:42 发表评论
]]>
技巧:(x)多共享动态库中同名对象重复析构问题的解决Ҏ(gu)(转蝲)http://www.shnenglu.com/tankzhouqiang/archive/2012/03/02/166985.html周强周强Fri, 02 Mar 2012 08:04:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2012/03/02/166985.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/166985.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2012/03/02/166985.html#Feedback0http://www.shnenglu.com/tankzhouqiang/comments/commentRss/166985.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/166985.htmlLinux 支持的共享程序库Q?strong>lib*.soQ技术不仅能够有效利用系l资源,而且q对E序设计带来了很大的便利性、通用性等Q因此被各种U别的应用系l广泛采用?动态链接的׃n库是在加载应用程序时被加载的Q而且它与应用E序是在q行时绑定的Q通过动态链接器Q将动态共享库映射q应用程序的可执行内存中Q动态链接)Q在启动应用E序Ӟ动态装载器所需的共享目标库映射到应用程序的内存Q动态装载)?/p>

在通常情况下,׃n库都是通过使用附加选项 -fpic ?nbsp;-fPIC q行~译Q从目标代码产生位置无关的代码(Position Independent CodeQPICQ,使用 -shared选项目标代码放q共享目标库中。位|无关代码需要能够被加蝲C同进E的不同地址Qƈ且能得以正确的执行,故其代码要经q特别的~译处理Q位|无关代码(PICQ对帔R和函数入口地址的操作都是采用基于基寄存器(base registerQBASE+ 偏移量的相对地址的寻址方式。即使程序被装蝲到内存中的不同地址Q即 BASE g同,而偏U量是不变的Q所以程序仍然可以找到正的入口地址或者常量?/p>

然而,当应用程序链接了多个׃n库,如果在这些共享库中,存在相同作用域范围的同名静态成员变量或者同?( 非静?) 全局变量Q那么当E序讉K完静态成员变量或全局变量l束析构Ӟ׃某内存块?double free ?x)导?core dumpQ这是由?Linux ~译器的~陷造成的?/p>

应用场景原型

该问题源于笔者所从事的开发项目:(x)IBM Tivoli Workload Scheduler (TWS) LoadLeveler?strong>LoadLeveler?nbsp;IBM在高性能计算Q?strong>High Performance ComputingQHPCQ领域的一ƾ作业调度Y件。它主要分ؓ(f)两个大的模块Q分别是调度模块QschedulerQ和资源理模块Qresource mangerQ?两个模块中分别含有关于配|管理功能的׃n库,׃某些配置理选项Z模块所共同采用Q所以两模块之间׃n了部分源文g代码Q其中包含有同名的类静态成员?/p>

可以通过以下单的模型q行描述Q?/p>
?1. 应用场景
囄CZ 

对应的各模块代码片段如下图所C:(x)


?2. 应用场景模拟代码
囄CZ 

其中Qtest.c 是主E序Q包含有两个头文Ӟ(x)api1.h ?api2.hQ头文g api1.h 包含头文?lib1/lib.h 和一功能函数 func_api1()Qapi2.h 包含头文?lib2/lib.h 和一功能函数 func_api2()Q目?lib1 ?lib2 下的源文件分别编译生成共享库 lib1.so ?lib2.so。同Ӟ头文?lib1/lib.h ?lib2/lib.h 链接到同一׃n文g lib.h。在文g lib.h 中定义有一静态成员变?#8220;static std::vector<int> vec_int”?/p>

回页?/a>

功能函数与各静态成员函C码清?/span>

功能函数 func_api1() ?func_api2() 的实现类|通过调用静态成员函数达到访问静态成员变?nbsp;vec_int的目的:(x)


清单 1. 功能函数 func_api1(int)
          void func_api1(int i) {      printf("%s.\n", __FILE__);       A::set(i);      A::print();      return;   }      

静态成员函?A::set() ?A::print() 的实现如下:(x)


清单 2. 静态成员函?A::set(int)
          void A::set(int num) {      vec_int.clear();      for (int i = 0; i < num; i++) {          vec_int.push_back(i);      }      return;   }      


清单 3. 静态成员函?A::print()
          void A::print() {      for (int i = 0; i < vec_int.size(); i++) {          printf("vec_int[%d] = %d, addr: %p.\n", i, vec_int[i], &vec_int[i]);      }      printf("vec_int addr: %p.\n", &vec_int);      return;   }      

A::set() 寚w态成?nbsp;vec_intq行赋值操作,?A::print() 则打印其中的g当前的内存地址?/p>

回页?/a>

q行l果

如果两个׃n库是通过选项 -fpic?nbsp;-fPIC~译的话Q运行程?testQ输出如下:(x)


清单 4. 选项 -fPIC 的测试结?/strong>
          $ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH   $ g++ -g -o lib1.so -fPIC-rdynamic -shared lib1/lib.c   $ g++ -g -o lib2.so -fPIC-rdynamic -shared lib2/lib.c   $ g++ -g -o test -L./ -l1 -l2 test.c   $ ./test  api1.h.   vec_int[0] = 0, addr: 0x9cbf028.   vec_int[1] = 1, addr: 0x9cbf02c.   vec_int[2] = 2, addr: 0x9cbf030.   vec_int[3] = 3, addr: 0x9cbf034.   vec_int addr: 0xe89228.   *** glibc detected *** ./test: double free or corruption (fasttop): 0x09cbf028***   ======= Backtrace:=========   /lib/libc.so.6[0x2b2b16]   /lib/libc.so.6(cfree+0x90)[0x2b6030]   /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x5d1731]   ./lib1.so(_ZN9__gnu_cxx13new_allocatorIiE10deallocateEPij+0x1d)[0xe88417]         ./lib1.so(_ZNSt12_Vector_baseIiSaIiEE13_M_deallocateEPij+0x33)[0xe88451]         ./lib1.so(_ZNSt12_Vector_baseIiSaIiEED2Ev+0x42)[0xe8849a]         ./lib1.so(_ZNSt6vectorIiSaIiEED1Ev+0x60)[0xe8850c]  ./lib2.so[0x961d6c]   /lib/libc.so.6(__cxa_finalize+0xa9)[0x275c79]   ./lib2.so[0x961c34]   ./lib2.so[0x962d3c]   /lib/ld-linux.so.2[0x23a7de]   /lib/libc.so.6(exit+0xe9)[0x2759c9]   /lib/libc.so.6(__libc_start_main+0xe4)[0x25fdf4]   ./test(__gxx_personality_v0+0x45)[0x80484c1]   ======= Memory map:========   ......   00960000-00963000 r-xp 00000000 00:1b 7668734    ./lib2.so   00963000-00964000 rwxp 00003000 00:1b 7668734    ./lib2.so   00970000-00971000 r-xp 00970000 00:00 0          [vdso]   00e86000-00e89000 r-xp 00000000 00:1b 7668022    ./lib1.so   00e89000-00e8a000 rwxp 00003000 00:1b 7668022    ./lib1.so  08048000-08049000 r-xp 00000000 00:1b 7668748    ./test   08049000-0804a000 rw-p 00000000 00:1b 7668748    ./test   09cbf000-09ce0000 rw-p 09cbf000 00:00 0          [heap]  ......   Abort(coredump)   $      

从程序的输出直观的看刎ͼcore 产生是由于堆内存区域Q?strong>09cbf000-09ce0000Q中起始地址?nbsp;0x09cbf028的内存区被释放了两次D的,该地址正式静态成员变?nbsp;vec_int的第一个元素的地址?/p>

Z么会(x)出现同一块内存区Q被释放两次的情形呢Q?/p>

回页?/a>

原因分析

我们知道Q静态成员变量与全局变量cMQ都采用了静态存储方式。对于加了选项 -fpic?nbsp;-fPIC的共享库Q这些变量的地址都存攑֜该共享库的全局偏移表(Global Offset TableQGOTQ中?/p>

通过 objdump或?nbsp;readelf命o(h)分析׃n?nbsp;lib1.soQ结果如下:(x)


清单 5. objdump 分析׃n?lib1.so 的输?/strong>
          $ objdump -x -R lib1.so    lib1.so:     file format elf32-i386   ......   Sections:   Idx Name          Size      VMA       LMA       File off  Algn    0 .gnu.hash     000001e8  000000d4  000000d4  000000d4  2**2                    CONTENTS, ALLOC, LOAD, READONLY, DATA   ......   18 .dynamic      000000d8  0000301c  0000301c  0000301c  2**2                    CONTENTS, ALLOC, LOAD, DATA   19 .got          00000014  000030f4  000030f4  000030f4  2**2                   CONTENTS, ALLOC, LOAD, DATA   20 .got.plt      00000114  00003108  00003108  00003108  2**2                    CONTENTS, ALLOC, LOAD, DATA   ......   DYNAMIC RELOCATION RECORDS   OFFSET   TYPE              VALUE   ......   000030f4 R_386_GLOB_DAT    __gmon_start__   000030f8 R_386_GLOB_DAT    _Jv_RegisterClasses   000030fc R_386_GLOB_DAT    _ZN1A7vec_intE  00003104 R_386_GLOB_DAT    __cxa_finalize   ......      


清单 6. readelf 分析׃n?lib1.so 的输?/strong>
          $ objdump -x -R lib1.so    lib1.so:     file format elf32-i386   ......   Sections:   Idx Name          Size      VMA       LMA       File off  Algn    0 .gnu.hash     000001e8  000000d4  000000d4  000000d4  2**2                    CONTENTS, ALLOC, LOAD, READONLY, DATA   ......   18 .dynamic      000000d8  0000301c  0000301c  0000301c  2**2                    CONTENTS, ALLOC, LOAD, DATA   19 .got          00000014  000030f4  000030f4  000030f4  2**2                   CONTENTS, ALLOC, LOAD, DATA   20 .got.plt      00000114  00003108  00003108  00003108  2**2                    CONTENTS, ALLOC, LOAD, DATA   ......   DYNAMIC RELOCATION RECORDS   OFFSET   TYPE              VALUE   ......   000030f4 R_386_GLOB_DAT    __gmon_start__   000030f8 R_386_GLOB_DAT    _Jv_RegisterClasses   000030fc R_386_GLOB_DAT    _ZN1A7vec_intE  00003104 R_386_GLOB_DAT    __cxa_finalize   ......      

从上面两个命令的输出l果中可以看出,׃n?nbsp;lib1.so?nbsp;GOTD늚起始内存地址?nbsp;000030f4Q大ؓ(f) 20 字节 (0x14)Q静态成员变?nbsp;vec_int在共享库 lib1.so中的起始偏移地址?nbsp;000030fc。显Ӟvec_int位于该共享库?nbsp;GOTD内?/p>

当应用程序同旉?nbsp;lib1.so?nbsp;lib2.soӞ同名静态成员变?nbsp;vec_int分别位于其共享库?nbsp;GOT区。当E序q行Ӟpȝ从符可中查扑ƈ装蝲构造一?nbsp;vec_int数据Q这点从E序q行的输出结果(清单 4Q的“Backtrace”部分可以看到Q只?nbsp;lib1.so中的静态成员变量被装蝲构造;同时Q通过内存映射Q?strong>Memory mapQ部分(清单 4Q,可以观察?nbsp;vec_int对象的地址 0xe89228正好处在为共享库 lib1.so分配的可d存区 00e89000-00e8a000中:(x)

        00e89000-00e8a000 rwxp 00003000 00:1b 7668022    ./lib1.so

然后Q当E序l束Ӟ却对该变量进行了两次析构操作Q通过 gdb分析 core 文gQ?/p>
清单 7. core 文g分析l果
          $ gdb ./test core.28440 ……  Core was generated by `./test'.   Program terminated with signal 6, Aborted.   #0  0x00970402 in __kernel_vsyscall ()   (gdb)   (gdb) where   #0  0x00970402 in __kernel_vsyscall ()   #1  0x00272d10 in raise () from /lib/libc.so.6   #2  0x00274621 in abort () from /lib/libc.so.6   #3  0x002aae5b in __libc_message () from /lib/libc.so.6   #4  0x002b2b16 in _int_free () from /lib/libc.so.6   #5  0x002b6030 in free () from /lib/libc.so.6   #6  0x005d1731 in operator delete () from /usr/lib/libstdc++.so.6   #7  0x00e88417 in __gnu_cxx::new_allocator<int>::deallocate       (this=0xe89228, __p=0x9cbf028)      at /usr/lib/gcc/i386-redhat-linux/.../ext/new_allocator.h:94   #8  0x00e88451 in std::_Vector_base<int, ... (this=0xe89228, __p=0x9cbf028, __n=4)      at /usr/lib/gcc/.../include/c++/4.1.2/bits/stl_vector.h:133   #9  0x00e8849a in ~_Vector_base (this=0xe89228)      at /usr/lib/gcc/.../include/c++/4.1.2/bits/stl_vector.h:119   #10 0x00e8850cin ~vector (this=0xe89228) at /usr/lib/gcc/.../stl_vector.h:272   #11 0x00961d6c in __tcf_0 () at lib2/lib.c:3   #12 0x00275c79 in __cxa_finalize () from /lib/libc.so.6   #13 0x00961c34 in __do_global_dtors_aux () from ./lib2.so   #14 0x00962d3c in _fini () from ./lib2.so  #15 0x0023a7de in _dl_fini () from /lib/ld-linux.so.2   #16 0x002759c9 in exit () from /lib/libc.so.6   #17 0x0025fdf4 in __libc_start_main () from /lib/libc.so.6   #18 0x080484c1 in _start ()   (gdb)      

从清?7 中可以看出,从 #14 开始,E序q行 lib2.so中的析构操作Q直?#11Q都q行?nbsp;lib2.so中,当进入 #10 Ӟq行变量析构Ӟ其地址?nbsp;0x00e8850cQ该地址中的对象是程序启动时由共享库 lib1.so装蝲构造出来的Q清?1Q:(x)

        ./lib1.so(_ZNSt6vectorIiSaIiEED1Ev+0x60)[0xe8850c]

当程序结束时Q运行库 glibc到׃n?nbsp;lib2.so析构了ƈ非由其构造的对象Q导致了 core dump?/p>

q种情况下,如果替换使用选项 -fpie?nbsp;-fPIEQ操作步骤与q行l果如下所C:(x)


清单 8. 选项 -fPIE 的测试结?/strong>
          $ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH   $ g++ -g -o lib1.so -fPIE-rdynamic -shared lib1/lib.c   $ g++ -g -o lib2.so -fPIE-rdynamic -shared lib2/lib.c   $ g++ -g -pie -o test -L./ -l1 -l2 test.c   $ ./test  api1.h.   vec_int[0] = 0, addr: 0x80e3028.   vec_int[1] = 1, addr: 0x80e302c.   vec_int[2] = 2, addr: 0x80e3030.   vec_int[3] = 3, addr: 0x80e3034.   vec_int addr: 0x75e224.   $      

E序q行l果W合期望q正常结束?/p>

q是因ؓ(f)Q当使用选项 -fpie?nbsp;-fPIEӞ生成的共享库不会(x)为静态成员变量或全局变量?nbsp;GOT中创建对应的条目Q通过 objdump?strong>readelf命o(h)可以查看Q此处不再赘qͼQ从而避免了׃静态对?#8220;构造一ơ,析构两次”而对同一内存区域释放两次引v的程?core dump?/p>

选项 -fpie?nbsp;-fPIE?nbsp;-fpic?nbsp;-fPIC的用法很怼Q区别在于前者L生成的位置无关代码看作是属于程序本w,q直接链接进该可执行E序Q而非存入全局偏移?nbsp;GOT中;q样Q对于同名的静态或全局对象的访问,其构造与析构操作保持一一对应?/p>

回页?/a>

l束?/span>

通过使用选项 -fpie?nbsp;-fPIE代替 -fpic或?nbsp;-fPICQ得生成的׃n库不?x)?f)静态成员变量或全局变量?nbsp;GOT中创建对应的条目Q同时也避免了针对同名静态对?#8220;构造一ơ,析构两次”的不当操作?br />
转自Q?a >http://www.ibm.com/developerworks/cn/linux/l-cn-sdlstatic/ 







周强 2012-03-02 16:04 发表评论
]]>
linux RPC 试Q{载)http://www.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.html周强周强Sun, 07 Aug 2011 08:44:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/152718.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2011/08/07/152718.html#Feedback0http://www.shnenglu.com/tankzhouqiang/comments/commentRss/152718.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/152718.html转自:
http://www.justwinit.cn/post/3960/


RPC是glibc提供的函数参?q回值封装服? q将装l果通过|络传到服务?
RPC服务端首先要启动portmapper服务.
试一个简单的RPC传输CZ, 先定义一个模板文件test.x

program TESTPROG{
        version VERSION{
                int int_echo(int)=1;
                int get_str_len(string)=2;
                int add ( int, int ) = 3;
        }=1;
}=30000;
内含3个函? 注意其中一个有2个参?
然后可以用rpcgen生成一个Makefile:

rpcgen -a -N test.x

q会(x)生成Makefile, 客户端和服务端的E序, 和函数示?
我们手工修改一下Makefile

# This is a template Makefile generated by rpcgen
# Parameters
CLIENT = test_client
SERVER = test_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = test.x
TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g -pipe
LDLIBS += -lnsl
RPCGENFLAGS = -N
# Targets
all : $(CLIENT) $(SERVER)
$(TARGETS) : $(SOURCES.x)
        rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
        $(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
        $(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
         $(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)

修改test_server.c服务端的处理函数, 提供3U服?

/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
int *
int_echo_1_svc(int arg1,  struct svc_req *rqstp)
{
        static int  result;
        //echo.
        result=arg1;
        printf("[RPC1] source=%d, echo=%d\n", arg1, result);
        return &result;
}
int *
get_str_len_1_svc(char *arg1,  struct svc_req *rqstp)
{
        static int  result;
        //get strlen.
        result=strlen(arg1);
        printf("[PRC2] str=%s, len=%d\n", arg1, result);
        return &result;
}
int *
add_1_svc(int arg1, int arg2,  struct svc_req *rqstp)
{
        static int  result;
        result=arg1+arg2;
        printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
        return &result;
}

客户端test_client.c, 调用q三U服?

/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
void
testprog_1(char *host)
{
        CLIENT *clnt;
        int  *result_1;
        int int_echo_1_arg1=55;
        int  *result_2;
        char *get_str_len_1_arg1="Hello, world";
        int  *result_3;
        int add_1_arg1=10;
        int add_1_arg2=20;
        clnt = clnt_create (host, TESTPROG, VERSION, "udp");
        if (clnt == NULL) {
                clnt_pcreateerror (host);
                exit (1);
        }
        result_1 = int_echo_1(int_echo_1_arg1, clnt);
        if (result_1 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[PRC1] echo %d, source %d\n", *result_1,
                        int_echo_1_arg1);
        result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
        if (result_2 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[RPC2] return %d, should %d\n", *result_2,
                        strlen(get_str_len_1_arg1));
        result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
        if (result_3 == (int *) NULL) {
                clnt_perror (clnt, "call failed");
        }
        else
                printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
                        *result_3);
        clnt_destroy (clnt);
}
OK, 可以调用make?
生成可执行程序test_server和test_client.
我们启动./test_server, 用rpcinfo看看:

$rpcinfo -p 127.0.0.1
program vers proto port
100000 2 tcp 111 portmapper
30000 1 udp 36307
30000 1 tcp 34883
Bingo! 启动成功.

再开个终? 试一下调?

./test_client 127.0.0.1
[PRC1] echo 55, source 55
[RPC2] return 12, should 12
[PRC3] 10+20=30

正是我们期望?

Add ByQJackxiang
make -f Makefile.test


周强 2011-08-07 16:44 发表评论
]]>
linux q程间通信之消息传?/title><link>http://www.shnenglu.com/tankzhouqiang/archive/2011/07/07/150362.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Wed, 06 Jul 2011 18:29:00 GMT</pubDate><guid>http://www.shnenglu.com/tankzhouqiang/archive/2011/07/07/150362.html</guid><wfw:comment>http://www.shnenglu.com/tankzhouqiang/comments/150362.html</wfw:comment><comments>http://www.shnenglu.com/tankzhouqiang/archive/2011/07/07/150362.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/tankzhouqiang/comments/commentRss/150362.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tankzhouqiang/services/trackbacks/150362.html</trackback:ping><description><![CDATA[linux q程间通信中消息传递主要分为管道,FIFO,消息队列<br />Q?Q管?br />道由pipe函数创徏Q提供一个单路(单向Q数据流。pipe函数q回两个文g描述W:(x)fd[0]和fd[1]。前者打开来读Q后者打开来写。管道没有名字,所以只能由有亲~关pȝq程使用。尽管道是由单个进E创建的Q它却很在单个q程内用。管道的典型用途ؓ(f)两个不同q程Q一个是父进E,一个是子进E)提供q程间的通信手段。首先,׃个进E(它将成ؓ(f)父进E)创徏一个管道后调用forkz一个自w的副本。接着Q父q程关闭q个道的读出端Q子q程关闭同一道的写入端。或者父q程关闭q个道的写入端Q子q程关闭同一道的读出端。这在父子q程间提供了一个单向数据流?br /><br />Q?QFIFO<br />FIFO指代先进先出QF(tun)irst in,First out),linux中的FIFOcM道。它是一个单向(半双工)数据。不同于道的是Q每个FIFO有一个\径名与之兌Q从而允许无亲缘关系的进E访问同一个FIFO。FIFO也称为有名管道。FIFO由mkfifo函数创徏。其中pathname是一个普通的Unix路径名,它是该FIFO的名字。mkfifo 函数已隐含指?O_CREAT|O_EXCL. 也就是说Q它那么创徏一个新的FIFOQ要么返回一个EEXIST错误Q如果所指定的名字的FIFO已经存在Q。如果不惛_望创Z个新的FIFO,那就改ؓ(f)调用open而不是mkfifo.要打开一个已存在的FIFO或创Z个新的FIFO,应先调用mkfifo,再检查它是否q回EEXIST错误Q若q回该错误则改ؓ(f)调用open.mkfifo 命o(h)也能创徏FIFO。可以从shell脚本或命令行中用它。在创徏Z个FIFO后,它必L者打开来读Q或者打开来写Q所用的可以是open函数Q也可以是某个标准I/O打开函数。FIFO不能打开来既d写,因ؓ(f)它是半双工的。对道或FIFO的writeL往末尾d数据Q对它们的read则L从开头返回数据。如果对道或FIFO调用lseek,那就q回ESPIPE错误?br /><br />Q3QPosix 消息队列<br />消息队列可认为是一个消息链表。有_写权限的U程可往队列中放|消息,有够读权限的线E可从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先。在某个q程往一个队列写入消息之前,q不需要另外某个进E在该队列上{待消息的到达。这跟管道和FIFO是相反的Q对后者来_(d)除非d者已存在Q否则先有写入者是没有意义的。一个进E可以往某个队列写入一些消息,然后l止Q再让另外一个进E在以后某个时刻dq些消息。消息队列具有随内核的持l性,q跟道和FIFO不一栗Posix消息队列和System V消息队列。这两组函数间存在许多相似性,但也有主要的区别<br />Q? 对Posix消息队列的读Lq回最高优先的最早消息,对System Q消息队列的d可以q回L指定优先U的消息?br />Q?当往一个空队列攄一个消息时QPosix 消息队列允许产生一个信h启动一个线E。System Q消息队列则不提供类似机制?br /><br />队列中的每个消息h如下属性:(x)<br />Q?一个无W号整数优先U(PosixQ或一个长整数cd(System V).<br />2.消息的数据部分长度(可以为0Q?<br />3.数据本nQ如果长度大于0Q?br /><br />函数接口<br />Q? mqd_t mq_open(const char *name,int oflag,...)<br />mq_open函数创徏一个新的消息队列或打开一个已存在的消息队?br />Q?int mq_close(mqd_t mqdes);<br />mq_close函数关闭一个消息队列?br />Q?int mq_unlink(const char *name);<br />从系l中删除用作W一个参数的某个name.<br />4. int mq_getattr(mqd_t mqdes,struct mq_attr *attr);<br />   int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *oattr);<br />每个消息队列有四个属性,mq_getattrq回所有这些属性,mq_setattr则设|其中某个属性?br />struct mq_attr{<br />   long mq_flags;<br />   long mq_maxmsg;<br />   long mq_msgsize;<br />   long mq_curmsgs;<br />};<br /><div>5.int mq_send(mqd_t mqdes,const char *ptr,size_t len,unsigned int prio);<br /> int mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);<br /><div> mq_send函数往消息队列中写入消息,mq_receive函数从消息队列中d消息?br /><br />Q?int mq_notify(mqd_t mqdes,const struct sigevent *motification);<br />l构体:(x)<br />union sigval{<br />    int sival_int;<br />    void *sival_ptr;<br />};<br /><br />struct sigevent<br />{<br />    int sigev_notify;<br />    int sigev_signo;<br />    union sigval sigev_value;<br />    void  (*sigev_notify_function)(union sigval);<br />    pthread_attr_t *sigev_notify_attributes;<br />};<br /></div><div>mq_notify函数为指定队列徏立或删除异步事g通知。一些普遍适用于该函数的若q规?br />Q?.如果notification参数非空Q那么当前进E希望在一个消息达到所指定的先前ؓ(f)I的队列时得到通知。我们说"该进E被注册为接收该队列的通知"?br />Q?.如果notification参数为空指针Q而且当前q程目前被注册ؓ(f)接收所指定队列的通知Q那么已存在的注册将被撤销?br />Q).L时刻只有一个进E可以被注册为接收某个给定队列的通知?br />Q).当有一个消息达到某个先前ؓ(f)I的队列Q而且已有一个进E被注册为接收该队列的通知Ӟ只有在没有Q何线E阻塞在该队列的mq_receive调用中的前提下,通知才会(x)发出。这是_(d)在mq_receive调用中的d比Q何通知的注册都优先?br />Q).当该通知被发送给它的注册q程Ӟ其注册即被撤销。该q程必须再次调用mq_notify以重新注册(惌的话Q?br /><br />参考:(x)Unixq程间通信</div><br /></div><img src ="http://www.shnenglu.com/tankzhouqiang/aggbug/150362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tankzhouqiang/" target="_blank">周强</a> 2011-07-07 02:29 <a href="http://www.shnenglu.com/tankzhouqiang/archive/2011/07/07/150362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux q程间通信lDhttp://www.shnenglu.com/tankzhouqiang/archive/2011/07/04/150085.html周强周强Mon, 04 Jul 2011 01:58:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2011/07/04/150085.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/150085.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2011/07/04/150085.html#Feedback3http://www.shnenglu.com/tankzhouqiang/comments/commentRss/150085.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/150085.htmlQ?Q消息传递(道QFIFOQ消息队列)
Q?Q同步(互斥锁,条g变量Q读写锁Q信号量Q?br />Q?Q共享内存区Q匿名共享内存区Q有名共享内存区Q?br />Q?Q过E调用(Solaris门,Sun RPCQ?br />

linuxq程间的信息׃n可以分ؓ(f)
Q?Q?Z文gpȝ的共?br />Q?Q?Z内核的共?br />Q?Q?Z׃n内存区的׃n


IPC对象的持l?br />Q?Q随q程间持l的IPC对象一直存在到打开着该对象的最后一个进E关闭该对象的最后一个进E关闭该对象为止?br />Q?Q随内核持箋的IPC对象一直存在到内核重新自D或显式删除该对象为止?br />Q?Q随文gpȝ持箋的IPC对象一直存在到昄删除该对象ؓ(f)止。即使系l自举了Q该对象q是存在的?br />

IPCcd                                       持箋?br />道                                           随进E?br />FIFO                                          随进E?br />
Posix互斥?nbsp;                                随进E?br />Posix条g变量                              随进E?br />Posixd?nbsp;                                随进E?br />fcntl记录上锁                                随进E?br />
Posix消息队列                              随内?br />Posix有名信号?nbsp;                          随内?br />PosixZ内存的信号量                   随进E?br />Posix׃n内存?nbsp;                          随内?br />
System V消息队列                        随内?br />System V信号?nbsp;                          随内?br />System V׃n内存?nbsp;                    随内?br />
TCP套接?nbsp;                                 随进E?br />UDP套接?nbsp;                                 随进E?br />Unix域套接字                               随进E?br />





名字I间Q?br /> 当两个或多个无亲~关pȝq程使用某种cd的IPC对象来彼此交换信息时Q该IPC对象必须有一个某UŞ式的名字或者标识符Q这样其中一个进E(往往是服务器Q可以创IPC对象Q其余进E则可以指定同一个IPC对象?br />
IPCcd                        用于打开或创建IPC的名字空?nbsp;               IPC打开后的标识
道                                     没有名字                                      描述W?br /> FIFO                                    路径?nbsp;                                        描述W?br />
Posix互斥?nbsp;                         没有名字                                      pthread_mutex_t指针
Posix条g变量                       没有名字                                      pthread_cond_t指针
Posixd?nbsp;                         没有名字                                      pthread_rwlock_t指针
fcntl记录上锁                        路径?nbsp;                                        描述W?br />
Posix消息队列                       Posix IPC名字                              mqd_t?br />Posix有名信号?nbsp;                   Posix IPC名字                              sem_t指针
PosixZ内存的信号量            没有名字                                     sem_t指针
Posix׃n内存?nbsp;                   Posix IPC名字                              描述W?br />

System V消息队列                key_t?nbsp;                                      System V IPC标识W?br />System V 信号?nbsp;                 key_t?nbsp;                                      System V IPC标识W?br />System V׃n内存?nbsp;             key_t?                                     System V IPC 标识W?br />
?                                     路径?                                        描述W?br />sun RPC                             E序/版本                                     RPC句柄

TCP套接?                           IP地址与TCP 端口                         描述W?br />UDP套接?                          IP地址与UDP端口                          描述W?br />Unix域套接字                        路径?                                       描述W? 


周强 2011-07-04 09:58 发表评论
]]>
linux 守护q程~写规则http://www.shnenglu.com/tankzhouqiang/archive/2011/06/29/149778.html周强周强Wed, 29 Jun 2011 13:50:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2011/06/29/149778.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/149778.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2011/06/29/149778.html#Feedback1http://www.shnenglu.com/tankzhouqiang/comments/commentRss/149778.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/149778.htmllinux 守护q程~写规则
Q?Q首先要做的是调用umask文件模式创建屏蔽字讄?.q承得来的文g模式创徏屏蔽字可能会(x)拒绝讄某些权限?br />Q?Q调用forkQ然后父进E退出(exitQ?q样做实C下面几点Q第一Q如果该守护q程是作Z条简单shell命o(h)启动的,那么父进E终止得shell认ؓ(f)q条命o(h)已经执行完毕。第二,子进E承了父进E的q程lID,但具有一个新的进EID,q就保证了子q程不是一个进E组的组长进E。这对于下面p做的setsid调用是必要的前提条g?br />Q?Q调用setsid以创Z个新?x)话Q是调用q程Q(a)成ؓ(f)C(x)话的首进E,QbQ成Z个新q程l的l长q程Q(cQ没有控制终端。在有些人徏议在此时再次调用 fork,q是父进E终止。第二个子进E作为守护进El运行。这样就保证了该守护q程不是?x)话首进E?br />Q?Q将当前工作目录更改为根目录?br />Q?Q关闭不再需要的文g描述W。这使守护进E不再持有从其父q程l承来的某些文g描述W?br />Q?Q某些守护进E打开/dev/null使其h文g描述W?Q?Q?.q样QQ何一个试图读标准输入Q写标准输出或标准出错的库例E都不会(x)产生M效果?br />
参考:(x)UNIX环境高~程

周强 2011-06-29 21:50 发表评论
]]>
unixq程间通信http://www.shnenglu.com/tankzhouqiang/archive/2011/04/12/144013.html周强周强Tue, 12 Apr 2011 03:07:00 GMThttp://www.shnenglu.com/tankzhouqiang/archive/2011/04/12/144013.htmlhttp://www.shnenglu.com/tankzhouqiang/comments/144013.htmlhttp://www.shnenglu.com/tankzhouqiang/archive/2011/04/12/144013.html#Feedback0http://www.shnenglu.com/tankzhouqiang/comments/commentRss/144013.htmlhttp://www.shnenglu.com/tankzhouqiang/services/trackbacks/144013.htmlQ?Q消息传递主要有道QFIFOQ消息队?br>Q?Q同步主要有互斥锁与条g变量Q读写锁Q记录锁Q信号量
Q?Q共享内?br>Q?Q远E调?br>


周强 2011-04-12 11:07 发表评论
]]>
Linux下飞鸽传书实?/title><link>http://www.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html</link><dc:creator>周强</dc:creator><author>周强</author><pubDate>Tue, 15 Mar 2011 13:57:00 GMT</pubDate><guid>http://www.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html</guid><wfw:comment>http://www.shnenglu.com/tankzhouqiang/comments/141915.html</wfw:comment><comments>http://www.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/tankzhouqiang/comments/commentRss/141915.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tankzhouqiang/services/trackbacks/141915.html</trackback:ping><description><![CDATA[<!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:view> <w:zoom>0</w:zoom> <w:trackmoves/> <w:trackformatting/> <w:punctuationkerning/> <w:drawinggridverticalspacing>7.8 ?/w:drawinggridverticalspacing> <w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery> <w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:saveifxmlinvalid> <w:ignoremixedcontent>false</w:ignoremixedcontent> <w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext> <w:donotpromoteqf/> <w:lidthemeother>EN-US</w:lidthemeother> <w:lidthemeasian>ZH-CN</w:lidthemeasian> <w:lidthemecomplexscript>X-NONE</w:lidthemecomplexscript> <w:compatibility> <w:spaceforul/> <w:balancesinglebytedoublebytewidth/> <w:donotleavebackslashalone/> <w:ultrailspace/> <w:donotexpandshiftreturn/> <w:adjustlineheightintable/> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> <w:usefelayout/> </w:compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel> <m:mathpr> <m:mathfont m:val="Cambria Math"/> <m:brkbin m:val="before"/> <m:brkbinsub m:val="--"/> <m:smallfrac m:val="off"/> <m:dispdef/> <m:lmargin m:val="0"/> <m:rmargin m:val="0"/> <m:defjc m:val="centerGroup"/> <m:wrapindent m:val="1440"/> <m:intlim m:val="subSup"/> <m:narylim m:val="undOvr"/> </m:mathpr></w:worddocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" DefSemiHidden="true" defqformat="false" defpriority="99" LatentStyleCount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Normal"/> <w:lsdexception locked="false" priority="9" semihidden="false" UnhideWhenUsed="false" qformat="true" name="heading 1"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"/> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"/> <w:lsdexception locked="false" priority="39" name="toc 1"/> <w:lsdexception locked="false" priority="39" name="toc 2"/> <w:lsdexception locked="false" priority="39" name="toc 3"/> <w:lsdexception locked="false" priority="39" name="toc 4"/> <w:lsdexception locked="false" priority="39" name="toc 5"/> <w:lsdexception locked="false" priority="39" name="toc 6"/> <w:lsdexception locked="false" priority="39" name="toc 7"/> <w:lsdexception locked="false" priority="39" name="toc 8"/> <w:lsdexception locked="false" priority="39" name="toc 9"/> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"/> <w:lsdexception locked="false" priority="10" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Title"/> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"/> <w:lsdexception locked="false" priority="11" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtitle"/> <w:lsdexception locked="false" priority="22" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Strong"/> <w:lsdexception locked="false" priority="20" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Emphasis"/> <w:lsdexception locked="false" priority="59" semihidden="false" UnhideWhenUsed="false" name="Table Grid"/> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"/> <w:lsdexception locked="false" priority="1" semihidden="false" UnhideWhenUsed="false" qformat="true" name="No Spacing"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 1"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 1"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 1"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 1"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 1"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 1"/> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"/> <w:lsdexception locked="false" priority="34" semihidden="false" UnhideWhenUsed="false" qformat="true" name="List Paragraph"/> <w:lsdexception locked="false" priority="29" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Quote"/> <w:lsdexception locked="false" priority="30" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Quote"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 1"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 1"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 1"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 1"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 1"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 1"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 1"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 1"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 2"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 2"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 2"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 2"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 2"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 2"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 2"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 2"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 2"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 2"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 2"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 2"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 2"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 2"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 3"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 3"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 3"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 3"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 3"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 3"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 3"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 3"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 3"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 3"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 3"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 3"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 3"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 3"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 4"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 4"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 4"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 4"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 4"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 4"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 4"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 4"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 4"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 4"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 4"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 4"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 4"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 4"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 5"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 5"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 5"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 5"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 5"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 5"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 5"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 5"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 5"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 5"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 5"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 5"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 5"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 5"/> <w:lsdexception locked="false" priority="60" semihidden="false" UnhideWhenUsed="false" name="Light Shading Accent 6"/> <w:lsdexception locked="false" priority="61" semihidden="false" UnhideWhenUsed="false" name="Light List Accent 6"/> <w:lsdexception locked="false" priority="62" semihidden="false" UnhideWhenUsed="false" name="Light Grid Accent 6"/> <w:lsdexception locked="false" priority="63" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 1 Accent 6"/> <w:lsdexception locked="false" priority="64" semihidden="false" UnhideWhenUsed="false" name="Medium Shading 2 Accent 6"/> <w:lsdexception locked="false" priority="65" semihidden="false" UnhideWhenUsed="false" name="Medium List 1 Accent 6"/> <w:lsdexception locked="false" priority="66" semihidden="false" UnhideWhenUsed="false" name="Medium List 2 Accent 6"/> <w:lsdexception locked="false" priority="67" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 1 Accent 6"/> <w:lsdexception locked="false" priority="68" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 2 Accent 6"/> <w:lsdexception locked="false" priority="69" semihidden="false" UnhideWhenUsed="false" name="Medium Grid 3 Accent 6"/> <w:lsdexception locked="false" priority="70" semihidden="false" UnhideWhenUsed="false" name="Dark List Accent 6"/> <w:lsdexception locked="false" priority="71" semihidden="false" UnhideWhenUsed="false" name="Colorful Shading Accent 6"/> <w:lsdexception locked="false" priority="72" semihidden="false" UnhideWhenUsed="false" name="Colorful List Accent 6"/> <w:lsdexception locked="false" priority="73" semihidden="false" UnhideWhenUsed="false" name="Colorful Grid Accent 6"/> <w:lsdexception locked="false" priority="19" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtle Emphasis"/> <w:lsdexception locked="false" priority="21" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Emphasis"/> <w:lsdexception locked="false" priority="31" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Subtle Reference"/> <w:lsdexception locked="false" priority="32" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Intense Reference"/> <w:lsdexception locked="false" priority="33" semihidden="false" UnhideWhenUsed="false" qformat="true" name="Book Title"/> <w:lsdexception locked="false" priority="37" name="Bibliography"/> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"/> </w:latentstyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表? mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} </style> <![endif]--> <p class="MsoPlainText"><span lang="EN-US">Linux </span><span>下飞鸽传书设计实?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">1.</span><span>pȝ功能<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span>Ҏ(gu)飞鸽传书协议?span lang="EN-US"> linux </span>下实现飞鸽传输程?span lang="EN-US">,</span>q且?span lang="EN-US"> windows </span>下飞鸽兼宏V具体功能模块包括用户上U?span lang="EN-US">,</span>下线<span lang="EN-US">,</span>h查看在线用户<span lang="EN-US">,</span>收发消息<span lang="EN-US">,</span>传送文?span lang="EN-US">/</span>文g夹功能模块?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">2.</span><span>具体实现<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">2.1 </span><span>关键数据l构<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>命o(h)的结?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _command</span></p> <p class="MsoPlainText"><span lang="EN-US"> {</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int version;/*</span><span>命o(h)的版?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int seq;/*</span><span>包编?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char srcName[100];/*</span><span>发送者姓?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char srcHost[100];/*</span><span>发送者主机名<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>int flag;/*</span><span>命o(h)<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char addtion[100];/*</span><span>附加字段<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"> }command;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>在线用户信息<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _userInfo</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char name[MAXLINE];<span>     </span>/*</span><span>姓名<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char host[MAXLINE];<span>         </span>/*</span><span>L?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>char group[MAXLINE];<span>        </span>/*</span><span>所在的l名<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>struct sockaddr_in addr;<span>        </span>/*</span><span>地址信息<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>struct _userInfo next;<span>      </span>/*</span><span>链表中下一?span lang="EN-US">*/ </span></span></p> <p class="MsoPlainText"><span lang="EN-US">}userInfo;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>在线用户列表<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _uList</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>userInfo *userListHead;<span>     </span>/*</span><span>链表?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>userInfo userListTail;<span>      </span>/*</span><span>链表?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">}uList;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">/*</span><span>消息队列<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">typedef struct _mesList</span></p> <p class="MsoPlainText"><span lang="EN-US">{</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>command *mesHead;</span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span>command *mesTail;</span></p> <p class="MsoPlainText"><span lang="EN-US">}mesList;</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">2.2 </span><span>E序主要l构<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span>本程序主要采用多U程l构<span lang="EN-US">,</span>分ؓ(f)<span lang="EN-US"> receive(</span>接收消息<span lang="EN-US">), process(</span>处理收到的消?span lang="EN-US">), sendData(</span>发送文?span lang="EN-US">) </span>三个子线E。线E间通信互斥锁与<span lang="EN-US"> Posix </span>信号量进行通信?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"><br></span><span lang="EN-US"></span></p> <p class="MsoPlainText"><span lang="EN-US">2.3 </span><span>函数接口<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US">(1) /*</span><span>从文件描q符<span lang="EN-US">fd</span>中读?span lang="EN-US">count</span>个字W存?span lang="EN-US">buf</span>?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>ssize_t readn(int fd,void *buf,size_t count)</span><span>Q?span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(2) /*</span><span>?span lang="EN-US">buf</span>所指向的存储区中的<span lang="EN-US">len</span>个字W吸入文件描q符<span lang="EN-US">fd</span>?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>ssize_t writen(int fd,char *buf,int len);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(3) /*</span><span>用于字符串{?span lang="EN-US">,</span>|络传输中用<span lang="EN-US">gb2312</span>~码Q?span lang="EN-US">linux</span>?span lang="EN-US">gtk</span>?span lang="EN-US">utf-8</span>~码Q需要进行{?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(4) /*</span><span>在用户链表中加入新用户信息,加入成功q回<span lang="EN-US">1</span>Q否则返?span lang="EN-US">0,</span>使用<span lang="EN-US">userInfoMutex</span>q行U程间通信控制<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>  </span>int pushBack(uList *list,userInfo user);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(5) /*</span><span>在用户链表中删除指定地址信息的用P删除成功后返?span lang="EN-US">1</span>Q否则返?span lang="EN-US">0</span>Q?span lang="EN-US">userInfoMutex</span>q行U程间控?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span>  </span>int delUser(uList *list, struct sockaddr_in addr);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(6) /*</span><span>判断该用h否已l存在,已经存在则返?span lang="EN-US">1</span>Q否则返?span lang="EN-US">0,</span>使用<span lang="EN-US">userInfoMutex</span>q行U程间控?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int isExist(uList *list,struct sockaddr_in addr);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(7)</span><span>清空用户链表Q释攄_(d)用于用户退出和用户h旉攄?span lang="EN-US">,</span>使用<span lang="EN-US">userInfoMutex</span>q行U程间控?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int destroyList(uList *list);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(8)/*</span><span>创徏命o(h)?span lang="EN-US">,com</span>q回的命令字<span lang="EN-US">,flag </span>为消息标?span lang="EN-US">,addtion </span>为附加标?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void createCmd(command & com,int flag,char addtion[])</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(9)/*</span><span>发送消息,<span lang="EN-US">com</span>发送的消息Q?span lang="EN-US">servaddr</span>发送的地址Q?span lang="EN-US">attach</span>为文仉件信?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">void sendCmd(command com, struct sockaddr_in servaddr,char attach[]);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(10) /*</span><span>把收到的消息加入到消息队列中<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void addMes(mesList *mHead,command cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(11) /*</span><span>把消息队列中头部的节Ҏ(gu)息提取出来用于处?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int delMes(mesList *mHead,command *cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(12)/*</span><span>初始化操作,飞鸽d时初始化消息链表Q用户链表,信号量,套接字信?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>void init();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(13)/*</span><span>d操作<span lang="EN-US">,</span>发送用户上U消?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void login();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(14)/*</span><span>解析收到的消息命令,提取各个字段<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>int analysisCmd(command *cmd,char *buf);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(15) /*</span><span>接收消息U程处理函数<span lang="EN-US">,</span>收到的消息加入消息队列中,通过信号?span lang="EN-US">waitNoFull</span>?span lang="EN-US">waitNoEmpty</span>和消息处理线E进行通信。消息队列用<span lang="EN-US">mesMutex</span>与其他线E进行通信Q保证消息队列的正确?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US"><span> </span>void *receive(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(16)/*gtk</span><span>界面中显C在U用户信?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showUser(uList *list);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(17)/*</span><span>?span lang="EN-US">gtk</span>界面中显C消?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showMessage(char *message);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(18)/*</span><span>昄收到的信?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void showRecvMessage(char *host,char *message);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(19)/*</span><span>分析文g的信息,提取有用的字D?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void fileAnalysis(char *recv,int *fNum,char *fName,int *fSize,int *fTime,int *fType);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(20) /*</span><span>保存收到的单个文?span lang="EN-US">,saveName</span>Z存的文g?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveSignalFile(char *saveName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(21)/*</span><span>分析目录附gQ获得目录文件的文g名,文g大小Q文件类?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void getDirInfo(char *recv,char *fName,int *fSize,int *fType);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(22) /*</span><span>保存目录<span lang="EN-US">,saveName</span>保存的目?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveDir(char *saveName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(23)/*</span><span>保存文g<span lang="EN-US">,recvType=1</span>Z存文Ӟ<span lang="EN-US">recvType=2</span>Z存的目录<span lang="EN-US">,</span>使用<span lang="EN-US">fileMutex</span>来设|互斥?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void saveFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(24)/*</span><span>收到单个文g<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveSignalFile(char *recvFileName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(25)/*</span><span>收到单个目录<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveDir(char *recvDirName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(26)/*</span><span>接收文g<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void receiveFile(command cmd);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(27)/*</span><span>信号处理U程<span lang="EN-US">,</span>从消息队列中取出消息q行处理<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void *process(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(28)/*</span><span>发送消?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">int sendMes();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(29) /*</span><span>文件名q行转换<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">char *transName(char *fileName);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(30)/*</span><span>发送文?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void sendFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(31)/*</span><span>发送文件夹<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void sendDir();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(32)/*</span><span>用户点击h<span lang="EN-US">,</span>h在线用户<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void refresh();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(33) /*</span><span>用户退?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void quit();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(34)/*</span><span>传输文gҎ(gu)据,递归函数<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void transferDir(int fd,char *dir);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(35)/*</span><span>监听<span lang="EN-US">TCP</span>套接口,发送文件与文g夹线E?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">void *sendData(void *arg);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(36)/*</span><span>创徏菜单<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void create_popup_menu(GtkWidget *menu,GtkWidget *view);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(37)/*</span><span>叛_选中<span lang="EN-US">treeview,</span>昄传送文件与文g夹菜?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static gboolean showTreeView(GtkWidget *eventBox,GdkEventButton *event,GtkWidget *menu);</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(38)/*</span><span>选择要发送的文g<span lang="EN-US"> */</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(39)/*</span><span>选择要发送的文g?span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectDir();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">(40)/*</span><span>选择要保存的文g名或文g夹名<span lang="EN-US">*/</span></span></p> <p class="MsoPlainText"><span lang="EN-US">static void selectSaveFile();</span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US">3.</span><span>ȝ<span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"><span>    </span></span><span>实现?span lang="EN-US">linux</span>下飞鸽传书的基本功能Qƈ且能?span lang="EN-US">window</span>下飞鸽进行通信Q传文g。熟(zhn)了<span lang="EN-US">linux</span>下网l编E,多线E编E及(qing)U程间通信Q主要用C号量与互斥锁Q。但加密解密那块没有完成Q程序结构不是很好,界面做得太差。有I应该看看设计模?span lang="EN-US">.</span></span></p> <p class="MsoPlainText">界面截图Q界面比较垃?Q?/p> <p class="MsoPlainText"><img src="http://www.shnenglu.com/images/cppblog_com/tankzhouqiang/Screenshot.png" border="0"><br><span><span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span><span lang="EN-US">附:(x)</span></span></p> <p class="MsoPlainText"><span><span lang="EN-US">飞鸽协议Q?http://bbs.chinaunix.net/viewthread.php?tid=1015775<br></span></span></p> <p class="MsoPlainText"><span> <span lang="EN-US"></span></span></p> <p class="MsoPlainText"><span lang="EN-US"><br></span><span lang="EN-US"></span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoPlainText"><span lang="EN-US"> </span></p> <p class="MsoNormal"><span lang="EN-US"> </span></p><img src ="http://www.shnenglu.com/tankzhouqiang/aggbug/141915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tankzhouqiang/" target="_blank">周强</a> 2011-03-15 21:57 <a href="http://www.shnenglu.com/tankzhouqiang/archive/2011/03/15/141915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.yx177.cn" target="_blank">AëƬþ</a>| <a href="http://www.yc9z.com.cn" target="_blank">þþƷר</a>| <a href="http://www.zgsmkf.cn" target="_blank">99þ99þþƷѿ</a>| <a href="http://www.s360.com.cn" target="_blank">һһþaþþƷۺ鶹</a>| <a href="http://www.tafeemanager.cn" target="_blank">޹Ʒþþ</a>| <a href="http://www.colour360.cn" target="_blank">2021þþƷ99Ʒ</a>| <a href="http://www.uubux.com.cn" target="_blank">þþƷ</a>| <a href="http://www.rubiconworld.com.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.csjhc.cn" target="_blank">þþþav</a>| <a href="http://www.guangzb.cn" target="_blank">ɫɫۺϾþҹҹ</a>| <a href="http://www.w4749.cn" target="_blank">ݺɫþۺѿ </a>| <a href="http://www.jumeiba.cn" target="_blank">ϵרþ</a>| <a href="http://www.cdhjym.cn" target="_blank">ݲݾþþר</a>| <a href="http://www.xhcedu.cn" target="_blank">99þþƷž޾Ʒ</a>| <a href="http://www.xxysw.com.cn" target="_blank">18պҹþó</a>| <a href="http://www.yuleluntan.cn" target="_blank">㽶þþƷ</a>| <a href="http://www.cadcamcae.com.cn" target="_blank">97þþþƷۺ88þ</a>| <a href="http://www.k443.cn" target="_blank">޺ݺۺϾþ</a>| <a href="http://www.x705.cn" target="_blank">þþƷһ</a>| <a href="http://www.wangjunyao.cn" target="_blank">ŷҹAŴƬþ </a>| <a href="http://www.huameizc.cn" target="_blank">ձƷþþþӰԺձ</a>| <a href="http://www.wc78.cn" target="_blank">þۺϹɫ88þþƷۺ </a>| <a href="http://www.hbhshj.cn" target="_blank">99þþƷѿһ</a>| <a href="http://www.mdeditor.cn" target="_blank">þAVһ</a>| <a href="http://www.40theft.cn" target="_blank">vavavaþ</a>| <a href="http://www.loreng.cn" target="_blank">Ʒþøһ</a>| <a href="http://www.wwwh0930com.cn" target="_blank">ձþþþƷĻ</a>| <a href="http://www.ixlg.cn" target="_blank">ŷСþþþþþ</a>| <a href="http://www.talkvo.cn" target="_blank">þɫۺһ</a>| <a href="http://www.awxsp.cn" target="_blank">þþƷavˮ</a>| <a href="http://www.120o.cn" target="_blank">99þùۺϾƷӰԺ</a>| <a href="http://www.gzkyzc.com.cn" target="_blank">ĻӰӾþþѹۿ</a>| <a href="http://www.smscx.cn" target="_blank">Ů޾Ʒþþۺ </a>| <a href="http://www.yiyioo.cn" target="_blank">91Ʒ91þ</a>| <a href="http://www.qikan99.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.taobaoluntan.net.cn" target="_blank">˾þþƷӰԺ</a>| <a href="http://www.gameforpeace.cn" target="_blank">þ99Ʒһ</a>| <a href="http://www.650qq.cn" target="_blank">þĻƷ</a>| <a href="http://www.lvtonggaoerfu.cn" target="_blank">WWWAVþþӰƬ</a>| <a href="http://www.ahtsz.cn" target="_blank">þþþ޾Ʒַ</a>| <a href="http://www.djl0320.cn" target="_blank">ŷһþۺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>