2016-04-04 17 views
3

OpenMP döngüsünde yürütülebilir bir dosyayı çalıştırmak istiyorum. İlgili yürütülebilir böyle gcc ile oluşturulabilirOpenMP döngüsünde yürütme çağrısı

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

    } 
} 

:

#! /bin/sh 

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

gcc -fopenmp hello.c -o hello 

görev komut çok basit bir bash script Aşağıdaki kod ile bunu yapmaya çalıştım

Programımı şu şekilde çalıştırıyorum:

./hello 
Hem "Merhaba" yürütülebilir ve "görev" komut dosyasını içeren bir dizinden

.

3

2

0

1

Hello, I am process 3

Please for me for 10 seconds...

Thank you!

O execv Fonksiyon ilk iplik (bizim örneğimizde 3 tane) tarafından çağrıldığında, execv yapılan diğer çağrılar atlanır gibi görünüyor.

Birisi sorunun ne olduğunu biliyor mu?

Teşekkürler!

DÜZENLEME: Sistemin

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

cevap

3

fonksiyon execv ile yeni kod işlevine verilen parametreler ile oluşturulan yenisi ile şimdiki süreç yerini alacak.

Ne istediğinizi başarmak için system veya belki de fork/execv numaralı bilgisayarı kullanmalısınız.

+3

Açıkça belirtmek gerekirse, "mevcut işlemi yeniden yerleştirmek", execv() '(veya başka herhangi bir' execve() 'sarmalayıcı işlevi) çağrısı dışındaki tüm iş parçacıklarını yok etmeyi içerir. Bu durumda sistem() 'yi kullanmayla ilgili öneriyi tercih etme eğilimindeyim, çünkü ön uçta biraz daha fazla kurulum gerektirmesine rağmen, bu soruda sunulan kullanım için daha basit olacak gibi görünüyor. –

+0

Merhaba! Cevabınız için çok teşekkür ederim. Çalışması gerektiğini düşünüyorum ama başka bir problem var: "Görev" betiğinin sadece iki ilk iş parçacığı tarafından yürütüldüğü anlaşılıyor. Son iki kişi için şu hatayı alıyorum: böyle bir dosya veya dizin yok. Neden biliyor musun? – Aleph

+1

@Aleph: 'strace' komutu arkadaşın olacak. strace -f -ff -o hellotrace hello'unu çalıştırın. Her bir iş parçacığı ve işlem için bir izleme dosyası oluşturur. Sonra ortaya çıkan izleme dosyalarını okuyun. –