linux进程处理

打印 上一主题 下一主题

主题 1536|帖子 1536|积分 4608

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.测试这样没意义,要向后加
wait等待进程竣事
1.

2.测试
发送非常竣事的信号,通过kill

二、子进程的采取
    对于子进程的竣事而言,都希望父进程能够知道并作出肯定的反应,通过 wait、waitpid 函数可以知道子进程是如何竣事的以及它的竣事状态码
    pid_t wait(int *status);
    功能:等待子进程竣事,并获取竣事状态码
    status:输出型参数,吸收竣事状态码
    返回值:竣事的子进程的ID
        1、如果全部子进程都还在运行,则壅闭
        2、如果有一个子进程竣事,立即返回该进程的竣事状态码和ID
        3、如果没有子进程返回-1
    WIFEXITED(status)
        判定进程是否是正常竣事,如果是返回真
    WEXITSTATUS(status)
        如果进程是正常竣事的,可以获取到准确的竣事状态码
    WIFSIGNALED(status)
        判定进程是否非常竣事,如果是返回真
    WTERMSIG(status)
        如果进程是非常竣事的,可以获取到杀死进程的信号
    
    pid_t waitpid(pid_t pid, int *status, int options);
    功能:等待采取指定的某个或某些进程
    pid:
        >0  等待该进程竣事
        0   等待同组的恣意进程竣事
        -1  等待恣意进程竣事,功能与wait等价
        <-1 等待abs(pid) 进程组中的恣意进程竣事
    status:输出型参数,吸收竣事状态码
    options:
        WNOHANG 非壅闭模式,如果当前没有子进程竣事,则立即返回0
        WUNTRACED 如果有子进程处于暂停态,返回该进程的状态
        WCONTINUED  如果有子进程从暂停态转为继续运行,返回该子进程的状态
    WIFSTOPPED(status)
        判定子进程是否转为暂停态,是返回真
    WSTOPSIG(status)
        获取导致子进程进入暂停态的信号
    WIFCONTINUED(status)
        判定子进程是否由暂停转为继续,是返回真
    int system(const char *command);
    功能:通过创建子进程去执行一个可执行文件
    返回值:子进程竣事后才返回
    注意:该函数底层调用了fork、vfork、exec、waitpid函数
  1. #include <stdio.h>
  2. #include<unistd.h>
  3. #include<sys/wait.h>
  4. #include<stdlib.h>
  5. #include<sys/types.h>
  6. #include<signal.h>
  7. //父进程收到信号会进来
  8. void sigchld(int num)
  9. {
  10.         //子进程结束的时候父进程会接收到SIGCHLD信号,就会进入注册的处理函数
  11.         int status=0;
  12.         pid_t pid =wait(&status);
  13.         printf("进程%d结束",pid);
  14.         //if(pid==-1) exit(0); //无效
  15.         if( WIFEXITED(status))
  16.         {
  17.                 printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));
  18.                
  19.                 }
  20.                 else{
  21.                         printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));
  22.                        
  23.         }
  24.        
  25. }
  26. int main(int argc,const char* argv[])
  27. {
  28.         signal(SIGCHLD,sigchld);
  29.         for(int i=0;i<10;i++)
  30.         {
  31.                 if(0==fork())
  32.                 {
  33.                         srand(i);
  34.                         printf("这是子进程%u i=%d\n",getpid(),i);
  35.                         sleep(rand()%8+3);//0-10
  36.                         if(i%2) kill(getpid(),9);//发信号当前信号,9        向当前进程发出异异常结束
  37.                         return i;
  38.                 }
  39.                 sleep(1);//防止信号还没来的及处理
  40.         }
  41.         for(;;)
  42.         {
  43.                 //父进程自己在干事情
  44.                 printf("*");//在缓冲区中????
  45.                 fflush(stdout);//刷新缓冲区
  46.                 sleep(1);
  47.                
  48.                 /*
  49.                 int status=-1;
  50.                 pid_t pid=wait(&status);
  51.                 if(-1==pid) break;
  52.                 printf("子进程%d结束了,status=%d\n",pid,status);
  53.         if( WIFEXITED(status))
  54.         {
  55.                 printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));
  56.                
  57.                 }
  58.                 else{
  59.                         printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));
  60.                        
  61.         }*/
  62.         }
  63.         printf("没有了子进程\n");
  64.         return 0;
  65. }
复制代码

2.
  1. #include <stdio.h>
  2. #include<unistd.h>
  3. #include<sys/wait.h>
  4. #include<stdlib.h>
  5. #include<sys/types.h>
  6. #include<signal.h>
  7. /*
  8. //父进程收到信号会进来
  9. void sigchld(int num)
  10. {
  11.         //子进程结束的时候父进程会接收到SIGCHLD信号,就会进入注册的处理函数
  12.         int status=0;
  13.         pid_t pid =wait(&status);
  14.         printf("进程%d结束",pid);
  15.         //if(pid==-1) exit(0); //无效
  16.         if( WIFEXITED(status))
  17.         {
  18.                 printf("是正常结束的,状态码是%d\n",   WEXITSTATUS(status));
  19.                
  20.                 }
  21.                 else{
  22.                         printf("该进程异常结束,被%d信号杀死", WTERMSIG(status));
  23.                        
  24.         }
  25.        
  26. }*/
  27. int main(int argc,const char* argv[])
  28. {
  29.   //        signal(SIGCHLD,sigchld);
  30.         for(int i=0;i<10;i++)
  31.         {
  32.                 if(0==fork())
  33.                 {
  34.                         srand(i);
  35.                         printf("这是子进程%u 父进程%u i=%d\n",getpid(),getppid(),i);
  36.                         sleep(rand()%8+3);//0-10
  37.                         if(i%2)
  38.                         {
  39.                                 exit(i);//发信号当前信号,9        向当前进程发出异异常结束
  40.                         }
  41.                         else
  42.                         {
  43.                                 kill(getpid(),20);       
  44.                         }
  45.                 //        return i;
  46.                 }
  47.                 sleep(1);//防止信号还没来的及处理
  48.         }
  49.         for(;;)
  50.         {
  51.                 //父进程自己在干事情
  52.                 printf("*");//在缓冲区中????
  53.                 fflush(stdout);//刷新缓冲区
  54.                
  55.                
  56.                
  57.                 int status=-1;
  58.                 pid_t pid=waitpid(0,&status,WNOHANG |WUNTRACED |WCONTINUED );
  59.                
  60.                
  61.         if(pid>0)
  62.         {
  63.                 if( WIFSTOPPED(status))
  64.                 {
  65.                 printf("子进程%d进暂停,导致的信号%d\n",pid,   WSTOPSIG(status));
  66.                
  67.                 }
  68.                 else if( WIFCONTINUED(status))
  69.                 {
  70.                         printf("子进%d程有暂停转为继续运行", pid);
  71.                        
  72.                 }
  73.                 else
  74.                 {
  75.                         printf("子进程%d结束,status=%d\n",pid,   WEXITSTATUS(status));       
  76.                 }
  77.         }
  78.         sleep(1);
  79.        
  80. }return 0;
  81. }
复制代码
3.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表