⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smpd_launch_process.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 5 页
字号:
    hStdin = GetStdHandle(STD_INPUT_HANDLE);    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    hStderr = GetStdHandle(STD_ERROR_HANDLE);    if (hStdin == INVALID_HANDLE_VALUE || hStdout == INVALID_HANDLE_VALUE  || hStderr == INVALID_HANDLE_VALUE)    {	nError = GetLastError(); /* This will only be correct if stderr failed */	ReleaseMutex(smpd_process.hLaunchProcessMutex);	smpd_translate_win_error(nError, err_msg, MAX_ERROR_LENGTH, NULL);	smpd_err_printf("GetStdHandle failed, error %d, %s\n", nError, err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;;    }    /* Create sockets for stdin, stdout, and stderr */    nError = smpd_make_socket_loop_choose(&hSockStdinR, SMPD_FALSE, &hSockStdinW, SMPD_TRUE);    if (nError)    {	smpd_err_printf("smpd_make_socket_loop failed, error %d\n", nError);	goto CLEANUP;    }    nError = smpd_make_socket_loop_choose(&hSockStdoutR, SMPD_TRUE, &hSockStdoutW, SMPD_FALSE);    if (nError)    {	smpd_err_printf("smpd_make_socket_loop failed, error %d\n", nError);	goto CLEANUP;    }    nError = smpd_make_socket_loop_choose(&hSockStderrR, SMPD_TRUE, &hSockStderrW, SMPD_FALSE);    if (nError)    {	smpd_err_printf("smpd_make_socket_loop failed, error %d\n", nError);	goto CLEANUP;    }    if (process->pmi != NULL)    {	if (smpd_process.use_inherited_handles)	{	    nError = smpd_make_socket_loop(&hSockPmiR, &hSockPmiW);	    if (nError)	    {		smpd_err_printf("smpd_make_socket_loop failed, error %d\n", nError);		goto CLEANUP;	    }	}	else	{	    nError = MPIDU_Sock_listen(set, NULL, &listener_port, &sock_pmi_listener); 	    if (nError != MPI_SUCCESS)	    {		smpd_err_printf("MPIDU_Sock_listen failed,\nsock error: %s\n", get_sock_error_string(nError));		goto CLEANUP;	    }	    smpd_dbg_printf("pmi listening on port %d\n", listener_port);	    nError = smpd_create_context(SMPD_CONTEXT_PMI_LISTENER, set, sock_pmi_listener, -1, &listener_context);	    if (nError != SMPD_SUCCESS)	    {		smpd_err_printf("unable to create a context for the pmi listener.\n");		goto CLEANUP;	    }	    nError = MPIDU_Sock_set_user_ptr(sock_pmi_listener, listener_context);	    if (nError != MPI_SUCCESS)	    {		smpd_err_printf("MPIDU_Sock_set_user_ptr failed,\nsock error: %s\n", get_sock_error_string(nError));		goto CLEANUP;	    }	    listener_context->state = SMPD_PMI_LISTENING;	    /* Adding process rank since the interface for MPIDU_Sock_get_host_description changed */	    nError = MPIDU_Sock_get_host_description(process->rank, host_description, 256);	    if (nError != MPI_SUCCESS)	    {		smpd_err_printf("MPIDU_Sock_get_host_description failed,\nsock error: %s\n", get_sock_error_string(nError));		goto CLEANUP;	    }	    /* save the listener sock in the slot reserved for the client sock so we can match the listener	    to the process structure when the client sock is accepted */	    process->pmi->sock = sock_pmi_listener;	}    }    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);    saAttr.lpSecurityDescriptor = NULL;    saAttr.bInheritHandle = TRUE;    /* Create the pipes for stdout, stderr */    if (!CreatePipe(&hPipeStdinR, &hPipeStdinW, &saAttr, 0))    {	smpd_err_printf("CreatePipe(stdin) failed, error %d\n", GetLastError());	goto CLEANUP;    }    if (!CreatePipe(&hPipeStdoutR, &hPipeStdoutW, &saAttr, 0))    {	smpd_err_printf("CreatePipe(stdout) failed, error %d\n", GetLastError());	goto CLEANUP;    }    if (!CreatePipe(&hPipeStderrR, &hPipeStderrW, &saAttr, 0))    {	smpd_err_printf("CreatePipe(stderr) failed, error %d\n", GetLastError());	goto CLEANUP;    }    /* Make the ends of the pipes that this process will use not inheritable */    /*    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdinW, GetCurrentProcess(), &hIn, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    */    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hPipeStdinW, GetCurrentProcess(), &hIn, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    /*    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdoutR, GetCurrentProcess(), &hOut, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStderrR, GetCurrentProcess(), &hErr, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    */    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hPipeStdoutR, GetCurrentProcess(), &hOut, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hPipeStderrR, GetCurrentProcess(), &hErr, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (process->pmi != NULL && smpd_process.use_inherited_handles)    {	if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockPmiR, GetCurrentProcess(), (LPHANDLE)&hSockPmiR, 	    0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))	{	    nError = GetLastError();	    smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	    goto CLEANUP;	}    }    /* prevent the socket loops from being inherited */    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdinR, GetCurrentProcess(), (LPHANDLE)&hSockStdinR, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdoutR, GetCurrentProcess(), (LPHANDLE)&hSockStdoutR, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStderrR, GetCurrentProcess(), (LPHANDLE)&hSockStderrR, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdinW, GetCurrentProcess(), (LPHANDLE)&hSockStdinW, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStdoutW, GetCurrentProcess(), (LPHANDLE)&hSockStdoutW, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hSockStderrW, GetCurrentProcess(), (LPHANDLE)&hSockStderrW, 	0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))    {	nError = GetLastError();	smpd_err_printf("DuplicateHandle failed, error %d\n", nError);	goto CLEANUP;    }    /* make the ends used by the spawned process blocking */    /*    blocking_flag = 0;    ioctlsocket(hSockStdinR, FIONBIO, &blocking_flag);    */    /*    blocking_flag = 0;    ioctlsocket(hSockStdoutW, FIONBIO, &blocking_flag);    blocking_flag = 0;    ioctlsocket(hSockStderrW, FIONBIO, &blocking_flag);    */    /* Set stdin, stdout, and stderr to the ends of the pipe the created process will use */    /*    if (!SetStdHandle(STD_INPUT_HANDLE, (HANDLE)hSockStdinR))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto CLEANUP;    }    */    if (!SetStdHandle(STD_INPUT_HANDLE, (HANDLE)hPipeStdinR))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto CLEANUP;    }    /*    if (!SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)hSockStdoutW))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto RESTORE_CLEANUP;    }    if (!SetStdHandle(STD_ERROR_HANDLE, (HANDLE)hSockStderrW))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto RESTORE_CLEANUP;    }    */    if (!SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)hPipeStdoutW))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto RESTORE_CLEANUP;    }    if (!SetStdHandle(STD_ERROR_HANDLE, (HANDLE)hPipeStderrW))    {	nError = GetLastError();	smpd_err_printf("SetStdHandle failed, error %d\n", nError);	goto RESTORE_CLEANUP;    }    /* Create the process */    memset(&saInfo, 0, sizeof(STARTUPINFO));    saInfo.cb = sizeof(STARTUPINFO);    /*saInfo.hStdInput = (HANDLE)hSockStdinR;*/    saInfo.hStdInput = (HANDLE)hPipeStdinR;    /*    saInfo.hStdOutput = (HANDLE)hSockStdoutW;    saInfo.hStdError = (HANDLE)hSockStderrW;    */    saInfo.hStdOutput = (HANDLE)hPipeStdoutW;    saInfo.hStdError = (HANDLE)hPipeStderrW;    saInfo.dwFlags = STARTF_USESTDHANDLES;    SetEnvironmentVariables(process->env);    if (process->pmi != NULL)    {	sprintf(str, "%d", process->rank);	smpd_dbg_printf("env: PMI_RANK=%s\n", str);	SetEnvironmentVariable("PMI_RANK", str);	sprintf(str, "%d", process->nproc);	smpd_dbg_printf("env: PMI_SIZE=%s\n", str);	SetEnvironmentVariable("PMI_SIZE", str);	sprintf(str, "%s", process->kvs_name);	smpd_dbg_printf("env: PMI_KVS=%s\n", str);	SetEnvironmentVariable("PMI_KVS", str);	sprintf(str, "%s", process->domain_name);	smpd_dbg_printf("env: PMI_DOMAIN=%s\n", str);	SetEnvironmentVariable("PMI_DOMAIN", str);	if (smpd_process.use_inherited_handles)	{	    smpd_encode_handle(sock_str, (HANDLE)hSockPmiW);	    sprintf(str, "%s", sock_str);	    smpd_dbg_printf("env: PMI_SMPD_FD=%s\n", str);	    SetEnvironmentVariable("PMI_SMPD_FD", str);	}	else	{	    smpd_dbg_printf("env: PMI_HOST=%s\n", host_description);	    SetEnvironmentVariable("PMI_HOST", host_description);	    sprintf(str, "%d", listener_port);	    smpd_dbg_printf("env: PMI_PORT=%s\n", str);	    SetEnvironmentVariable("PMI_PORT", str);	}	sprintf(str, "%d", smpd_process.id);	smpd_dbg_printf("env: PMI_SMPD_ID=%s\n", str);	SetEnvironmentVariable("PMI_SMPD_ID", str);	sprintf(str, "%d", process->id);	smpd_dbg_printf("env: PMI_SMPD_KEY=%s\n", str);	SetEnvironmentVariable("PMI_SMPD_KEY", str);	if (process->clique[0] != '\0')	{	    sprintf(str, "%s", process->clique);	    smpd_dbg_printf("env: PMI_CLIQUE=%s\n", str);	    SetEnvironmentVariable("PMI_CLIQUE", str);	}	sprintf(str, "%d", process->spawned);	smpd_dbg_printf("env: PMI_SPAWN=%s\n", str);	SetEnvironmentVariable("PMI_SPAWN", str);	sprintf(str, "%d", process->appnum);	smpd_dbg_printf("env: PMI_APPNUM=%s\n", str);	SetEnvironmentVariable("PMI_APPNUM", str);    }    pEnv = GetEnvironmentStrings();    GetCurrentDirectory(MAX_PATH, tSavedPath);    SetCurrentDirectory(process->dir);    launch_flag = 	CREATE_SUSPENDED | /*CREATE_NEW_CONSOLE*/ /*DETACHED_PROCESS*/ CREATE_NO_WINDOW | priorityClass;    if (dbg)	launch_flag = launch_flag | DEBUG_PROCESS;    smpd_dbg_printf("CreateProcess(%s)\n", actual_exe);    psInfo.hProcess = INVALID_HANDLE_VALUE;    if (CreateProcess(	NULL,	actual_exe,	NULL, NULL, TRUE,	launch_flag,	pEnv,	NULL,	&saInfo, &psInfo))    {	SetThreadPriority(psInfo.hThread, priority);	process->pid = psInfo.dwProcessId;    }    else    {	nError = GetLastError();	smpd_err_printf("CreateProcess('%s') failed, error %d\n", process->exe, nError);	smpd_translate_win_error(nError, process->err_msg, SMPD_MAX_ERROR_LEN, "CreateProcess(%s) on '%s' failed, error %d - ",	    process->exe, smpd_process.host, nError);	psInfo.hProcess = INVALID_HANDLE_VALUE;	bSuccess = FALSE;    }    FreeEnvironmentStrings((TCHAR*)pEnv);    SetCurrentDirectory(tSavedPath);    RemoveEnvironmentVariables(process->env);    if (process->pmi != NULL)    {	SetEnvironmentVariable("PMI_RANK", NULL);	SetEnvironmentVariable("PMI_SIZE", NULL);	SetEnvironmentVariable("PMI_KVS", NULL);	SetEnvironmentVariable("PMI_DOMAIN", NULL);	if (smpd_process.use_inherited_handles)	{	    SetEnvironmentVariable("PMI_SMPD_FD", NULL);	}	else	{	    SetEnvironmentVariable("PMI_HOST", NULL);	    SetEnvironmentVariable("PMI_PORT", NULL);	}	SetEnvironmentVariable("PMI_SMPD_ID", NULL);	SetEnvironmentVariable("PMI_SMPD_KEY", NULL);	SetEnvironmentVariable("PMI_SPAWN", NULL);    }    if (bSuccess)    {	/* make sock structures out of the sockets */	/*	nError = MPIDU_Sock_native_to_sock(set, hIn, NULL, &sock_in);	if (nError != MPI_SUCCESS)	{	    smpd_err_printf("MPIDU_Sock_native_to_sock failed, error %s\n", get_sock_error_string(nError));	}	*/	/*printf("native sock for stdin\n");fflush(stdout);*/	nError = MPIDU_Sock_native_to_sock(set, (MPIDU_SOCK_NATIVE_FD)hSockStdinW, NULL, &sock_in);	if (nError != MPI_SUCCESS)	{	    smpd_err_printf("MPIDU_Sock_native_to_sock failed, error %s\n", get_sock_error_string(nError));	}	/*printf("native sock for stdout\n");fflush(stdout);*/	nError = MPIDU_Sock_native_to_sock(set, (MPIDU_SOCK_NATIVE_FD)hSockStdoutR, NULL, &sock_out);	if (nError != MPI_SUCCESS)	{	    smpd_err_printf("MPIDU_Sock_native_to_sock failed, error %s\n", get_sock_error_string(nError));	}	/*printf("native sock for stderr\n");fflush(stdout);*/	nError = MPIDU_Sock_native_to_sock(set, (MPIDU_SOCK_NATIVE_FD)hSockStderrR, NULL, &sock_err);	if (nError != MPI_SUCCESS)	{	    smpd_err_printf("MPIDU_Sock_native_to_sock failed, error %s\n", get_sock_error_string(nError));	}	if (process->pmi != NULL && smpd_process.use_inherited_handles)	{	    /*printf("native sock for pmi\n");fflush(stdout);*/	    nError = MPIDU_Sock_native_to_sock(set, (MPIDU_SOCK_NATIVE_FD)hSockPmiR, NULL, &sock_pmi);	    if (nError != MPI_SUCCESS)	    {		smpd_err_printf("MPIDU_Sock_native_to_sock failed, error %s\n", get_sock_error_string(nError));	    }	}	process->in->sock = sock_in;	process->out->sock = sock_out;	process->err->sock = sock_err;	if (process->pmi != NULL && smpd_process.use_inherited_handles)	    process->pmi->sock = sock_pmi;	process->pid = process->in->id = process->out->id = process->err->id = psInfo.dwProcessId;	MPIDU_Sock_set_user_ptr(sock_in, process->in);	MPIDU_Sock_set_user_ptr(sock_out, process->out);	MPIDU_Sock_set_user_ptr(sock_err, process->err);	if (process->pmi != NULL && smpd_process.use_inherited_handles)	    MPIDU_Sock_set_user_ptr(sock_pmi, process->pmi);    }    else    {	/* close all the sockets and handles allocated in this function */	/*CloseHandle(hIn);*/	CloseHandle((HANDLE)hSockStdinW);	CloseHandle((HANDLE)hSockStdoutR);	CloseHandle((HANDLE)hSockStderrR);	if (process->pmi != NULL && smpd_process.use_inherited_handles)	    CloseHandle((HANDLE)hSockPmiR);    }RESTORE_CLEANUP:    /* Restore stdin, stdout, stderr */    SetStdHandle(STD_INPUT_HANDLE, hStdin);    SetStdHandle(STD_OUTPUT_HANDLE, hStdout);    SetStdHandle(STD_ERROR_HANDLE, hStderr);CLEANUP:    ReleaseMutex(smpd_process.hLaunchProcessMutex);    /*CloseHandle((HANDLE)hSockStdinR);*/    CloseHandle((HANDLE)hPipeStdinR);    /*    CloseHandle((HANDLE)hSockStdoutW);    CloseHandle((HANDLE)hSockStderrW);    */    CloseHandle((HANDLE)hPipeStdoutW);    CloseHandle((HANDLE)hPipeStderrW);    if (process->pmi != NULL && smpd_process.use_inherited_handles)	CloseHandle((HANDLE)hSockPmiW);    if (psInfo.hProcess != INVALID_HANDLE_VALUE)    {	HANDLE hThread;	smpd_piothread_arg_t *arg_ptr;	smpd_pinthread_arg_t *in_arg_ptr;	in_arg_ptr = (smpd_pinthread_arg_t*)malloc(sizeof(smpd_pinthread_arg_t));	in_arg_ptr->hIn = hSockStdinR;	in_arg_ptr->hOut = hPipeStdinW;	in_arg_ptr->pid = psInfo.dwProcessId;	hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)smpd_pinthread, in_arg_ptr, 0, NULL);	CloseHandle(hThread);	arg_ptr = (smpd_piothread_arg_t*)malloc(sizeof(smpd_piothread_arg_t));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -