模拟网格。使用参数创建子进程
SimGrid. Create subprocess with argument
我在 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?
您有 2 种方法可以将参数传递给 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;
}
我在 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?
您有 2 种方法可以将参数传递给 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;
}