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

📄 launchprocess.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"#include "guiMPIRun.h"#include "guiMPIRunDoc.h"#include "guiMPIRunView.h"#include "LaunchProcess.h"#include <stdio.h>#include "global.h"#include "RedirectIO.h"#include "..\Common\MPIJobDefs.h"#include "Translate_Error.h"#include "mpdutil.h"#include "mpd.h"/*static char *GenerateMapString(MapDriveNode *pNode){    char *str, *ret_val;    if (pNode == NULL)	return NULL;    ret_val = str = new char[8192];    str += sprintf(str, " m='%c:%s", pNode->cDrive, pNode->pszShare);    pNode = pNode->pNext;    while (pNode)    {	str += sprintf(str, ";%c:%s", pNode->cDrive, pNode->pszShare);	pNode = pNode->pNext;    }    strcpy(str, "'");    return ret_val;}*/// Function name	: LaunchProcess// Description	    : // Return type		: void // Argument         : LaunchProcessArg *argvoid MPIRunLaunchProcess(MPIRunLaunchProcessArg *arg){    DWORD length = 100;    HANDLE hRIThread = NULL;    long error;    int nPid;    int nPort = MPD_DEFAULT_PORT;    SOCKET sock;    int launchid;    char pszStartupDB[100];    char pszStr[MAX_CMD_LENGTH+1];    char pszIOE[10];    char pszError[512];    LONG i;    char *dbg_str = "no";    char *pszMap = NULL;    if (arg->bUseDebugFlag)	dbg_str = "yes";    //printf("connecting to %s:%d rank %d\n", arg->pszHost, nPort, arg->i);fflush(stdout);    if ((error = ConnectToMPDReport(arg->pszHost, nPort, arg->pszPassPhrase, &sock, pszStr)) == 0)    {	if (arg->i == 0 && !arg->pDlg->m_bNoMPI)	{	    sprintf(pszStr, "dbcreate");	    if (WriteString(sock, pszStr) == SOCKET_ERROR)	    {		printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);		//ExitProcess(0);		easy_closesocket(sock);		SetEvent(arg->pDlg->m_hAbortEvent);		delete arg;		return;	    }	    // read result	    if (!ReadString(sock, pszStartupDB))	    {		printf("ERROR: ReadString failed to read the database name: error %d\n", WSAGetLastError());		//ExitProcess(0);		easy_closesocket(sock);		SetEvent(arg->pDlg->m_hAbortEvent);		delete arg;		return;	    }	    if (strnicmp(pszStartupDB, "FAIL ", 5) == 0)	    {		printf("Unable to create a database on '%s'\n%s", arg->pszHost, pszStartupDB);fflush(stdout);		//ExitProcess(0);		easy_closesocket(sock);		SetEvent(arg->pDlg->m_hAbortEvent);		delete arg;		return;	    }	    sprintf(pszStr, "|MPICH_EXTRA=mpd:%s:%d:%s:%s", pszStartupDB, nPort, arg->pszPassPhrase, arg->pszHost);	    strncat(arg->pszEnv, pszStr, MAX_CMD_LENGTH - 1 - strlen(arg->pszEnv));	    if (g_bUseJobHost)	    {		PutJobInDatabase(arg);	    }	}	else	{	    sprintf(pszStr, "|MPICH_EXTRA=mpd:%s:%d:%s", arg->pszHost, nPort, arg->pszPassPhrase);	    strncat(arg->pszEnv, pszStr, MAX_CMD_LENGTH - 1 - strlen(arg->pszEnv));	}		if (arg->i == 0)	    strcpy(pszIOE, "012"); // only redirect stdin to the root process	else	    strcpy(pszIOE, "12");	if (arg->pDlg->m_nproc > FORWARD_NPROC_THRESHOLD)	{	    if (arg->i > 0)	    {		while (arg->pDlg->m_pForwardHost[(arg->i - 1)/2].nPort == 0)		    Sleep(100);		sprintf(arg->pszIOHostPort, "%s:%d", arg->pDlg->m_pForwardHost[(arg->i - 1)/2].pszHost, arg->pDlg->m_pForwardHost[(arg->i - 1)/2].nPort);		if (arg->pDlg->m_nproc/2 > arg->i)		{		    strncpy(arg->pDlg->m_pForwardHost[arg->i].pszHost, arg->pszHost, MAX_HOST_LENGTH);		    arg->pDlg->m_pForwardHost[arg->i].pszHost[MAX_HOST_LENGTH-1] = '\0';		    sprintf(pszStr, "createforwarder host=%s forward=%s", arg->pszHost, arg->pszIOHostPort);		    WriteString(sock, pszStr);		    ReadString(sock, pszStr);		    int nTempPort = atoi(pszStr);		    if (nTempPort == -1)		    {			// If creating the forwarder fails, redirect output to the root instead			// This assignment isn't thread safe.  Who knows if the host part of the structure will be written before the port.			arg->pDlg->m_pForwardHost[arg->i] = arg->pDlg->m_pForwardHost[0];		    }		    else			arg->pDlg->m_pForwardHost[arg->i].nPort = nTempPort;		    //printf("forwarder %s:%d\n", g_pForwardHost[arg->i].pszHost, g_pForwardHost[arg->i].nPort);fflush(stdout);		}	    }	}	/*	if (arg->pDlg->m_pDriveMapList)	    pszMap = GenerateMapString(arg->pDlg->m_pDriveMapList);	*/	/*	if (arg->pDlg->m_pDriveMapList)	{	    MapDriveNode *pNode = arg->pDlg->m_pDriveMapList;	    char *pszEncoded;	    while (pNode)	    {		pszEncoded = EncodePassword(arg->pszPassword);		sprintf(pszStr, "map drive=%c share=%s account=%s password=%s", 		    pNode->cDrive, pNode->pszShare, arg->pszAccount, pszEncoded);		if (pszEncoded != NULL) free(pszEncoded);		if (WriteString(sock, pszStr) == SOCKET_ERROR)		{		    sprintf(pszError, "Unable to send map command to '%s'\r\nError %d", arg->pszHost, WSAGetLastError());		    MessageBox(NULL, pszError, "Critical Error", MB_OK);		    easy_closesocket(sock);		    SetEvent(arg->pDlg->m_hAbortEvent);		    delete arg;		    return;		}		if (!ReadString(sock, pszStr))		{		    sprintf(pszError, "Unable to read the result of a map command to '%s'\r\nError %d", arg->pszHost, WSAGetLastError());		    MessageBox(NULL, pszError, "Critical Error", MB_OK);		    easy_closesocket(sock);		    SetEvent(arg->pDlg->m_hAbortEvent);		    delete arg;		    return;		}		if (stricmp(pszStr, "SUCCESS"))		{		    sprintf(pszError, "Unable to map %c: to %s on %s\r\n%s", pNode->cDrive, pNode->pszShare, arg->pszHost, pszStr);		    MessageBox(NULL, pszError, "Error", MB_OK);		    easy_closesocket(sock);		    SetEvent(arg->pDlg->m_hAbortEvent);		    delete arg;		    return;		}		pNode = pNode->pNext;	    }	}	*/	// LaunchProcess	if (arg->bLogon)	{	    char *pszEncoded;	    pszEncoded = EncodePassword(arg->pszPassword);	    if (strlen(arg->pszDir) > 0)	    {		sprintf(pszStr, "launch h=%s c='%s' e='%s' a=%s p=%s %s=%s k=%d d='%s' g=%s", 		    arg->pszHost, arg->pszCmdLine, arg->pszEnv, arg->pszAccount, pszEncoded, pszIOE, arg->pszIOHostPort, arg->i, arg->pszDir, dbg_str);	    }	    else	    {		sprintf(pszStr, "launch h=%s c='%s' e='%s' a=%s p=%s %s=%s k=%d g=%s", 		    arg->pszHost, arg->pszCmdLine, arg->pszEnv, arg->pszAccount, pszEncoded, pszIOE, arg->pszIOHostPort, arg->i, dbg_str);	    }	    if (pszEncoded != NULL) free(pszEncoded);	}	else	{	    if (strlen(arg->pszDir) > 0)	    {		sprintf(pszStr, "launch h=%s c='%s' e='%s' %s=%s k=%d d='%s' g=%s",		    arg->pszHost, arg->pszCmdLine, arg->pszEnv, pszIOE, arg->pszIOHostPort, arg->i, arg->pszDir, dbg_str);	    }	    else	    {		sprintf(pszStr, "launch h=%s c='%s' e='%s' %s=%s k=%d g=%s",		    arg->pszHost, arg->pszCmdLine, arg->pszEnv, pszIOE, arg->pszIOHostPort, arg->i, dbg_str);	    }	}	if (arg->pszMap[0] != '\0')	    strcat(pszStr, arg->pszMap);	/*	if (pszMap)	{	    strcat(pszStr, pszMap);	    delete pszMap;	}	*/	if (WriteString(sock, pszStr) == SOCKET_ERROR)	{	    sprintf(pszError, "Unable to send launch command to '%s'\r\nError %d", arg->pszHost, WSAGetLastError());	    MessageBox(NULL, pszError, "Critical Error", MB_OK);	    easy_closesocket(sock);	    SetEvent(arg->pDlg->m_hAbortEvent);	    delete arg;	    return;	}	if (!ReadString(sock, pszStr))	{	    sprintf(pszError, "Unable to read the result of the launch command on '%s'\r\nError %d", arg->pszHost, WSAGetLastError());	    MessageBox(NULL, pszError, "Critical Error", MB_OK);	    easy_closesocket(sock);	    SetEvent(arg->pDlg->m_hAbortEvent);	    delete arg;	    return;	}	launchid = atoi(pszStr);	// save the launch id, get the pid	sprintf(pszStr, "getpid %d", launchid);	if (WriteString(sock, pszStr) == SOCKET_ERROR)	{	    sprintf(pszError, "Unable to send getpid command to '%s'\r\nError %d", arg->pszHost, WSAGetLastError());	    MessageBox(NULL, pszError, "Critical Error", MB_OK);	    easy_closesocket(sock);	    SetEvent(arg->pDlg->m_hAbortEvent);	    delete arg;	    return;	}	if (!ReadString(sock, pszStr))	{	    sprintf(pszError, "Unable to read the result of the getpid command on '%s'\r\nError %d", arg->pszHost, WSAGetLastError());	    MessageBox(NULL, pszError, "Critical Error", MB_OK);	    easy_closesocket(sock);	    SetEvent(arg->pDlg->m_hAbortEvent);	    delete arg;	    return;	}	nPid = atoi(pszStr);	if (nPid == -1)	{	    sprintf(pszStr, "geterror %d", launchid);	    if (WriteString(sock, pszStr) == SOCKET_ERROR)	    {		sprintf(pszError, "Unable to send geterror command after an unsuccessful launch on '%s'\r\nError %d", arg->pszHost, WSAGetLastError());		MessageBox(NULL, pszError, "Critical Error", MB_OK);		easy_closesocket(sock);		SetEvent(arg->pDlg->m_hAbortEvent);		delete arg;		return;	    }	    if (!ReadString(sock, pszStr))	    {

⌨️ 快捷键说明

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