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

📄 smpd_launch_process.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 5 页
字号:
    smpd_exit_fn(FCNAME);}#undef FCNAME#define FCNAME "RemoveEnvironmentVariables"static void RemoveEnvironmentVariables(char *bEnv){    char name[SMPD_MAX_ENV_LENGTH], equals[3], value[SMPD_MAX_ENV_LENGTH];    smpd_enter_fn(FCNAME);    for (;;)    {	name[0] = '\0';	equals[0] = '\0';	value[0] = '\0';	if (MPIU_Str_get_string(&bEnv, name, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS)	    break;	if (name[0] == '\0')	    break;	if (MPIU_Str_get_string(&bEnv, equals, 3) != MPIU_STR_SUCCESS)	    break;	if (equals[0] == '\0')	    break;	if (MPIU_Str_get_string(&bEnv, value, SMPD_MAX_ENV_LENGTH) != MPIU_STR_SUCCESS)	    break;	/*smpd_dbg_printf("removing environment variable <%s>\n", name);*/	SetEnvironmentVariable(name, NULL);    }    smpd_exit_fn(FCNAME);}#undef FCNAME#define FCNAME "smpd_priority_class_to_win_class"int smpd_priority_class_to_win_class(int *priorityClass){    smpd_enter_fn(FCNAME);    switch (*priorityClass)    {    case 0:	*priorityClass = IDLE_PRIORITY_CLASS;	break;    case 1:	*priorityClass = BELOW_NORMAL_PRIORITY_CLASS;	break;    case 2:	*priorityClass = NORMAL_PRIORITY_CLASS;	break;    case 3:	*priorityClass = ABOVE_NORMAL_PRIORITY_CLASS;	break;    case 4:	*priorityClass = HIGH_PRIORITY_CLASS;	break;    default:	*priorityClass = NORMAL_PRIORITY_CLASS;	break;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#undef FCNAME#define FCNAME "smpd_priority_to_win_priority"int smpd_priority_to_win_priority(int *priority){    smpd_enter_fn(FCNAME);    switch (*priority)    {    case 0:	*priority = THREAD_PRIORITY_IDLE;	break;    case 1:	*priority = THREAD_PRIORITY_LOWEST;	break;    case 2:	*priority = THREAD_PRIORITY_BELOW_NORMAL;	break;    case 3:	*priority = THREAD_PRIORITY_NORMAL;	break;    case 4:	*priority = THREAD_PRIORITY_ABOVE_NORMAL;	break;    case 5:	*priority = THREAD_PRIORITY_HIGHEST;	break;    default:	*priority = THREAD_PRIORITY_NORMAL;	break;    }    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}/* Windows code */typedef struct smpd_piothread_arg_t{    HANDLE hIn;    SOCKET hOut;    int pid;} smpd_piothread_arg_t;typedef struct smpd_pinthread_arg_t{    SOCKET hIn;    HANDLE hOut;    int pid;} smpd_pinthread_arg_t;#undef FCNAME#define FCNAME "smpd_easy_send"static int smpd_easy_send(SOCKET sock, char *buffer, int length){    int error;    int num_sent, num_left;    smpd_exit_fn(FCNAME);    num_left = length;    while (num_left)    {	while ((num_sent = send(sock, buffer, num_left, 0)) == SOCKET_ERROR)	{	    error = WSAGetLastError();	    if (error == WSAEWOULDBLOCK)	    {		Sleep(0);		continue;	    }	    if (error == WSAENOBUFS)	    {		/* If there is no buffer space available then split the buffer in half and send each piece separately.*/		if (smpd_easy_send(sock, buffer, num_left/2) == SOCKET_ERROR)		{		    smpd_exit_fn(FCNAME);		    return SOCKET_ERROR;		}		if (smpd_easy_send(sock, buffer+(num_left/2), num_left - (num_left/2)) == SOCKET_ERROR)		{		    smpd_exit_fn(FCNAME);		    return SOCKET_ERROR;		}		smpd_exit_fn(FCNAME);		return length;	    }	    WSASetLastError(error);	    smpd_exit_fn(FCNAME);	    return SOCKET_ERROR;	}	num_left = num_left - num_sent;	buffer = buffer + num_sent;    }    smpd_exit_fn(FCNAME);    return length;}int smpd_piothread(smpd_piothread_arg_t *p){    char buffer[8192];    DWORD num_read;    HANDLE hIn;    SOCKET hOut;    DWORD error;    char bogus_char;    int pid;    double t1, t2;    hIn = p->hIn;    hOut = p->hOut;    pid = p->pid;    free(p);    p = NULL;    smpd_dbg_printf("*** entering smpd_piothread pid:%d sock:%d ***\n", pid, hOut);    for (;;)    {	num_read = 0;	if (!ReadFile(hIn, buffer, 8192, &num_read, NULL))	{	    error = GetLastError();	    /* If there was an error but some bytes were read, send those bytes before exiting */	    if (num_read > 0)	    {		if (smpd_easy_send(hOut, buffer, num_read) == SOCKET_ERROR)		{		    smpd_dbg_printf("smpd_easy_send of %d bytes failed.\n", num_read);		    break;		}	    }	    smpd_dbg_printf("ReadFile failed, error %d\n", error);	    break;	}	if (num_read < 1)	{	    smpd_dbg_printf("ReadFile returned %d bytes\n", num_read);	    break;	}	/*smpd_dbg_printf("*** smpd_piothread read %d bytes ***\n", num_read);*/	if (smpd_easy_send(hOut, buffer, num_read) == SOCKET_ERROR)	{	    smpd_dbg_printf("smpd_easy_send of %d bytes failed.\n", num_read);	    break;	}	/*smpd_dbg_printf("*** smpd_piothread wrote %d bytes ***\n", num_read);*/    }    smpd_dbg_printf("*** smpd_piothread finishing pid:%d ***\n", pid);    /*    FlushFileBuffers((HANDLE)hOut);    if (shutdown(hOut, SD_BOTH) == SOCKET_ERROR)    {	smpd_err_printf("shutdown failed, sock %d, error %d\n", hOut, WSAGetLastError());    }    if (closesocket(hOut) == SOCKET_ERROR)    {	smpd_err_printf("closesocket failed, sock %d, error %d\n", hOut, WSAGetLastError());    }    */    if (shutdown(hOut, SD_SEND) == SOCKET_ERROR)    {	smpd_err_printf("shutdown failed, sock %d, error %d\n", hOut, WSAGetLastError());    }    t1 = PMPI_Wtime();    recv(hOut, &bogus_char, 1, 0);    if (closesocket(hOut) == SOCKET_ERROR)    {	smpd_err_printf("closesocket failed, sock %d, error %d\n", hOut, WSAGetLastError());    }    t2 = PMPI_Wtime();    smpd_dbg_printf("closing output socket took %.3f seconds\n", t2-t1);    CloseHandle(hIn);    /*smpd_dbg_printf("*** exiting smpd_piothread ***\n");*/    return 0;}/* one line at a time version */int smpd_pinthread(smpd_pinthread_arg_t *p){    char str [SMPD_MAX_CMD_LENGTH];    int index;    DWORD num_written;    int num_read;    SOCKET hIn;    HANDLE hOut;    int pid;    /*int i;*/    /*    char bogus_char;    double t1, t2;    */    hIn = p->hIn;    hOut = p->hOut;    pid = p->pid;    free(p);    p = NULL;    smpd_dbg_printf("*** entering smpd_pinthread pid:%d sock:%d ***\n", pid, hIn);    index = 0;    for (;;)    {	num_read = recv(hIn, &str[index], 1, 0);	if (num_read == SOCKET_ERROR || num_read == 0)	{	    if (num_read == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)	    {		u_long optval = (u_long)TRUE;		ioctlsocket(hIn, FIONBIO, &optval);		continue;	    }	    if (index > 0)	    {		/* write any buffered data before exiting */		if (!WriteFile(hOut, str, index, &num_written, NULL))		{		    smpd_dbg_printf("WriteFile failed, error %d\n", GetLastError());		    break;		}	    }	    if (num_read != 0)	    {		smpd_dbg_printf("recv from stdin socket failed, error %d.\n", WSAGetLastError());	    }	    break;	}	if (str[index] == '\n' || index == SMPD_MAX_CMD_LENGTH-1)	{	    smpd_dbg_printf("writing %d bytes to the process's stdin\n", index+1);	    if (!WriteFile(hOut, str, index+1, &num_written, NULL))	    {		smpd_dbg_printf("WriteFile failed, error %d\n", GetLastError());		break;	    }	    /*	    smpd_dbg_printf("wrote: ");	    for (i=0; i<=index; i++)	    {		smpd_dbg_printf("(%d)'%c'", (int)str[i], str[i]);	    }	    smpd_dbg_printf("\n");	    */	    index = 0;	}	else	{	    smpd_dbg_printf("read character(%d)'%c'\n", (int)str[index], str[index]);	    index++;	}    }    smpd_dbg_printf("*** smpd_pinthread finishing pid:%d ***\n", pid);    FlushFileBuffers(hOut);    if (shutdown(hIn, SD_BOTH) == SOCKET_ERROR)    {	smpd_err_printf("shutdown failed, sock %d, error %d\n", hIn, WSAGetLastError());    }    if (closesocket(hIn) == SOCKET_ERROR)    {	smpd_err_printf("closesocket failed, sock %d, error %d\n", hIn, WSAGetLastError());    }    /*    if (shutdown(hIn, SD_SEND) == SOCKET_ERROR)    {	smpd_err_printf("shutdown failed, sock %d, error %d\n", hIn, WSAGetLastError());    }    t1 = PMPI_Wtime();    recv(hIn, &bogus_char, 1, 0);    if (closesocket(hIn) == SOCKET_ERROR)    {	smpd_err_printf("closesocket failed, sock %d, error %d\n", hIn, WSAGetLastError());    }    t2 = PMPI_Wtime();    smpd_dbg_printf("closing input socket took %.3f seconds\n", t2-t1);    */    CloseHandle(hOut);    /*smpd_dbg_printf("*** exiting smpd_pinthread ***\n");*/    return 0;}#if 0/* 1 byte at a time version */int smpd_pinthread(smpd_pinthread_arg_t *p){    char ch;    DWORD num_written;    SOCKET hIn;    HANDLE hOut;    int num_read;    hIn = p->hIn;    hOut = p->hOut;    free(p);    p = NULL;    smpd_dbg_printf("*** entering smpd_pinthread ***\n");    for (;;)    {	num_read = recv(hIn, &ch, 1, 0);	if (num_read == SOCKET_ERROR)	{	    if (num_read == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)	    {		int optval = TRUE;		ioctlsocket(hIn, FIONBIO, &optval);		continue;	    }	    smpd_dbg_printf("recv from stdin socket failed, error %d.\n", WSAGetLastError());	    break;	}	if (num_read == 0)	{	    break;	}	if (!WriteFile(hOut, &ch, 1, &num_written, NULL))	{	    smpd_dbg_printf("WriteFile failed, error %d\n", GetLastError());	    break;	}    }    smpd_dbg_printf("*** smpd_pinthread finishing ***\n");    FlushFileBuffers(hOut);    if (closesocket(hIn) == SOCKET_ERROR)    {	smpd_err_printf("closesocket failed, sock %d, error %d\n", hIn, WSAGetLastError());    }    CloseHandle(hOut);    /*smpd_dbg_printf("*** exiting smpd_pinthread ***\n");*/    return 0;}#endif#undef FCNAME#define FCNAME "smpd_launch_process"int smpd_launch_process(smpd_process_t *process, int priorityClass, int priority, int dbg, MPIDU_Sock_set_t set){    HANDLE hStdin = INVALID_HANDLE_VALUE, hStdout = INVALID_HANDLE_VALUE, hStderr = INVALID_HANDLE_VALUE;    SOCKET hSockStdinR = INVALID_SOCKET, hSockStdinW = INVALID_SOCKET;    SOCKET hSockStdoutR = INVALID_SOCKET, hSockStdoutW = INVALID_SOCKET;    SOCKET hSockStderrR = INVALID_SOCKET, hSockStderrW = INVALID_SOCKET;    SOCKET hSockPmiR = INVALID_SOCKET, hSockPmiW = INVALID_SOCKET;    HANDLE hPipeStdinR = NULL, hPipeStdinW = NULL;    HANDLE hPipeStdoutR = NULL, hPipeStdoutW = NULL;    HANDLE hPipeStderrR = NULL, hPipeStderrW = NULL;    HANDLE hIn = INVALID_HANDLE_VALUE, hOut = INVALID_HANDLE_VALUE, hErr = INVALID_HANDLE_VALUE;    STARTUPINFO saInfo;    PROCESS_INFORMATION psInfo = { 0 };    void *pEnv=NULL;    char tSavedPath[MAX_PATH] = ".";    DWORD launch_flag = 0;    int nError = 0, result = 0;    /*unsigned long blocking_flag = 0;*/    MPIDU_Sock_t sock_in = MPIDU_SOCK_INVALID_SOCK, sock_out = MPIDU_SOCK_INVALID_SOCK, sock_err = MPIDU_SOCK_INVALID_SOCK, sock_pmi = MPIDU_SOCK_INVALID_SOCK;    SECURITY_ATTRIBUTES saAttr;    char str[8192], sock_str[20];    BOOL bSuccess = TRUE;    char *actual_exe, exe_data[SMPD_MAX_EXE_LENGTH];    char *args;    char temp_exe[SMPD_MAX_EXE_LENGTH];    MPIDU_Sock_t sock_pmi_listener;    smpd_context_t *listener_context;    int listener_port = 0;    char host_description[256];    char err_msg[MAX_ERROR_LENGTH] = "";    smpd_enter_fn(FCNAME);    /* Initialize the psInfo structure in case there is an error an we jump to CLEANUP before psInfo is set */    psInfo.hProcess = INVALID_HANDLE_VALUE;    /* resolve the executable name */    if (process->path[0] != '\0')    {	args = process->exe;	result = MPIU_Str_get_string(&args, temp_exe, SMPD_MAX_EXE_LENGTH);	if (result != MPIU_STR_SUCCESS)	{	}	smpd_dbg_printf("searching for '%s' in '%s'\n", temp_exe, process->path);	if (smpd_search_path(process->path, temp_exe, SMPD_MAX_EXE_LENGTH, exe_data))	{	    if (args != NULL)	    {		strncat(exe_data, " ", SMPD_MAX_EXE_LENGTH - strlen(exe_data));		strncat(exe_data, args, SMPD_MAX_EXE_LENGTH - strlen(exe_data));		exe_data[SMPD_MAX_EXE_LENGTH-1] = '\0';	    }	    actual_exe = exe_data;	}	else	{	    actual_exe = process->exe;	}    }    else    {	actual_exe = process->exe;    }    smpd_priority_class_to_win_class(&priorityClass);    smpd_priority_to_win_priority(&priority);    /* Save stdin, stdout, and stderr */    result = WaitForSingleObject(smpd_process.hLaunchProcessMutex, INFINITE);    if (result == WAIT_FAILED)    {	result = GetLastError();	smpd_translate_win_error(result, err_msg, MAX_ERROR_LENGTH, NULL);	smpd_err_printf("Error waiting for smpd_process.hLaunchProcessMutex %d, %s\n", result, err_msg);	smpd_exit_fn(FCNAME);	return SMPD_FAIL;    }

⌨️ 快捷键说明

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