在OpenMP循环中调用execv

时间:2016-04-04 14:47:56

标签: c bash exec openmp

我想在OpenMP循环中运行可执行文件。 我尝试使用以下代码执行此操作:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <omp.h>

int main (int argc, char *argv[]) 
{
    #pragma omp parallel
    {
        int thread_id = omp_get_thread_num();

        char thread_name[4];
        sprintf(thread_name, "%d", thread_id);

        printf("%s\n", thread_name);

        char* arg[] = {"task", thread_name, NULL};
        execv("./task", arg); 

    }
}

可以使用gcc生成相应的可执行文件,如下所示:

gcc -fopenmp hello.c -o hello

任务脚本是一个非常简单的bash脚本:

#! /bin/sh

echo "Hello, I am process $1"
echo 'Please for me for 10 seconds...'
sleep 10
echo 'Thank you!'

我按照这样运行我的程序:

./hello

来自包含“hello”可执行文件和“任务”脚本的目录。

  

3

     

2

     

0

     

1

     

您好,我是流程3

     

请给我10秒钟......

     

谢谢!

似乎当第一个线程(在我的例子中为第3个线程)调用execv函数时,会跳过对execv的其他调用。

有人知道这里的问题是什么吗?

谢谢!

编辑:系统新代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <omp.h>

int main (int argc, char *argv[]) 
{
    #pragma omp parallel
    {
        int thread_id = omp_get_thread_num();

        char thread_name[4];
        sprintf(thread_name, "%d", thread_id);

        char command[50];

        strcat(command, "./task ");
        strcat(command, thread_name);

        system(command);
    }
}

1 个答案:

答案 0 :(得分:3)

函数execv将使用为函数提供的参数创建的新进程替换当前进程。

要实现您的目标,您应该使用system,或者可以使用fork / execv。{/ p>