Linux wait和waitpid和kill

来源:互联网 发布:淘宝商城专业托管 编辑:程序博客网 时间:2024/05/22 01:32

1. Linux wait

1) 功能:等待子进程中断或结束
2) 头文件
     #include<sys/types.h>
     #include<sys/wait.h>
3)  函数定义: pid_t wait (int * status);
4) 函数说明
    wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则 参数 status 可以设成 NULL。 子进程的结束状态值请参考 waitpid( ),如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回
5)返回值
     -1。失败原因存于 errno 中。

2. Linux waitpid

1) 功能:等待子进程中断或结束
2) 头文件
      #include<sys/types.h>
      #include<sys/wait.h>
3) 函数定义:  pid_t waitpid(pid_t pid,int * status,int options);
4) 函数说明
    waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回, 而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,其他数值意义如下:
    pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
    pid=-1 等待任何子进程,相当于 wait()。            
    pid=0     等待进程组识别码与目前进程相同的任何子进程。       
    pid>0     等待任何子进程识别码为 pid 的子进程。
    参数 option 可以为 0 或下面的 OR 组合:
    WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
    WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
    子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
    WIFEXITED(status)如果子进程正常结束则为非 0 值。
    WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
    WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
    WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
    WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
    WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
5) 返回值

    如果执行成功则返回子进程PID,如果有错误发生则返回-1。失败原因存于 errno 中。

3. wait与waitpid的区别

   waitpid提供了wait所没有的三个特性:
   1) waitpid使我们可以等待指定的进程
   2) waitpid提供了一个无阻塞的wait
   3) waitpid支持工作控制

 

4. SIGCHLD

      内核对子进程终止(SIGCHLD)信号的处理方法与其他信号有所区别。当进程检查出收到了一个子进程终止的信号时,缺省情况下,该进程 就象没有收到该信号似的,如果父进程执行了系统调用wait,进程将从系统调用wait中醒来并返回wait调用,执行一系列wait调用的后续操作(找 出僵死的子进程,释放子进程的进程表项),然后从wait中返回。SIGCHLD信号的作用是唤醒一个睡眠在可被中断优先级上的进程。如果该进程捕捉了这个 信号,就象普通信号处理一样转到处理例程。如果进程忽略该信号,那么系统调用wait的动作就有所不同,因为SIGCHLD的作用仅仅是唤醒一个睡眠在可被 中断优先级上的进程,那么执行wait调用的父进程被唤醒继续执行wait调用的后续操作,然后等待其他的子进程。 

      如果一个进程调用signal系统调用,并设置了SIGCHLD的处理方法,并且该进程有子进程处于僵死状态,则内核将向该进程发一个SIGCHLD信号。

 

5. Linux kill

1) 功能:用于向任何进程组或进程发送信号。

2) 头文件

   #include <sys/types.h>
   #include <signal.h>

3) 函数定义:int kill(pid_t pid, int sig);

4) 函数说明

    pid:可能选择有以下四种

            1) pid大于零时,pid是信号欲送往的进程的标识。
            2) pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
            3) pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
            4) pid小于-1时,信号将送往以-pid为组标识的进程。

    sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。

 

5) 返回值 

    成功执行时,返回0。

    失败返回-1,errno被设为以下的某个值

             EINVAL:指定的信号码无效(参数 sig 不合法)

             EPERM:权限不够无法传送信号给指定进程

             ESRCH:参数 pid 所指定的进程或进程组不存在

 

 

原创粉丝点击