精华内容
下载资源
问答
  • 易语言调用API之进程线程函数

    千次阅读 2020-06-15 09:23:25
    API之进程线程函数 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 运行指定的程序

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

    展开全文
  •  进程线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程线程的区别在于:  简而言之,一个程序至少有一个进程,一个进程至少有一个线程。  线程的划分尺度...

    区别:      
          进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
          简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
          线程的划分尺度小于进程,使得多线程程序的并发性高。
          另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
          线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行入口顺序执行序列程序出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
          从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
          进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
          线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
          一个线程可以创建和撤销另一个线程。同一个进程中的多个线程之间可以并发执行。

          进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
          进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

    通讯:
          进程:  管道/FIFO/共享内存/消息队列/信号/
    以上几种方式的比较:    
          1.管道:速度慢,容量有限,只有父子进程能通讯。 常见的单向进程间通信机制,发送信息的为发送进程,接受信息的为接受进程。管道通信的中间介质为文件,这样的文件为管道文件。
          2.FIFO:任何进程间都能通讯,但速度慢    
          3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 。 消息队列的中间介质是消息缓冲区,消息队列最大的缺点是需要不断的复制消息。
          4.信号量:不能传递复杂消息,只能用来同步    
          5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。 该方法需要有外部通信协议、同步或者互斥机制来进行配合使用才能保证通信的有效性和正确性。

          线程间同步的方法:互斥量、信号量、事件,临界区(critical section)
          临界区(critical section),保证在某一时刻只有一个线程能访问数据的简便办法。 使用临界区域的第一个忠告就是不要长时间锁住一份资源。临界区域的一个缺点就是:Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。使用临界区域的第一个忠告就是不要长时间锁住一份资源
          用事件来同步线程是最具弹性的,一个事件有激发态和非激发态。事件又分两种类型:手动重置事件和自动重置事件。一般使用自动重置事件来进行线程的同步。事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。
          互斥量和临界区很相似,但是Mutex花费的时间比Critical section大。互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享
          信号量允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
           Mutex是核心对象,系统级的, Event、Semaphore也是,可以跨进程使用。 只有Critical section是进程级的,也就是说他可能利用进程内的一些标志来保证该进程内的线程同步。


    posix多线程函数:

    pthread_create函数
    pthread_create函数的作用是创建一个线程,其原型如下:
    int pthread_create(pthread_t *thread,  pthread_attr_t *attr,  void *(*start_routine)(void *),  void *arg);
    参数thread: 如果创建线程成功,标识本线程的唯一标识符通过本变量返回给函数调用者;
    参数attr: 调用者通过该参数描述期望创建的线程具有什么样的属性,传入NULL表示使用默认属性;
    参数start_routine:线程的运行实体;
    参数arg: 传递给线程实体的参数;
    返回值: 0成功,非0为错误码;

    pthread_exit函数
    pthread_exit函数的作用是结束本线程,类似于进程中的exit函数,其原型如下:
    void pthread_exit(void *retval);
    参数retval: 用于向其他线程传递数据;

    pthread_join函数
    pthread_join函数的作用是等待另外某一个线程结束,其原型如下:
    int pthread_join(pthread_t th, void **thread_return);
    参数th: 描述等待哪一个线程结束,其取值为pthread_create函数第一个参数的返回值;
    参数thread_return:被等待线程结束时的返回值,等于pthread_exit函数的参数;

    pthread_attr_init函数
    pthread_attr_init函数的作用是初始化pthread_attr_t结构,用户在调用其他函数设置结构中的参数前,必须先调用本函数对结构进行初始化,其原型为:
    int pthread_attr_init(pthread_attr_t *attr);
    参数attr: 待初始化的pthread_attr_t结构;
    返回值: 0,成功,非0,失败;

    pthread_attr_destroy函数
    pthread_attr_destroy函数的作用是释放pthread_attr_t结构占用的资源,pthread_attr_t结构经过初始化和其他函数设置后可能会占用某些资源,本函数的作用就是释放这些资源,一般在pthread_attr_t结构使用完毕后调用本函数,其原型为:
    void pthread_attr_destroy(pthread_attr_t *attr);
    参数attr: 待释放的pthread_attr_t结构;
    返回值: 0,成功,非0,失败;

    pthread_mutex_init函数
    pthread_mutex_init函数的作用是生成一个互斥量,原型为:
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
    参数mutex: 返回指向互斥量的指针;
    参数mutexattr: 设置互斥量的属性,NULL表示使用默认属性,在默认属性下,系统不会检查是否存在死锁,例如同一个线程连续两次调用上锁函数就会发生死锁;
    返回值: 0成功,非0失败;

    pthread_mutex_lock函数
    pthread_mutex_lock函数的作用是对一个互斥量上锁,原型为:
    int pthread_mutex_lock(pthread_mutex_t *mutex));
    参数mutex: 指向待上锁的互斥量;
    返回值: 0成功,非0失败;

    pthread_mutex_unlock函数
    pthread_mutex_unlock函数的作用是对一个互斥量解锁,原型为:
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    参数mutex: 指向待解锁的互斥量;
    返回值: 0成功,非0失败;

    pthread_mutex_destroy函数
    pthread_mutex_destroy函数的作用是释放一个互斥量,原型为:
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    参数mutex: 指向待释放的互斥量;
    返回值: 0成功,非0失败;

    pthread_attr_setdetachstate函数
    pthread_attr_setdetachstate函数的作用是设置线程的detachedstate属性,可以取值PTHREAD_CREATE_JOINABLE和PTHREAD_CREATE_DETACHED,前者是默认值,表示其他线程可以使用pthread_join函数等待本线程结束,后者表示其他线程不可以对本线程使用pthread_join,其原型为:
    int pthread_attr_setdetachstate(pthread_attr_t *attr, int state);
    参数attr: 待设置的pthread_attr_t结构;
    参数state: 取值PTHREAD_CREATE_JOINABLE或PTHREAD_CREATE_DETACHED,表示期望的属性值;
    返回值: 0成功,非0失败;

    pthread_attr_getdetachstate函数
    pthread_attr_getdetachstate函数的作用是获取pthread_attr_t结构中的detachedstate属性,原型如下:
    int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数detachstate:属性的返回值;
    返回值: 0成功,非0失败;

    pthread_attr_setschedpolicy函数
    pthread_attr_setschedpolicy函数的作用是设置schedpolicy属性,即线程调度算法。schedpolicy属性值可以是SCHED_RR、SCHED_FIFO、SCHED_OTHER,其中SCHED_RR表示轮训调度,SCHED_FIFO表示先进先出调度,SCHED_OTHER表示其他。拥有管理员权限的进程才可以创建具有SCHED_RR或SCHED_FIFO调度算法的线程,一般线程的默认调度算法都是SCHED_OTHER。函数原型为:
    int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
    参数attr: 待设置的pthread_attr_t结构;
    参数policy: 取值SCHED_RR、SCHED_FIFO或SCHED_OTHER;
    返回值: 0成功,非0失败;

    pthread_attr_getschedpolicy函数
    pthread_attr_getschedpolicy函数的作用是获取pthread_attr_t结构中的schedpolicy属性,原型如下:
    int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数detachstate:属性的返回值;
    返回值: 0成功,非0失败;

    pthread_attr_setschedparam函数
    pthread_attr_setschedparam函数的作用是设置某调度算法下的具体调度参数,原型如下:
    int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
    参数attr: 待设置的pthread_attr_t结构;
    参数param: 调度参数,具体参见相关手册;
    返回值: 0成功,非0失败;

    pthread_attr_getschedparam函数
    pthread_attr_getschedparam函数的作用是获取pthread_attr_t结构中的调度参数,原型如下:
    int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数param: 调度参数的返回值;
    返回值: 0成功,非0失败;

    pthread_attr_setinheritsched函数
    pthread_attr_setinheritsched函数的作用是设置线程调度算法的继承特性,可以取值PTHREAD_EXPLICIT_SCHED或PTHREAD_INHERIT_SCHED,前者表示使用结构pthread_attr_t指定的调度算法,后者表示继承父线程使用的调度算法,默认为前者,原型如下:
    int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
    参数attr: 待设置的pthread_attr_t结构;
    参数policy: 取值PTHREAD_EXPLICIT_SCHED或PTHREAD_INHERIT_SCHED;
    返回值: 0成功,非0失败;

    pthread_attr_getinheritsched函数
    pthread_attr_getinheritsched函数的作用是获取pthread_attr_t结构中的继承属性,原型如下:
    int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数inherit: 继承属性的返回值;
    返回值: 0成功,非0失败;

    pthread_attr_setscope函数
    pthread_attr_setscope函数的作用是设置线程的在什么范围内竞争CPU资源,可以取值PTHREAD_SCOPE_SYSTEM或PTHREAD_SCOPE_PROCESS,前者表示在整个系统内竞争CPU资源,后者表示在同一进程内竞争CPU资源,默认为前者,原型如下:
    int pthread_attr_setscope(pthread_attr_t *attr, int scope);
    参数attr: 待设置的pthread_attr_t结构;
    参数policy: 取值PTHREAD_SCOPE_SYSTEM或PTHREAD_SCOPE_PROCESS;
    返回值: 0成功,非0失败;

    pthread_attr_getscope函数
    pthread_attr_getscope函数的作用是获取pthread_attr_t结构中的CPU竞争范围属性,原型如下:
    int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数scope: 竞争范围的返回值;
    返回值: 0成功,非0失败;

    设置或获取线程栈的大小
    某些系统可能不支持设置或获取线程栈,只有定义了_POSIX_THREAD_ATTR_STACKSIZE宏的系统才支持上述功能,具体由两个函数提供:
    pthread_attr_setstacksize函数
    pthread_attr_setstacksize函数的作用是设置线程栈的大小,单位是字节,在默认情况下线程的栈是比较大的,原型如下:
    int pthread_attr_setstacksize(pthread_attr_t *attr, int size);
    参数attr: 待设置的pthread_attr_t结构;
    参数size: 栈的大小,单位为字节;
    返回值: 0成功,非0失败;

    pthread_attr_getstacksize函数
    pthread_attr_getstacksize函数的作用是获取pthread_attr_t结构中的栈的大小,原型如下:
    int pthread_attr_getstacksize(const pthread_attr_t *attr, int *size);
    参数attr: 待获取属性的pthread_attr_t结构;
    参数size: 栈大小的返回值;
    返回值: 0成功,非0失败;

    pthread_cancel函数
    pthread_cancel函数的作用是关闭另外一个线程,原型如下:
    int pthread_cancel(pthread_t thread);
    thread参数: 线程标识,描述关闭哪一个线程;
    返回值: 0成功,非0失败;

    pthread_setcancelstate函数
    pthread_setcancelstate函数的作用是设置本线程是否允许被其他线程关闭,原型如下:
    int pthread_setcancelstate(int state, int *oldstate);
    参数state: 可以取值PTHREAD_CANCEL_ENABLE或PTHREAD_CANCEL_DISABLE,前者表示允许被其他线程关闭,后者表示不允许,默认为前者;
    参数oldstate: 返回设置之前的本属性值;
    返回值: 0成功,非0失败;

    pthread_setcanceltype函数
    pthread_setcanceltype函数的作用是设置本线程被其他线程关闭时,以什么方式关闭,原型如下:
    int pthread_setcanceltype(int type, int *oldtype);
    参数type: PTHREAD_CANCEL_ASYNCHRONOUS或PTHREAD_CANCEL_DEFERRED,前者表示被立刻关闭,后者表示等线程被阻塞时再关闭,默认为后者;
    参数oldtype: 返回设置之前的本属性值;
    返回值: 0成功,非0失败;

    sem_init函数
    sem_init函数的作用是生成一个旗语变量,并初始化该变量,原型为:
    int sem_init(sem_t *sem, int pshared, unsigned int value);
    参数sem: 返回指向旗语变量的指针;
    参数pshared: 0用于本进程内,非0用于进程间,所以在线程间使用时一般设置为0;
    参数value: 旗语的初始值;
    返回值: 0成功,非0失败;

    sem_wait函数
    sem_wait函数是一个原子操作,如果旗语变量大于0,则将旗语变量减1,然后立刻返回;如果旗语变量小于等于0,则将线程阻塞,直到旗语变量大于0,原型为:
    int sem_wait(sem_t * sem);
    参数sem: 指向待操作的旗语变量;
    返回值: 0成功,非0失败;

    sem_post函数
    sem_post函数也是一个原子操作,将旗语变量加1,如果旗语变量大于0,则唤醒对应的阻塞线程,原型为:
    int sem_post(sem_t * sem);
    参数sem: 指向待操作的旗语变量;
    返回值: 0成功,非0失败;

    sem_destroy函数
    sem_destroy函数的作用是释放一个旗语变量,原型为:
    int sem_destroy(sem_t * sem);
    参数sem: 指向待释放的旗语变量;
    返回值: 0成功,非0失败,如果有线程阻塞在该旗语变量上,释放函数会失败;
    展开全文
  • API之进程线程函数 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://pan.baidu.com/s/1k6LuHvrkj3tmiyk6KTd98A
     

    展开全文
  • 泉注:这是我正准备做无线传感器网络仿真平台时查的一些资料,先转帖过来,以后再结合自己的开发经验,写一些Linux下多进程编程的... 2007-05-22 | 创建进程CreateProcess函数----windows 核心编程 标签: 进程 线程
    泉注:这是我正准备做无线传感器网络仿真平台时查的一些资料,先转帖过来,以后再结合自己的开发经验,写一些Linux下多进程编程的东西,o(∩_∩)o...

     

    2007-05-22 | 创建进程CreateProcess函数----windows 核心编程

    标签: 进程  线程  搜索  数据结构  参数 

        当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1。 该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然 后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L文件的代码和数据加载到该进程的地址空间中。 然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执 行C / C + +运行期启动代码,该主线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。如果系统成功地创建了新进程和主线程, CreateProcess便返回TRUE。

        当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1。

        该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然 后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L文件的代码和数据加载到该进程的地址空间中。

        然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执 行C / C + +运行期启动代码,该主线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。如果系统成功地创建了新进程和主线程, CreateProcess便返回TRUE。

     

    1 pszApplicationName和p s z C o m m a n d L i n e

       pszApplicationName和pszCommandLine参数分别用于设定新进程将要使用的可执行文件的名字和传递给新进程的命令行字符串

        pszCommandLine参数的原型是PTSTR。这意味着CreateProcess期望你将传递一个非常量字符串的地址。从内部来讲, CreateProcess实际上并不修改你传递给它的命令行字符串。不过,在CreateProcess返回之前,它将该字符串恢复为它的原始形式。

        如果命令行字符串不包含在文件映象的只读部分中,就会出现违规访问的问题。解决这个问题的最好办法是在调用CreateProcess之前像下面这样将常 量字符串拷贝到临时缓存中。当CreateProcess分析pszCommandLine字符串时,它将查看字符串中的第一个标记,并假设该标记是想运 行的可执行文件的名字。如果可执行文件的文件名没有扩展名,便假设它的扩展名为.exe。CreateProcess也按下面的顺序搜索该可执行文件:

    1) 包含调用进程的. e x e文件的目录。

    2) 调用进程的当前目录。

    3) Wi n d o w s的系统目录。

    4) Wi n d o w s目录。

    5) PAT H环境变量中列出的目录。

        如果文件名包含全路径,系统将使用全路径来查看可执行文件,并且不再搜索这些目录。如果系统找到了可执行文件,那么它就创建一个新进程,并将可执行文件的代码和数据映射到新进程的地址空间中。然后系统将调用C / C + +运行期启动例程。

        这一切都是在pszApplicationName参数是NULL(99%以上的时候都应该属于这种情况)时发生的。如果不传递NULL,可以将地址传递 给pszApplicationName参数中包含想运行的可执行文件的名字的字符串。请注意,必须设定文件的扩展名,系统将不会自动假设文件名有一个. exe扩展名。CreateProcess假设该文件位于当前目录中,除非文件名前面有一个路径。如果在当前目录中找不到该文件, CreateProcess将不会在任何其他目录中查找该文件,它运行失败了。

     

    2 psaProcess、psaThread和binheritHandles

        可以使用psaProcess和psaThread参数分别设定进程对象和线程对象需要的安全性。可以为这些参数传递NULL,在这种情况下,系统为这些 对象赋予默认安全性描述符。也可以指定两个SECURITY_ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进 程对象和线程对象。

        将SECURITY_ATTRIBUTES结构用于psaProcess和psaThread参数的另一个原因是,父进程将来生成的任何子进程都可以继承这两个对象句柄中的任何一个。

     

    3 fdwCreate

        fdwCreate参数用于标识标志,以便用于规定如何来创建新进程。

     

    4 pvEnvironment

        pvEnvironment参数用于指向包含新进程将要使用的环境字符串的内存块。在大多数情况下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。也可以使用GetEnvironmentStrings函数。

        该函数用于获得调用进程正在使用的环境字符串数据块的地址。可以使用该函数返回的地址,作为CreateProcess的pvEnvironment参 数。如果为pvEnvironment参数传递NULL,那么这正是CreateProcess函数所做的操作。当不再需要该内存块时,应该调用 FreeEnvironmentString s函数将内存块释放。 

    5 pszCurDir

        pszCurDir参数允许父进程设置子进程的当前驱动器和目录。如果本参数是NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同。如果本 参数不是NULL,那么pszCurDir必须指向包含需要的工作驱动器和工作目录的以0结尾的字符串。注意,必须设定路径中的驱动器名。

     

     

    6 psiStartInfo

        psiStartInfo参数用于指向一个STARTUPINFO结构。

        当Windows创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将c b成员设置为该结构的大小。

        如果未能将该结构的内容初始化为零,那么该结构的成员将包含调用线程的堆栈上的任何无用信息。将该无用信息传递给CreateProcess,将意味着有 时会创建新进程,有时则不能创建新进程,完全取决于该无用信息。有一点很重要,那就是将该结构的未用成员设置为零,这样,CreateProcess就能 连贯一致地运行。不这样做是开发人员最常见的错误。

     

    7 ppiProcInfo

        ppiProcInfo参数用于指向你必须指定的PROCESS_INFORMATION结构。CreateProcess在返回之前要对该结构的成员进行初始化。

        在创建进程的时候,系统为每个对象赋予一个初始使用计数值1。然后,在createProcess返回之前,该函数打开进程对象和线程对象,并将每个对象 的与进程相关的句柄放入PROCESS_IN FORMATION结构的Process和hThread成员中。当CreateProcess在内部打开这些对象时,每个对象的使用计数就变为2。

        在系统能够释放进程对象前,该进程必须终止运行(将使用计数递减为1),并且父进程必须调用CloseHandle(再将使用计数递减1,使之变为0)。同样,若要释放线程对象,该线程必须终止运行,父进程必须关闭线程对象的句柄。

        注意:必须关闭子进程和它的主线程的句柄,以避免在应用程序运行时泄漏资源。当然,当进程终止运行时,系统会自动消除这些泄漏现象,但是,当进程不再需要 访问子进程和它的线程时,编写得较好的软件能够显式关闭这些句柄(通过调用CloseHandle函数来关闭)。不能关闭这些句柄是开发人员最常犯的错误 之一。

        由于某些原因,许多开发人员认为,关闭进程或线程的句柄,会促使系统撤消该进程或线程。实际情况并非如此。关闭句柄只是告诉系统,你对进程或线程的统计数据不感兴趣。进程或线程将继续运行,直到它自己终止运行。

        当进程内核对象创建后,系统赋予该对象一个独一无二的标识号,系统中的其他任何进程内核对象都不能使用这个相同的I D号。线程内核对象的情况也一样。当一个线程内核对象创建时,该对象被赋予一个独一无二的、系统范围的I D号。进程I D和线程I D共享相同的号码池。这意味着进程和线程不可能拥有相同的ID 。另外,对象决不会被赋予0 作为其I D。在CreateProcess返回之前,它要用这些ID填入PROCESS_INFORMATION结构的dwProcessId和dwThre adId成员中。

     

        应用程序使用I D来跟踪进程和线程,必须懂得系统会立即复用进程ID和线程ID系统无法记住每个进程的父进程的I D,但是,由于I D是被立即重复使用的,因此,等到获得父进程的I D时,该I D可能标识了系统中一个完全不同的进程。父进程可能已经终止运行。如果应用程序想要与它的“创建者”进行通信,最好不要使用I D。应该定义一个持久性更好的机制,比如内核对象和窗口句柄等。

        若要确保进程I D或线程I D不被重复使用,唯一的方法是保证进程或线程的内核对象不会被撤消。

     
    展开全文
  • 线程创建函数

    千次阅读 2016-07-14 16:52:37
    【参考1】CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别 =========================================================...1、CreateThread——Windows的API函数 2、_beginthreadex——MS对C Runti
  • 线程函数创建 取消 等待)

    千次阅读 2011-04-06 11:32:00
    1.创建线程创建线程函数定义如下:#include int pthread_create(pthread_t *restrict thread ,const pthread_attr_t *restrict attr,void *(*start_routine )(void*),void *restrict arg) ;参数thread...
  • 函数原型: NTSTATUS PsCreateSystemThread(  _Out_ PHANDLE ThreadHandle,  _In_ ULONG DesiredAccess,  _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,  _In_opt_ HANDLE ProcessHandle,  
  • 使用CreateThread函数创建线程

    万次阅读 多人点赞 2015-11-08 21:00:48
    线程进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个...在C/C++中可以通过CreateThread函数进程创建线程函数的具体格式如下: HANDLE CreateThread
  • 线程(一):创建线程线程的常用方法

    万次阅读 多人点赞 2018-09-01 19:14:23
    一:为什么要学多线程 应付面试 :多线程几乎是面试中必问的题,所以掌握一定的基础知识是必须的...二:进程线程 进程 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统...
  • 【转】VC中如何启动其它程序,并且获得启动程序的PID 创建进程CreateProcess函数 这样就可以执行c:\test.exe 如果你要的PID是进程ID那么这个 piProcInfoGPS.dwProcessId就是PID。 当一个线程调用...
  • C多线程编程以及线程函数

    万次阅读 多人点赞 2017-05-12 11:25:22
    线程(thread)函数结合信号量互斥锁等的应用实例。
  • linux下创建线程用到的函数和返回值

    千次阅读 2019-01-10 10:55:22
    (1)int pthread_create(pthread_t*thread,...功能:创建一个新的进程,并将线程加入到当前进程 返回值:线程创建函数创建成功返回0,失败返回相关错误代码; 参数: thread:指向线程标识符的指针 tattr:设置...
  • c++用类成员函数作为线程函数

    千次阅读 2018-12-22 12:19:10
    参考:... ... 当我们创建线程的时候 线程处理函数如果是类里面的成员函数会报错,需要以下处理。 当需要利用类成员函数( MyClass::thread_func )来创建线程时,需如下...
  • 线程(轻量级进程(LWP))概念: 线程就是一个执行流,创建一个线程就相当于在内核当中创建一个PCB(task_struct),创建出来的PCB当中的内存指针是指向进程的虚拟地址空间的。
  • 创建远程线程注入指定进程

    千次阅读 2011-09-24 00:20:31
    创建远程线程使用CreateRemoteThread函数,在创建线程前还需要使用WriteProcessMemory等函数线程 函数代码和参数写到目标进程空间中去. 关键API CreateRemoteThread 为指定进程创建线程,线程将会在其他进程的...
  • 函数原型: #include int pthread_create(pthread_t*thread,pthread_attr_t *attr, void * (*start_routine)(void *arg), void *arg);   ... 第三个参数是线程运行函数的地址。  最后一个
  • Linux多线程函数解析

    千次阅读 2011-12-28 22:36:40
    Linux多线程函数解析 Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();... pthread_create是UNIX环境创建线程函数 int pthread_create(  pthread_t *
  • 进程线程的区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    进程线程 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程线程 进程中的一个执行任务(控制单元),负责...
  • 在windows系统中创建线程函数有以下几个方法: CreadThread,AfxBeginThread,_beginthread,_beginthreadex。 一、CreateThread HANDLE WINAPI CreateThread( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, ...
  • 进程线程详解

    千次阅读 多人点赞 2018-10-11 09:44:14
    进程线程的详解 在面试中很喜欢问的一个问题就是: ...而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 ...
  • 进程线程中睡眠函数sleep被信号中断后失效,处理方式 很多时候根据程序运行需要,或者调试什么的,需要在程序中延时。当然一般应用的是sleep 函数 , 但是有些时候,如果不注意sleep的用法,那么在多线程编程中,...
  • 内核函数 内核线程创建

    千次阅读 2018-07-12 19:31:47
    struct task_struct *kthread_create(int (*threadfn)(void *data),void *data, const char namefmt[], ...)功能:创建一个内核线程threadfn:线程运行的函数data:传递给线程函数的参数namefmt: 进程名 在task-&...
  • 线程函数传递结构体

    千次阅读 2011-09-02 19:26:10
    /*thread_struct.c编写应用程序,创建线程,并向该线程处理函数传递以结构体*/ #include #include #include #include struct member {  int a;  char *s; }; /*线程执行函数*
  • 调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。 _beginthread 参数和返回值 unsigned long _beginthread( void(_cdecl *start_address)(void *), //声明为void (*start_address)(void *)形式 ,...
  • python 用map()函数创建线程任务

    千次阅读 2019-03-13 17:21:22
    python 用map()函数创建线程任务         对于多线程的使用,我们经常是用thread来创建,比较繁琐. 在Python中,...
  • 进程和线程的概念、区别及进程线程间通信

    千次阅读 多人点赞 2020-08-02 16:24:25
    进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的? 1. 基本概念: 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; 线程是进程的子...
  • 创建进程到进入main函数,发生了什么?

    千次阅读 多人点赞 2020-10-29 09:19:55
    这篇文章主要讨论的是操作系统层面上对于进程线程创建初始化等行为,而像Python、Java等基于解释器、虚拟机的语言,如何进入到main函数执行,这背后的路径则更长(包含了解释器和虚拟机内部的执行流程),以后有...
  • C语言-获得进程线程ID函数

    万次阅读 2013-06-18 23:22:49
    函数功能:取得进程识别码  相关函数:fork,kill,getpid  头文件:旧版本:unistd.h,在VC++6.0下可以用process.h  函数原型:旧的原型为pid_t getpid(void);,推荐使用int _getpid( void )...
  • 线程创建函数选择问题

    千次阅读 2011-08-14 23:32:14
    创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢? 参考了一些资料,写得都挺好的,这里做一些摘抄和整合。 【参考1】CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
  • 还是实验室蛋疼项目的需求催出来的东西,蛋疼要死,CS专业读研难道就等于干2-3年义工?? Linux实际上木有线程这玩意,具体到...所有的进程创建都是通过do_fork()内核函数来做的,所有进程销毁都是走do_exit(),系统

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 327,663
精华内容 131,065
关键字:

创建进程线程的函数