2016-04-04 11 views
3

OpenMPループで実行可能ファイルを実行したい。 私は次のコードでそれを実行しようとしました:OpenMPループでexecvを呼び出す

#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で生成することができます:タスクのスクリプトは非常に単純なbashスクリプトである

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関数は、最初のスレッド(私の例では第三1)によって呼び出されたとき、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

また、「現在のプロセスを置き換える」とは、 'execv()'(または他の 'execve()'ラッパー関数を呼び出す以外のスレッドをすべて破壊することです)。この場合、 'system()'の使用を推奨する傾向があります。なぜなら、フロントエンドでもう少しセットアップが必要になるからです。 –

+0

こんにちは!ご回答どうもありがとうございました。私はそれが動作するはずだと思うが、別の問題があります:スクリプト "タスク"は2つの最初のスレッドでのみ実行されるようです。最後の2つは、次のエラーが表示されます。そのようなファイルやディレクトリはありません。なぜなのかご存知ですか? – Aleph

+1

@Aleph: 'strace'コマンドはあなたの友人になります。 'strace -f -ff -o hellotrace hello'を実行します。各スレッドとプロセスのトレースファイルが生成されます。次に、生成されたトレースファイルを読み取ります。 –