2016-04-04 9 views
3

Ich möchte eine ausführbare Datei in einer OpenMP-Schleife ausführen. Ich versuchte es mit dem folgenden Code zu tun:Aufruf Exec in OpenMP-Schleife

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

    } 
} 

Die entsprechende ausführbare Datei kann mit gcc wie folgt generiert werden:

gcc -fopenmp hello.c -o hello 

Die Aufgabe Skript ist ein sehr einfacher Bash-Skript:

#! /bin/sh 

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

Und ich führe mein Programm so:

./hello 

aus einem Verzeichnis, das sowohl die ausführbare Datei "hallo" als auch das Skript "task" enthält.

3

2

0

1

Hello, I am process 3

Please for me for 10 seconds...

Thank you!

Es scheint, dass, wenn execv Funktion durch den ersten Thread (die dritte in meinem Beispiel), andere Anrufe execv werden übersprungen aufgerufen wird.

Weiß jemand, was das Problem hier ist?

Danke!

EDIT: neuer Code mit System

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

Antwort

3

Die Funktion execv wird den derzeitigen Prozess durch einen neuen mit den an die Funktion übergebenen Parametern erstellt ersetzen.

Um zu erreichen, was Sie wollen, sollten Sie system, oder vielleicht das Paar fork/execv verwenden.

+3

Und um klar zu sein, beinhaltet "Ersetzung des aktuellen Prozesses" die Zerstörung aller seiner Threads außer derjenigen, die 'execv()' (oder eine andere 'execve()' Wrapperfunktion) aufruft. Ich neige dazu, die Empfehlung zu bevorzugen, 'system()' in diesem Fall zu verwenden, denn obwohl es am Frontend etwas mehr Setup benötigt, sieht es so aus, als wäre es insgesamt einfacher für die in der Frage dargestellte Verwendung. –

+0

Hallo! Ich danke Ihnen sehr für Ihre Antwort. Ich denke, es sollte funktionieren, aber es gibt ein anderes Problem: Es scheint, dass das Skript "Aufgabe" nur von den zwei ersten Threads ausgeführt wird. Für die letzten zwei bekomme ich den folgenden Fehler: keine solche Datei oder Verzeichnis. Weißt du, warum? – Aleph

+1

@Aleph: Der 'strace'-Befehl wird dein Freund sein. Lauf 'strace -f -ff -o hellotrace hallo'. Es wird eine Ablaufverfolgungsdatei für jeden Ihrer Threads und Prozesse generieren. Lesen Sie dann die resultierenden Trace-Dateien. –