【问题标题】:Call execv in OpenMP loop在 OpenMP 循环中调用 execv
【发布时间】:2016-04-04 14:47:55
【问题描述】:

我想在 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

任务脚本是一个非常简单的 bash 脚本:

#! /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

你好,我是进程 3

请帮我10秒...

谢谢!

似乎当第一个线程(在我的示例中为第三个)调用 execv 函数时,跳过了对 execv 的其他调用。

有人知道这里有什么问题吗?

谢谢!

编辑:系统的新代码

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

【问题讨论】:

    标签: c bash exec openmp


    【解决方案1】:

    函数execv 将用给函数的参数创建的新进程替换当前进程。

    要实现你想要的,你应该使用system,或者fork/execv这对夫妇。

    【讨论】:

    • 并且要清楚,“替换[ing]当前进程”涉及销毁其所有线程,而不是调用execv()(或任何其他execve()包装函数)的线程。在这种情况下,我倾向于建议使用system(),因为尽管前端需要进行更多设置,但对于问题中提出的使用而言,总体上看起来会更简单。
    • 您好!非常感谢您的回答。我认为它应该可以工作,但还有另一个问题:脚本“任务”似乎只由前两个线程执行。对于最后两个,我收到以下错误:没有这样的文件或目录。你知道为什么吗?
    • @Aleph:strace 命令将成为您的朋友。运行strace -f -ff -o hellotrace hello。它将为您的每个线程和进程生成一个跟踪文件。然后读取生成的跟踪文件。
    • 谢谢克拉斯! Strace 似乎非常有用,但目前我无法理解输出。也许我需要先阅读文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多