SimGrid。使用参数创建子流程

时间:2016-06-01 21:35:46

标签: c simgrid

我在MSG_function_register("dispatcher", dispatcher); 声明了进程:

dispatcher

deployment.xml函数从int num = xbt_str_parse_int(argv[1], "Invalid argument %s"); int id = xbt_str_parse_int(argv[2], "Invalid argument %s"); 文件中获取参数:

dispatcher

然后MSG_process_create_with_arguments("TS", subprocess, NULL, MSG_host_self(), agrc, argv); 创建一个子流程:

num

如何将idint subprocess(int argc, char* argv){ return 0; } 传递给子流程函数?

public static void Display(){
            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();
            try{

                HostelHome h1 = (HostelHome)session.get(HostelHome.class, new Integer(1));
                System.out.print("Room Number: "+h1.getRoom_no()+" ");
                System.out.print("Vacancy: "+h1.getVacancy()+" ");

                session.close();
            }catch(Exception e){
                    e.printStackTrace();
            }

        }

如何在子进程函数中调用此argv?

1 个答案:

答案 0 :(得分:3)

您有两种方法可以将参数传递给MSG流程:

  • 通过argv;

  • 或通过data参数。

通过argv

传递数据

在第一个解决方案中,您必须创建一个新的argv

// Create argv for child process
char** newargv = xbt_new(char*, 3);
newargv[1] = xbt_strdup("TS");
newargv[2] = xbt_strdup(argv[0]);
newargv[3] = xbt_strdup(argv[0]);
// Create process with new argv:
MSG_process_create_with_arguments("TS", subprocess, NULL,     MSG_host_self(), 3, newargv);

使用:

int subprocess(int argc, char* argv)
{
    int num = xbt_str_parse_int(argv[1], "Invalid argument %s");
    int id = xbt_str_parse_int(argv[2], "Invalid argument %s");
    return 0;
}

通过data

传递数据

另一种解决方案是使用data参数传递数据:

struct ts_data {
  int num;
  int id;
};

struct ts_data* data = xbt_new(ts_data, 1);
data->num = xbt_str_parse_int(argv[1], "Invalid argument %s");
data->id = xbt_str_parse_int(argv[2], "Invalid argument %s");
MSG_process_create_with_arguments("TS", subprocess, data,     MSG_host_self(), 0, NULL

使用:

int subprocess(int argc, char* argv)
{
    struct ts_data* data = MSG_process_get_data(MSG_process_self());
    int num = data->num;
    int id = data->id;
    free(data);
    return 0;
}