void setCriuOptions(){ //Reserved for the file descriptor int fd; //Open if "checkpoints" is a directory, or fail fd = open("checkpoints", O_DIRECTORY); //Check if open didn't fail if(fd == -1){ perror("Error: open failed to open the 'checkpoints' directory.\n"); //return -1; } //Set up criu options int ret = criu_init_opts(); if(ret == -1){ perror("Error: criu_init_opts failed to inital the request options.\n"); } //Set the images directory, where they will be stored criu_set_images_dir_fd(fd); //Specify the CRIU service socket criu_set_service_address("criu_service.socket"); //Specify how to connnect to service socket criu_set_service_comm(CRIU_COMM_SK); //Make it to continue executing after dumping criu_set_leave_running(true); //Make it a shell job, since criu would be unable to dump otherwise criu_set_shell_job(true); }
int opal_crs_criu_checkpoint(pid_t pid, opal_crs_base_snapshot_t *base_snapshot, opal_crs_base_ckpt_options_t *options, opal_crs_state_type_t *state) { int ret; int fd = 0; int oh = mca_crs_criu_component.super.output_handle; opal_crs_criu_snapshot_t *snapshot = NULL; char *dest = NULL; opal_output_verbose(10, oh, "crs:criu: checkpoint(%d, ---)", pid); snapshot = (opal_crs_criu_snapshot_t *)base_snapshot; snapshot->super.component_name = strdup(mca_crs_criu_component.super.base_version.mca_component_name); if (NULL == snapshot->super.metadata) { if (NULL == (snapshot->super.metadata = fopen(snapshot->super.metadata_filename, "a"))) { opal_output(oh, "crs:criu: checkpoint(): Error: Unable to open the file (%s)", snapshot->super.metadata_filename); *state = OPAL_CRS_ERROR; goto cleanup; } } fprintf(snapshot->super.metadata, "%s%s\n", CRS_METADATA_COMP, snapshot->super.component_name); fclose(snapshot->super.metadata); snapshot->super.metadata = NULL; ret = criu_init_opts(); if (ret < 0) { criu_error(ret, pid); *state = OPAL_CRS_ERROR; goto cleanup; } opal_output_verbose(10, oh, "crs:criu: criu_init_opts() returned %d", ret); dest = snapshot->super.snapshot_directory; opal_output_verbose(10, oh, "crs:criu: opening snapshot directory %s", dest); fd = open(dest, O_DIRECTORY); if (fd < 0) { *state = OPAL_CRS_ERROR; opal_output(oh, "crs:criu: checkpoint(): Error: Unable to open checkpoint " "directory (%s) for pid (%d)", dest, pid); goto cleanup; } /* http://criu.org/C_API */ criu_set_images_dir_fd(fd); criu_set_pid(pid); criu_set_log_file(mca_crs_criu_component.log_file); criu_set_log_level(mca_crs_criu_component.log_level); criu_set_tcp_established(mca_crs_criu_component.tcp_established); criu_set_shell_job(mca_crs_criu_component.shell_job); criu_set_ext_unix_sk(mca_crs_criu_component.ext_unix_sk); criu_set_leave_running(mca_crs_criu_component.leave_running); ret = criu_dump(); if (ret < 0) { criu_error(ret, pid); *state = OPAL_CRS_ERROR; goto cleanup; } *state = OPAL_CRS_CONTINUE; cleanup: if (fd > 0) { close(fd); } if (OPAL_CRS_ERROR == *state) { return OPAL_ERROR; } return OPAL_SUCCESS; }
int main(int argc, char *argv[]) { int ret, fd; criu_set_service_address("criu_service.socket"); puts("--- Check ---"); ret = criu_check(); if (ret < 0) { what_err_ret_mean(ret); return -1; } else puts("Success"); puts("--- Dump loop ---"); criu_init_opts(); criu_set_pid(atoi(argv[1])); criu_set_log_file("dump.log"); criu_set_log_level(4); fd = open("imgs_loop", O_DIRECTORY); criu_set_images_dir_fd(fd); ret = criu_dump(); if (ret < 0) { what_err_ret_mean(ret); return -1; } else if (ret == 0) puts("Success"); puts("--- Restore loop ---"); criu_init_opts(); criu_set_log_level(4); criu_set_log_file("restore.log"); criu_set_images_dir_fd(fd); ret = criu_restore(); if (ret < 0) { what_err_ret_mean(ret); return -1; } else if (ret > 0) { puts("Success"); printf("pid %d\n", ret); } puts("--- Dump myself ---"); criu_init_opts(); criu_set_leave_running(true); criu_set_shell_job(true); criu_set_images_dir_fd(open("imgs_test", O_DIRECTORY)); ret = criu_dump(); if (ret < 0) { what_err_ret_mean(ret); return -1; } else { puts("Success"); if (ret == 1) puts("Restored"); } return 0; }