那年,一步一步学linux c ---关于进程等待~

转自:http://blog.csdn.net/muge0913/article/details/7317452

那年,一步一步学linux c ---关于进程等待~

分类: 嵌入式linux c 编程 2193人阅读 评论(3) 收藏 举报



转载请注明出处:http://blog.csdn.net/muge0913/article/details/7317452


  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <sys/wait.h>
  4. void check_exit(int status);
  5. main()
  6. {
  7. pid_t pid;
  8. int status;
  9. if((pid = fork()) < 0)
  10. {
  11. printf("fork error!!\n");
  12. exit(0);
  13. }
  14. else if(pid == 0)
  15. {
  16. printf("child process exit\n");
  17. exit(0);
  18. }
  19. else
  20. {
  21. if(wait(&status) != pid)
  22. {
  23. printf("wait error!!");
  24. exit(0);
  25. }
  26. check_exit(status);
  27. }
  28. }
  29. void check_exit(int status)
  30. {
  31. if(WIFEXITED(status))
  32. printf("eixt\n");
  33. else if(WIFSIGNALED(status))
  34. printf("killed by signal\n");
  35. else if(WIFSTOPPED(status))
  36. printf("stopped by signal\n");
  37. else if(WIFCONTINUED(status))
  38. printf("continued");
  39. }
#include <sys/types.h>
#include <stdio.h>
#include <sys/wait.h>

void check_exit(int status);

main()
{
    pid_t pid;
    int status;
    if((pid = fork()) < 0)
    {
    printf("fork error!!\n");
    exit(0);
    }
    else if(pid == 0)
    {
    printf("child process exit\n");
    exit(0);
    }
    else
    {
        if(wait(&status) != pid)
        {
        printf("wait error!!");
        exit(0);
        }
        check_exit(status);
    }

}
void check_exit(int status)
{
    if(WIFEXITED(status))
        printf("eixt\n");
    
    else if(WIFSIGNALED(status))
        printf("killed by signal\n");
    else if(WIFSTOPPED(status))
        printf("stopped by signal\n");
    else if(WIFCONTINUED(status))
        printf("continued");
}



等待进程改变其状态。所有下面哪些调用都被用于等待子进程状态的改 变,获取状态已改变的子进程信息。状态改变可被认为是:1.子进程已终止。2.信号导致子进程停止执行。3.信号恢复子进程的执行。在子进程终止的情况 下,wait调用将允许系统释放与子进程关联的资源。如果不执行wait,终止了的子进程会停留在"zombie"状态。

如果发现子进程改变了状态,这些调用会立即返回。反之,调用会被阻塞直到子进程状态改变,或者由信号处理句柄所中断(假如系统调用没有通过sigaction的SA_RESTART标志重启动)。

wait 系统调用挂起当前执行中的进程,直到它的一个子进程终止。waitpid挂起当前进程的执行,直到指定的子进程状态发生变化。默认,waitpid只等待 终止状态的子进程,但这种行为可通过选项来改变。waitid系统调用对于等待哪个子进程状态改变提供了更精确的控制。

子进程已终 止,父进程尚未对其执行wait操作,子进程会转入“僵死”状态。内核为“僵死”状态的进程保留最少的信息量(进程标识,终止状态,资源使用信息),过后 父进程执行wait时可以获取子进程信息。只要僵死的进程不通过wait从系统中移去,它将会占据内核进程表中的一个栏位。如果进程表被填满,内核将不能 再产生新进程。如果父进程已终止,它的僵死子进程将由init进程收养,并自动执行wait将它们移去。

wait(等待子进程中断或结束)


  1. #include<sys/types.h>
  2. #include<sys/wait.h>
  3. pid_t wait (int * status);
    #include<sys/types.h>

    #include<sys/wait.h>

    pid_t wait (int * status);

函数说明

wait()会暂时停止目前进程的执行(挂起父进程),直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。如果调用wait的进程没有子进程则会调用失败,子进程的结束状态值请参考 waitpid( )

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值