Я хотел бы запустить исполняемый файл в цикле 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);
}
}
И, чтобы быть понятным, «replac [ing] текущий процесс» включает в себя уничтожение всех его потоков, отличных от одного вызова 'execv()' (или любой другой функции 'execve()' wrapper). Я склонен предпочитать рекомендацию использовать 'system()' в этом случае, хотя, хотя на передней панели требуется немного больше настроек, похоже, что это будет проще для использования, представленного в вопросе. –
Привет! Большое спасибо за ваш ответ. Я думаю, что он должен работать, но есть еще одна проблема: кажется, что сценарий «задача» выполняется только двумя первыми потоками. Для последних двух я получаю следующую ошибку: нет такого файла или каталога. Ты знаешь почему? – Aleph
@Aleph: Команда 'strace' будет вашим другом. запустите 'strace -f -ff -o hellotrace hello'. Он будет генерировать файл трассировки для каждого из ваших потоков и процессов. Затем прочитайте полученные файлы трассировки. –