精华内容
下载资源
问答
  • API进程线程函数

    2012-11-04 14:18:00
    CancelWaitableTimer 这个函数用于取消一个可以等待下去计时器操作CallNamedPipe 这个函数由一个希望通过管道通信一个客户进程调用ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接...

    API之进程和线程函数

    CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 
    CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 
    ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 
    CreateEvent 创建一个事件对象 
    CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用(收件人) 
    CreateMutex 创建一个互斥体(MUTEX) 
    CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 
    CreatePipe 创建一个匿名管道 
    CreateProcess 创建一个新进程(比如执行一个程序) 
    CreateSemaphore 创建一个新的信号机 
    CreateWaitableTimer 创建一个可等待的计时器对象 
    DisconnectNamedPipe 断开一个客户与一个命名管道的连接 
    DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄 
    ExitProcess 中止一个进程 
    FindCloseChangeNotification 关闭一个改动通知对象 
    FindExecutable 查找与一个指定文件关联在一起的程序的文件名 
    FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 
    FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化 
    FreeLibrary 释放指定的动态链接库 
    GetCurrentProcess 获取当前进程的一个伪句柄 
    GetCurrentProcessId 获取当前进程一个唯一的标识符 
    GetCurrentThread 获取当前线程的一个伪句柄 
    GetCurrentThreadId 获取当前线程一个唯一的线程标识符 
    GetExitCodeProces 获取一个已中断进程的退出代码 
    GetExitCodeThread 获取一个已中止线程的退出代码 
    GetHandleInformation 获取与一个系统对象句柄有关的信息 
    GetMailslotInfo 获取与一个邮路有关的信息 
    GetModuleFileName 获取一个已装载模板的完整路径名称 
    GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 
    GetPriorityClass 获取特定进程的优先级别 
    GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 
    GetProcessTimes 获取与一个进程的经过时间有关的信息 
    GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 
    GetSartupInfo 获取一个进程的启动信息 
    GetThreadPriority 获取特定线程的优先级别 
    GetTheardTimes 获取与一个线程的经过时间有关的信息 
    GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 
    LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间 
    LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间 
    LoadModule 载入一个Windows应用程序,并在指定的环境中运行 
    MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足,则立即返回 
    SetPriorityClass 设置一个进程的优先级别 
    SetProcessShutdownParameters 在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序 
    SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 
    SetThreadPriority 设定线程的优先级别 
    ShellExecute 查找与指定文件关联在一起的程序的文件名 
    TerminateProcess 结束一个进程 
    WinExec 运行指定的程序

    转载于:https://www.cnblogs.com/quansir/archive/2012/11/04/2753494.html

    展开全文
  • 进程是资源分配最小单位,线程是程序执行最小单位。进程是有自己独立空间地址,每当你启动...使用fork( )函数创建进程的时候,子进程会使用fork函数得到子进程是父进程一个复制品,它从父进程处继承了整个...

    1334c6ed7aa35823f1875aa033d5d562.png

    进程是资源分配的最小单位,线程是程序执行的最小单位。进程是有自己独立的空间地址,每当你启动一个进程的时候,系统就会为这个进程分配空间和地址,创建新的数据表来维护代码段和数据段。创建进程可以使用fork( )函数和vfork( )函数,而创建线程使用pthread_create函数。

    使用fork( )函数创建进程的时候,子进程会使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间。但是子进程的地址空间和父进程的地址空间不是同一块空间,打个比方,相同布局的两间房子,布局一样,但是房间号不一样。vfork( )函数在创建进程的时候,会让子进程先运行,在子进程调用了exec(或exit)函数后,子进程不再访问该空间地址,开始拥有自己的空间地址,打个比方,在自己成家(调用了exec(或exit)函数)之前,老爹会让你和他住在一起,但是在成家之后,你就必须要有自己的房子了。

    所以换一种方式讲,进程是资源,线程才是要执行的程序。

    线程相对于进程来说,通信更加方便,多个线程是共享进程的空间地址资源的,使用相同的地址空间,所以在运行速度上来说,CPU切换一个线程要比切换一个进程快很多,创建一个线程的开销也要比创建一个进程要小很多。

    一个进程中必须要有至少一个线程,就好像一个家庭中必须要有一个人赚钱,只要家还在,赚钱的人就在。如果“家道中落”,家没了,那么赚钱的人也就没有存在的意义了——进程被销毁,进程里面的线程也将不复存在。

    学习是一个循序渐进的认知过程,恰当的比喻会加深自己对知识的理解。

    Keep moving,never settle!

    展开全文
  • 这两个数组保存了两组函数地址,它们将在有进程创建或销毁,有镜像被装载或映射入内存时候被依次调用, 当然了这两个符号都是未导出,而且它们数量在xp和win7下也有所不同,xp下最大数组数量为8,win7下为64 ...
    今天我们首先来看一下最简单的,关于遍历PspCreateProcessNotifyRoutine数组,PspLoadImageNotifyRoutine也同理

    这两个数组保存了两组函数地址,它们将在有进程被创建或销毁,有镜像被装载或映射入内存的时候被依次调用,
    当然了这两个符号都是未导出的,而且它们的数量在xp和win7下也有所不同,xp<2k3>下最大数组数量为8,win7下为64

    既然要找到两个未导出符号,我们就在已导出的相关函数中看一下有没有线索,
    相关函数:PsSetCreateProcessNotifyRoutine,注册或注销一个进程创建,销毁的通知回调
    相关函数:PsSetLoadImageNotifyRoutine,注册一个镜像装载,映射的通知回调
    相关函数:PsRemoveLoadImageNotifyRoutine,注销一个镜像装载,映射的通知回调
    相关函数:PsSetCreateThreadNotifyRoutine,注册一个线程创建,销毁的通知回调

    相关函数:PsRemoveCreateThreadNotifyRoutine,注销一个线程创建,销毁的通知回调



    <PS一下:不清楚为什么那么多文章说PsSetCreateProcessNotifyRoutine,或PsSetLoadImageNotifyRoutine注册的例程无法被删除,从而导致相关的驱动无法被卸载,云云..
    WDK中已经解释的很清楚了,而且我平时的使用中没出过任何异常,两个回调都可以通过正规函数删掉,当然手动遍历数组删除也没问题>

    另外值得一提的是PsSetLoadImageNotifyRoutine,
    该函数注册的回调例程会在镜像被装载或映射入内存之后马上被调用,
    注意它是先于DLLMAIN或者DRIVER_ENTRY被调用的,联想到有的驱动会在被加载之后马上删除源文件,我们可以通过这种回调在驱动自动删掉文件本身之前将它copy出去,这种方式比内存dump这种马后炮的方式优雅可靠得多


    首先来看一下xp的PsSetCreateProcessNotifyRoutine <2k3下相仿>:
    名称:  QQ截图20110920084237.jpg查看次数: 4704文件大小:  51.3 KB



    可以看到在入口地址不远处就有PspCreateProcessNotifyRoutine的出现,我们可以很方便地通过搜索特征码的方式得到.

    在看一下win7下的PsSetCreateProcessNotifyRoutine:
    点击图片以查看大图图片名称: QQ截图20110920085750.jpg查看次数: 4699文件大小: 61.6 KB文件 ID : 60740



    它首先调用了PspSetCreateProcessNotifyRoutine函数,追踪一下:
    点击图片以查看大图图片名称: QQ截图20110920085851.jpg查看次数: 4686文件大小: 60.0 KB文件 ID : 60739
    PspCreateProcessNotifyRoutine在入口不远处出现


    这样,我们就得到了xp<2k3>和win7下的PspCreateProcessNotifyRoutine的地址,
    接下来就是遍历一下这个数组看一下每个回调例程都位于哪个模块中了,
    找到之后调用PsSetCreateProcessNotifyRoutine,第二个参数设置为TRUE就能摘掉回调例程了


    ...什么?你遍历了数组但是没有发现目标模块中的回调?好吧,这其中貌似有些猫腻,我们来看一下:
    <图中选中的项是我自己的回调例程,当然地址是我已经计算好了的,PspCreateProcessNotifyRoutine数组中并不会出现此地址>
    点击图片以查看大图图片名称: QQ截图20110920092143.jpg查看次数: 4699文件大小: 73.0 KB文件 ID : 60738



    我们来看一下这个驱动文件在内核地址空间中的范围:
    <图中选中项是我自己的回调例程所在模块>
    名称:  QQ截图20110920092357.jpg查看次数: 4644文件大小:  43.4 KB

    可以计算一下该驱动文件的地址范围是 0x927F7000 至 0x927F7000+7000 <927FE000>

    接下来我们用livekd来看一下,直接找到PspCreateProcessNotifyRoutine:
    名称:  QQ截图20110920092926.jpg查看次数: 4645文件大小:  34.7 KB


    可以看到8个回调地址中没有 0x927F7000 - 927FE000 范围内的地址,直觉上最后一个应该是与我们自己注册的例程有关系的数据,那么我们看一下地址 0x9c79061f 中又有什么玄机:
    名称:  QQ截图20110920093317.jpg查看次数: 4635文件大小:  46.9 KB


    这..貌似没有什么有用的数据,那么我自己注册的例程地址保存到了哪里呢?于是我们自然想到翻看一下WRK,
    在WRK中找到PsSetCreateProcessNotifyRoutine,
    然后发现其中一处调用了ExAllocateCallBack,看名称应该是为回调分配内存,我们看一下:
    名称:  QQ截图20110920094910.jpg查看次数: 4626文件大小:  75.9 KB



    这里进行了内存分配,并且将传参Function,也就是我们注册回调时提供的例程地址,写入了一个结构中PEX_CALLBACK_ROUTINE_BLOCK,看一下这个结构有什么成员:
    名称:  QQ截图20110920095132.jpg查看次数: 4608文件大小:  33.8 KB


    我们感兴趣的只有结构中的第二个成员Function.
    回想一下,既然系统为回调分配了内存,那么PspCreateProcessNotifyRoutine中保存的应该是每个结构的地址了,但是回过头我们再看一下 0x9c79061f 地址处的数据:
    名称:  QQ截图20110920093317.jpg查看次数: 4635文件大小:  46.9 KB


    这里还是没有我们要寻找的地址!
    而继续在PsSetCreateProcessNotifyRoutine中寻找线索也没有什么收获

    于是我们开始转换了思路,既然我们找不到这个回调的地址,那么系统是如何找到的呢?
    嗯,貌似这是一个新的突破口,可是我们不知道系统是在什么时候通过什么方式调用 PspCreateProcessNotifyRoutine 中的例程的啊!
    额,再想一下,系统要在某个函数中调用 PspCreateProcessNotifyRoutine 中的例程,那么应该会对 PspCreateProcessNotifyRoutine 进行引用的吧,我们在WRK中搜索 PspCreateProcessNotifyRoutine ,看一看都有哪里对其进行了引用:
    点击图片以查看大图图片名称: QQ截图20110920100346.jpg查看次数: 4637文件大小: 169.4 KB文件 ID : 60732


    于是我们找到了这里:
    点击图片以查看大图图片名称: QQ截图20110920100541.jpg查看次数: 4590文件大小: 84.0 KB文件 ID : 60731


    想想也对,因为PspCreateProcessNotifyRoutine是在进程创建,销毁都进行调用的
    跟踪一下 CallBack = ExReferenceCallBackBlock (&PspCreateProcessNotifyRoutine[i]); 这行代码,这里应该是取得回调结构的调用
    点击图片以查看大图图片名称: QQ截图20110920101632.jpg查看次数: 4566文件大小: 118.1 KB文件 ID : 60730


    仔细看看该函数的函数头,我们才发现原来 PspCreateProcessNotifyRoutine 中保存的是 PEX_CALLBACK 结构:
    名称:  QQ截图20110920101849.jpg查看次数: 4456文件大小:  15.6 KB
    名称:  QQ截图20110920101948.jpg查看次数: 4459文件大小:  21.0 KB


    我们看这一行代码
    CallBackBlock = ExFastRefGetObject (CallBack->RoutineBlock);
    CallBackBlock 被定义为 PEX_CALLBACK_ROUTINE_BLOCK 也就是 PsSetCreateProcessNotifyRoutine 分配的内存数据结构

    它的意思很明确,就是得到这个结构的地址,看一下ExFastRefGetObject:
    名称:  QQ截图20110920102706.jpg查看次数: 4429文件大小:  45.7 KB


    只是简单地和一个常量进行了与运算

    好了,我们理清思路:
      PspCreateProcessNotifyRoutine数组中保存的是 PEX_CALLBACK 类型的结构地址数组;
      EX_CALLBACK结构中只有一个成员,就是 RoutineBlock ,它是一个 EX_FAST_REF 结构;
      EX_FAST_REF是一个联合,我们这里简单地将之视为一个指针;
      省略掉中间步骤, PspCreateProcessNotifyRoutine 保存的就是指针数组;
      系统将数组中的指针传递给 ExFastRefGetObject,就得到了 PEX_CALLBACK_ROUTINE_BLOCK 结构地址,这个结构中保存这我们想要的回调例程地址;
      ExFastRefGetObject 将传进来的指针进行了与运算得到了 PEX_CALLBACK_ROUTINE_BLOCK 结构地址.

    好了,回想一下我们自己寻找回调地址的过程,我们没有进行最后的与运算而是直接将 PspCreateProcessNotifyRoutine 中的数据当成了结构的地址

    最后看一下那个神秘的常量:
    名称:  QQ截图20110920103707.jpg查看次数: 4412文件大小:  17.5 KB


    win32下被定义为7,先取反再与运算,也就是低3位清零

    我们回过头在用windbg看一下:
    名称:  QQ截图20110920092926.jpg查看次数: 4645文件大小:  34.7 KB

    对 0x9c79061f 进行运算得到了 0x9C790618, 看一下这里的数据:
    名称:  QQ截图20110920104138.jpg查看次数: 4404文件大小:  40.0 KB

    成功得到了注册的例程地址,我们在PT中验证一下:
    点击图片以查看大图图片名称: QQ截图20110920104306.jpg查看次数: 4408文件大小: 232.8 KB文件 ID : 60724


    如过想通过 PsSetCreateProcessNotifyRoutine 摘掉其他进程的回调,传参必须经过以上运算

    当然了,如果你直接将PspCreateProcessNotifyRoutine数组暴力清空也行,不过既然有相对优雅的方式,何乐而不为呢?


    ---------------------------------------------------------------------------------------------------------------------------

    练习实例

    看了上边的教程 以下是练习的过程 代码参考来源于WRK

    windbg中创建进程的回调函数数组实例如下:
    3: kd> dd nt!PspCreateProcessNotifyRoutine
    83f789a0  8d808a3f 8fe950b7 8fea577f 8fe81daf
    83f789b0  8fe3bff7 9c08feb7 a9345397 00000000
    以 a9345397 为例


    1.在PsSetCreateProcessNotifyRoutine函数中有如下代码
    PEX_CALLBACK_ROUTINE_BLOCK CallBack = ExReferenceCallBackBlock (&PspCreateProcessNotifyRoutine[i]);    //这里传入的是 83f789b8
    通过代码知道 ExReferenceCallBackBlock将回调数组的值转换为 我们需要的 PEX_CALLBACK_ROUTINE_BLOCK 结构 从而可以得到函数地址
    其中PEX_CALLBACK_ROUTINE_BLOCK结构定义如下:
    typedef struct _EX_CALLBACK_ROUTINE_BLOCK {
        EX_RUNDOWN_REF        RundownProtect;
        PEX_CALLBACK_FUNCTION Function;
        PVOID                 Context;
    } EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
    其中Function成员就是我们要的函数地址

    2.
    再来看看ExReferenceCallBackBlock函数定义
    PEX_CALLBACK_ROUTINE_BLOCK
    ExReferenceCallBackBlock (
        IN OUT PEX_CALLBACK CallBack        //CallBack是83f789b8
        )
    通过参数可以知道&PspCreateProcessNotifyRoutine[i]为 PEX_CALLBACK 类型
    这样就知道了回调函数数组中的元素PspCreateProcessNotifyRoutine[i]为 EX_CALLBACK 类型
    EX_CALLBACK结构定义如下:
    typedef struct _EX_CALLBACK {
        EX_FAST_REF RoutineBlock;
    } EX_CALLBACK, *PEX_CALLBACK;

     
     3.
    ExReferenceCallBackBlock函数中有以下代码:
    PEX_CALLBACK_ROUTINE_BLOCK CallBackBlock = ExFastRefGetObject (CallBack->RoutineBlock);        //CallBack->RoutineBlock的值是 a9345397
    可以看到通过ExFastRefGetObject得到了 我们想要的最终结果 PEX_CALLBACK_ROUTINE_BLOCK 结构
    传入的参数是RoutineBlock成员 也就是EX_FAST_REF结构
    EX_FAST_REF结构定义如下:
    typedef struct _EX_FAST_REF {
        union {
            PVOID Object;
    #if defined (_WIN64)
            ULONG_PTR RefCnt : 4;
    #else
            ULONG_PTR RefCnt : 3;
    #endif
            ULONG_PTR Value;
        };
    } EX_FAST_REF, *PEX_FAST_REF;


    4.再来看看ExFastRefGetObject函数中具体的转换过程
    NTKERNELAPI
    PVOID
    FORCEINLINE
    ExFastRefGetObject (
        __in EX_FAST_REF FastRef
        )
    {
        return (PVOID) (FastRef.Value & ~MAX_FAST_REFS);    //FastRef.Value的值是 a9345397
    }
    仅仅只有一句代码 简单的逻辑运算
    其中MAX_FAST_REFS定义是
    #if defined (_WIN64)
    #define MAX_FAST_REFS 15
    #else
    #define MAX_FAST_REFS 7
    #endif
    这里是WIN7 32位 所以MAX_FAST_REFS的值为7


    5.MAX_FAST_REFS为7 二进制是111 ~MAX_FAST_REFS二进制则是000 所以代码相当于 FastRef.Value & 000 把FastRef.Value二进制的最后三位置为0
    a9345397 & ~7 = A9345390 这里的结果是一个PEX_CALLBACK_ROUTINE_BLOCK结构 是我们一直想要的 然后看看他的第二个成员 Function
    windbg运行结果如下:
    3: kd> dd A9345390
    a9345390  00000010 9cd63f40 00000000 000ca0e8
    可以看到是 9cd63f40 和 工具里边的值对比是一样的 由此得到了真正的函数地址


    6.总结一下 过程感觉很漫长 其实就2步 要想得到PspCreateProcessNotifyRoutine 回调数组的某个函数地址
    实例:
    3: kd> dd nt!PspCreateProcessNotifyRoutine
    83f789a0  8d808a3f 8fe950b7 8fea577f 8fe81daf
    83f789b0  8fe3bff7 9c08feb7 a9345397 00000000
    比如这里的   9c08feb7 或 8fe3bff7 或 8fe81daf 等等。。这里用XXX来代替

    第一步:YYY=XXX & ~7
    第二步: *((PULONG)YYY+1) 就是函数地址了
    当然这里是伪代码 而且是32位系统
    展开全文
  • 易语言调用API之进程线程函数

    千次阅读 2020-06-15 09:23:25
    进程线程是我们制作游戏外挂重点,设计多线程进程的控制。 API之进程线程函数 CancelWaitableTimer 这个函数用于取消一个可以等待下去计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信一个...

    进程和线程是我们制作游戏外挂的重点,设计多线程,进程的控制。

    API之进程和线程函数

    CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 
    CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 
    ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 
    CreateEvent 创建一个事件对象 
    CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用(收件人) 
    CreateMutex 创建一个互斥体(MUTEX) 
    CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 
    CreatePipe 创建一个匿名管道 
    CreateProcess 创建一个新进程(比如执行一个程序) 
    CreateSemaphore 创建一个新的信号机 
    CreateWaitableTimer 创建一个可等待的计时器对象 
    DisconnectNamedPipe 断开一个客户与一个命名管道的连接 
    DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄 
    ExitProcess 中止一个进程 
    FindCloseChangeNotification 关闭一个改动通知对象 
    FindExecutable 查找与一个指定文件关联在一起的程序的文件名 
    FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 
    FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化 
    FreeLibrary 释放指定的动态链接库 
    GetCurrentProcess 获取当前进程的一个伪句柄 
    GetCurrentProcessId 获取当前进程一个唯一的标识符 
    GetCurrentThread 获取当前线程的一个伪句柄 
    GetCurrentThreadId 获取当前线程一个唯一的线程标识符 
    GetExitCodeProces 获取一个已中断进程的退出代码 
    GetExitCodeThread 获取一个已中止线程的退出代码 
    GetHandleInformation 获取与一个系统对象句柄有关的信息 
    GetMailslotInfo 获取与一个邮路有关的信息 
    GetModuleFileName 获取一个已装载模板的完整路径名称 
    GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 
    GetPriorityClass 获取特定进程的优先级别 
    GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 
    GetProcessTimes 获取与一个进程的经过时间有关的信息 
    GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 
    GetSartupInfo 获取一个进程的启动信息 
    GetThreadPriority 获取特定线程的优先级别 
    GetTheardTimes 获取与一个线程的经过时间有关的信息 
    GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 
    LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间 
    LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间 
    LoadModule 载入一个Windows应用程序,并在指定的环境中运行 
    MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足,则立即返回 
    SetPriorityClass 设置一个进程的优先级别 
    SetProcessShutdownParameters 在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序 
    SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 
    SetThreadPriority 设定线程的优先级别 
    ShellExecute 查找与指定文件关联在一起的程序的文件名 
    TerminateProcess 结束一个进程 
    WinExec 运行指定的程序

    源文:易语言 API之进程和线程函数

    展开全文
  •  ●CreateProcess 创建进程函数  ○ 当CreateProcess被一个线程调用时,系统会创建一个进程内核对象,进程内核对象并不代表进程本身,它是操作系统,用来管理这个进程数据结构,该数据结构中有一个使用计数,会...
  • (1)int pthread_create(pthread_t*thread,...功能:创建一个新的进程,并将线程加入到当前进程 返回值:线程创建函数创建成功返回0,失败返回相关错误代码; 参数: thread:指向线程标识符指针 tattr:设置...
  • 概述线程是程序中完成一个独立任务完整执行序列,即一个可调度实体;进程相当于运行中程序一种抽象。...当进程的一个内核线程获得CPU使用权时,它就加载并运行一个用户线程。可见,内核线程...
  • 线程的概念 每个进程都拥有自己的数据段、代码段和堆栈段,这就造成进程在进行创建、切换、撤销操作时,需要较大的系统开销 为了减少系统开销, 从进程中演化出了线程 线程存在于进程中, 共享进程的资源 ...
  • 进程线程函数

    2012-08-17 10:42:20
    CallNamedPipe 这个函数由一个希望通过管道通信一个客户进程调用 ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 CreateEvent 创建一个事件对象 CreateMailslot 创建一个邮路。...
  • 创建于 2012-08-28 迁移自个人百度空间 ...1、注册进程退出时处理函数:    #include &lt;stdlib.h&gt;  int atexit( void (*fun)(void));   2、注册线程退出时处理函数:    ...
  • windows线程创建函数

    2014-07-07 09:01:10
    CreateThread是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要...
  • HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpsa,   DWORD cbStack,   LPTHREAD_START_ROUTINE lpStartAddr,   LPVOID lpvThreadParam, ...一、这个函数创建一个线程在调用进程的地址
  • 什么是进程进程的特点是什么?进程和程序的区别是什么?如何创建守护进程线程的定义?线程的优缺点?进程线程的区别是什么?linux环境下线程和进程相关的函数有哪些
  • API 进程线程函数

    2016-06-25 14:24:00
    CallNamedPipe 这个函数由一个希望通过管道通信一个客户进程调用 ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接 CreateEvent 创建一个事件对象 CreateMailslot 创建一个邮路。返回...
  • API之进程线程函数

    2010-10-07 15:45:00
    文档标题:API之进程线程函数 作者: 九头鸟 <br />关 键 字:API之进程线程函数 <br />CancelWaitableTimer 这个函数用于取消一个可以等待下去计时器操作 CallNamedPipe 这个函数由一个希望...
  • 1.进程线程的区别 ...而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 线程之间的通信更方便,同一进程下的...
  • 他从已经存在的进程创建一个新的进程的进程称为子进程,原进程称为父进程进程基本是父进程的一个复制品 #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #...
  • API之进程线程函数 CancelWaitableTimer 这个函数用于取消一个可以等待下去计时器操作  CallNamedPipe 这个函数由一个希望通过管道通信一个客户进程调用  ConnectNamedPipe 指示一台服务器等待下去,直至...
  • 在用户空间我们可以通过...现在通过分析sys_fork()和clone()的异同来看进程线程的区别。本文是基于5.0版本的Linux内核。 首先看一下sys_fork(),定义在kernel\fork.c文件中: SYSCALL_DEFINE0(fork) { #if
  • 简要说明: fork创建一个新的进程... waitpid使父进程获得子进程的退出状态,pthread_join可以使进程中的任一线程获得其他线程的退出状态,两者均是阻塞的 atexit用于注册进程的终止处理程序,pthread_cancel_p...
  • main 函数在启动时,会在JVM中启动一个进程,而mian函数所在的线程就是这个进程一个线程,也称为主线程。 Runnable 接口创建线程 实现 Runnable 接口 run 方法 Runnable runnable = () -> System...
  • API之进程线程函数 CancelWaitableTimer 这个函数用于取消一个可以等待下去计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信一个客户进程调用 ConnectNamedPipe 指示一台服务器等待下去,直至...
  • 一个MFC做的服务器在winsever 2003上跑了3个星期,今天突然发现CPU...1、重启进程,启动后CPU占用率0%,说明代码逻辑并无问题,因为每个线程的代码都是一样的 2、做了一个demo在本地模拟运行  demo流程:1、在UI线程用
  • 目录 一、 守护进程 1.1进程组 1.2会话 1.3创建守护进程的步骤 ...2.3 获取当前线程的线程ID pthread_self 2.4 线程退出pthread_exit 2.5 回收子线程资源 pthread_join 2.6 线程分离 pthread_d...
  • 《ARM 嵌入式 Linux系统开发详解》弓雷,讲看不明白。经网上百度后谈下个人看法: 根据代码打印来看,fork函数创建...1、分叉操作在时间线(timeline)上创建了一个分支,最后得到了两个独立存在的进程。幸好进...
  • 创建进程(1)Linux中创建进程的方式(3)0号进程和1号进程(init进程)(2)创建子进程(3)fork函数的工作流程(4)fork函数执行后,父子进程主要异同点2.父子进程共享文件3.fork用法4.vfork函数 1.创建进程 (1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,078
精华内容 1,631
关键字:

创建进程线程的函数