Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > fork、execv 及 waitpid 的例子代码
【标  题】:fork、execv 及 waitpid 的例子代码
【关键字】:fork,execv,waitpid
【来  源】:http://blog.csdn.net/lzy0168/archive/2006/10/13/1333325.aspx

fork、execv 及 waitpid 的例子代码

Your Ad Here

 

// $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;
}

自制一个小巧的时钟(部分源代码)---VC:【上一篇】
一个简单的linux下网络程序实例-网络编程入门:【下一篇】
【相关文章】
  • fork()关于处理缓冲区问题!
  • fork函数
  • Apache中预创建Preforking MPM 机制剖析(2)
  • Apache中预创建Preforking MPM 机制剖析(3)
  • Linux程序设计入门 - fork, pthread, and signals
  • c语言fork、exec、wait
  • 有趣的 fork()函数
  • 认识fork()函数
  • 神奇的fork
  • linux下的execv与windows下的__execv
  • 【随机文章】
  • 上周技术关注:第16届JOLT大奖获奖名单公布
  • 从程序员角度看ELF
  • PHP安全编程之加密功能
  • Linux下播放gsm原始声音
  • apt的安装和简单用法
  • 我与海的爱恋
  • ORACLE常用傻瓜问题1000问(十三)
  • PS精巧教程5:手工着色
  • Nutch 使用之锋芒初试
  • stdlib.h
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.