C SimGrid。使用参数创建子流程

C SimGrid。使用参数创建子流程,c,simgrid,C,Simgrid,我在main.c中声明了进程: 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_pr

我在
main.c
中声明了进程:

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
id
传递给子流程函数

int subprocess(int argc, char* argv){
    return 0;
}

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

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

int subprocess(int argc, char* argv){
    return 0;
}
  • 或者通过argv

  • 或者通过
    数据
    参数

通过
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);
与:

通过
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;
}