2016-04-04 4 views
3

Я хотел бы запустить исполняемый файл в цикле OpenMP. Я пытался сделать это с помощью следующего кода:Вызов execv в цикле 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 

Сценарий задача является очень простой Баш скрипт:

#! /bin/sh 

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

И я запускаю свою программу следующим образом:

./hello 

из каталога, содержащего исполняемый файл «hello» и «task».

3

2

0

1

Hello, I am process 3

Please for me for 10 seconds...

Thank you!

Кажется, что когда execv функция вызывается первый поток (3-й один в моем примере), другие вызовы в execv пропускаются.

Кто-нибудь знает, в чем проблема?

Спасибо!

EDIT: новый код с системой

#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); 
    } 
} 

ответ

3

Функция execv заменит текущий процесс на новый, созданный с заданными параметрами функции.

Для достижения желаемого вам необходимо использовать system, или, может быть, пара fork/execv.

+3

И, чтобы быть понятным, «replac [ing] текущий процесс» включает в себя уничтожение всех его потоков, отличных от одного вызова 'execv()' (или любой другой функции 'execve()' wrapper). Я склонен предпочитать рекомендацию использовать 'system()' в этом случае, хотя, хотя на передней панели требуется немного больше настроек, похоже, что это будет проще для использования, представленного в вопросе. –

+0

Привет! Большое спасибо за ваш ответ. Я думаю, что он должен работать, но есть еще одна проблема: кажется, что сценарий «задача» выполняется только двумя первыми потоками. Для последних двух я получаю следующую ошибку: нет такого файла или каталога. Ты знаешь почему? – Aleph

+1

@Aleph: Команда 'strace' будет вашим другом. запустите 'strace -f -ff -o hellotrace hello'. Он будет генерировать файл трассировки для каждого из ваших потоков и процессов. Затем прочитайте полученные файлы трассировки. –

Смежные вопросы