fork、execv 及 waitpid 的例子代码

 

//  $Id$
/*
*
* @file     waitpid_test.c
* @brief    waitpid 测试例子
*
* <br>版权所有&copy; 2004~2005,罗智勇 <br>
* All rights reserved. <br>

* @version  $Revision$
* @author   罗智勇
* @date     2006年10月13日 15:43:02
*
*/
#include 
< sys / wait.h >
#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< errno.h >

int  main( int  argc, const  char *  argv[])
{
    
int  status  =   0 ;
    pid_t ret_pid;
    pid_t child_pid;

    const 
char *  child_name  =   " test " ;
    const 
char *     default_child_argv[]  =  { child_name,  0  };
    const 
char **  child_argv  =  default_child_argv;
    
    fprintf(stdout, 
" waitpid test. v1.0 " );
    
    
if (argc  >=   2 ){
        child_name 
=  argv[ 1 ];
        child_argv 
=   & (argv[ 1 ]);
    }
else {
        fprintf(stdout, 
" Useage : %s [app_name [app_param]] " , argv[ 0 ]);
    }

    pid_t pid; 
    pid 
=  fork(); 

    
if  ( pid  <   0  ){ 
        perror( 
" Error in fork "  ); 
        
return   - 1 ;
    } 
else   if  ( pid  >   0  ){
        
//  父进程空间
        child_pid  =  pid; 
    }
else {
        
//  子进程空间
        fprintf( stderr,  " ---------------------------------- " );
        printf(
" Child PID is %ld " , ( long ) getpid());

#
if   1
        chdir( 
" /tmp "  ); 
        
// 设置文件权限掩码  
        umask(  0  ); 
        execv( child_name, (
char *  const * )child_argv );
        fprintf( stderr, 
" execv("%s"...) error. " , child_name);
        
return   - 1 ;
#
else     
        
if (argc  ==   1 )
            pause();
/*  Wait for signals  */
        _exit(atoi(argv[
1 ]));
#endif
    }

    
do {

        ret_pid 
=  waitpid( child_pid,  & status, WUNTRACED | WCONTINUED );  //  WNOHANG

        fprintf( stderr, 
" ---------------------------------- " );
        
if ( ret_pid  ==   - 1  )
        {
            fprintf( stderr, 
" waitpid error : (%d)%s " , errno, strerror(errno) );
            
return   - 1 ;
        }
else   if ( ret_pid  !=  child_pid ){
            fprintf( stderr, 
" waitpid abnormal, wait %d, but return %d, return val = %d. Error : (%d)%s "
                , child_pid , ret_pid, status
                , errno, strerror(errno) );
            
return   - 1 ;
        }

        
if ( WIFEXITED( status ) )
        {
            status 
=  WEXITSTATUS( status );
            fprintf(stderr, 
" The child return. Return value = 0x%x " , status);
            
break ;
        }
        
else   if (WIFSIGNALED(status))
        {
            fprintf( stderr, 
" Killed by signal 0x%x. Return value = 0x%x " , WTERMSIG(status), status);
#ifdef WCOREDUMP
            
if (WCOREDUMP(status))
                fprintf( stderr, 
"  The child produced a core dump. " );
#endif
            
break ;
        }
        
else   if (WIFSTOPPED(status))
        {
            
//  子进程暂停,继续等待
            fprintf(stderr,  " Stopped by signal %d " , WSTOPSIG(status));
        }
        
else
        {
#ifdef WIFCONTINUED
            
if (WIFCONTINUED(status))
                fprintf( stderr, 
" (Continued. " );
            
else
#endif
            {
                
//  子进程因为其它原因使 wait_pid 返回
                fprintf(stderr,  " waitpid exit. The reason is unknow. return value = 0x%x " , status);
            }
        }
    }
while ( 1 );

    
return  status;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值