如何在fork()中的一个子进程中执行多个任务

时间:2017-11-08 16:09:27

标签: c multiprocessing fork

如何使用用户指定的动态no线程为此函数执行多线程

1 个答案:

答案 0 :(得分:0)

以下提议的代码:

  1. 将评论纳入OP问题
  2. 干净地编译
  3. 演示如何执行计数循环
  4. 演示了如何检查从系统函数malloc()scanf()
  5. 返回的错误
  6. 演示了如何处理来自fork()
  7. 的返回值
  8. 演示了如何避免“魔术”。编号
  9. 记录每个头文件包含的原因
  10. 现在建议的代码:

    #include <stdio.h>    // printf(), scanf(), perror()
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    #include <unistd.h>   // fork(), execvp()
    #include <sys/types.h>
    #include <sys/wait.h> // waitpid()
    
    
    // prototypes
    void mandelseries(int);
    
    
    #define MAX_STR_LEN  15
    #define ARRAY_SIZE   16
    
    
    void mandelseries(int numImages)
    {
        pid_t child[ numImages ];
    
        for( int i = 0; i < numImages; i++ )
        {
            child[i] = fork();
            switch( child[i] )
            {
                case -1:
                    perror( "fork failed" );;
                    break;
    
                case 0:   // child
                    {
                        char **argarry = malloc( ARRAY_SIZE * sizeof( char* ) );
                        if( !argarry )
                        {
                            perror( "malloc for arg array failed" );
                            exit( EXIT_FAILURE );
                        }
    
                        // implied else, malloc successful
    
                        // ... fill in arguments here
    
                        execvp( argarry[0], argarry);
                        perror( "execvp failed" );
                        exit( EXIT_FAILURE );
                    }
                    break;
    
                default:   // parent
                    break;
            } // end switch()
        }
    
        for( int i=0; i < numImages; i++ )
        {
            int status;
    
            if( -1 != child[i] )
            {
                waitpid(child[i], &status, 0);
            }
        }
    }
    
    
    int main( void )
    {
        int numImages;
        printf("Enter number of times:");
    
        if( 1 != scanf("%d", &numImages) )
        {
            perror( "scanf failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        mandelseries(numImages);
        exit(0);
    }