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

📄 smpd_watchprocs.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "smpd.h"#ifdef HAVE_WINDOWS_Htypedef struct smpd_registry_proc{    char pid[10];    char exe[1024];    SMPD_BOOL handled;    struct smpd_registry_proc *next;} smpd_registry_proc;static HANDLE hQuit=NULL;static SMPD_BOOL bPrint = SMPD_TRUE;#undef FCNAME#define FCNAME "smpd_watch_processes_thread"int smpd_watch_processes_thread(){    HKEY hKey, hProcKey;    char name[100];    char value[1024];    DWORD len;    DWORD index;    HANDLE hRegEvent;    HANDLE hEvents[2];    FILETIME t;    DWORD result;    smpd_registry_proc *node, *trailer, *temp_list, *list = NULL;    smpd_enter_fn(FCNAME);restart:    hRegEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    if (hRegEvent == NULL)    {	result = GetLastError();	smpd_translate_win_error(result, value, 1024, NULL);	smpd_err_printf("CreateEvent failed: %s\n", value);	return SMPD_FAIL;    }    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MPICH\\SMPD\\process", 0, KEY_READ, &hKey) == ERROR_SUCCESS)    {	for (;;)	{	    result = RegNotifyChangeKeyValue(hKey, FALSE, REG_NOTIFY_CHANGE_NAME, hRegEvent, TRUE);	    if (result != ERROR_SUCCESS)	    {		smpd_translate_win_error(result, value, 1024, NULL);		smpd_err_printf("RegNotifyChangeKeyValue(SOFTWARE\\MPICH\\SMPD\\process) failed: %s\n", value);		/*printf("result = %d\n", result);*/		RegCloseKey(hKey);		break;	    }	    index = 0;	    len = 100;	    temp_list = NULL;	    for(;;)	    {		result = RegEnumKeyEx(hKey, index, name, &len, NULL, NULL, NULL, &t);		if (result == ERROR_NO_MORE_ITEMS)		    break;		if (result != ERROR_SUCCESS)		    break;		if (len > 0)		{		    if (RegOpenKeyEx(hKey, name, 0, KEY_READ, &hProcKey) == ERROR_SUCCESS)		    {			len = 1024;			if (RegQueryValueEx(hProcKey, "exe", NULL, NULL, (LPBYTE)value, &len) == ERROR_SUCCESS)			{			    node = malloc(sizeof(smpd_registry_proc));			    strcpy(node->pid, name);			    if (len > 0)				strcpy(node->exe, value);			    else				node->exe[0] = '\0';			    node->next = temp_list;			    temp_list = node;			}			RegCloseKey(hProcKey);		    }		}		index++;		len = 100;	    }	    node = list;	    while (node != NULL)	    {		node->handled = SMPD_FALSE;		node = node->next;	    }	    while (temp_list)	    {		node = list;		while (node)		{		    if (strcmp(node->pid, temp_list->pid) == 0)		    {			node->handled = SMPD_TRUE;			break;		    }		    node = node->next;		}		if (node == NULL)		{		    node = temp_list;		    temp_list = temp_list->next;		    node->next = list;		    list = node;		    node->handled = SMPD_TRUE;		    if (bPrint)		    {			printf("+%s %s\n", node->pid, node->exe);			fflush(stdout);		    }		}		else		{		    node = temp_list;		    temp_list = temp_list->next;		    free(node);		}	    }	    trailer = node = list;	    while (node != NULL)	    {		if (node->handled == SMPD_FALSE)		{		    if (bPrint)		    {			printf("-%s %s\n", node->pid, node->exe);			fflush(stdout);		    }		    if (trailer != node)		    {			trailer->next = node->next;			free(node);			node = trailer->next;		    }		    else		    {			list = list->next;			trailer = list;			free(node);			node = list;		    }		}		else		{		    if (trailer != node)			trailer = trailer->next;		    node = node->next;		}	    }	    hEvents[0] = hQuit;	    hEvents[1] = hRegEvent;	    result = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);	    if (result < WAIT_OBJECT_0 || result > WAIT_OBJECT_0 + 2)	    {		if (result == WAIT_FAILED)		{		    result = GetLastError();		    smpd_translate_win_error(result, value, 1024, NULL);		    smpd_err_printf("WaitForMultipleObjects failed: %s\n", value);		    /*		    printf("hQuit = %p\n", hQuit);		    printf("hRegEvent = %p\n", hRegEvent);		    fflush(stdout);		    */		}		else if (result == WAIT_TIMEOUT)		{		    smpd_err_printf("WaitFoMultipleObjects timed out\n");		}		else if (result == WAIT_ABANDONED_0)		{		    smpd_err_printf("WaitForMultipleObjects abandoned due to the hQuit event.\n");		}		else if (result == (WAIT_ABANDONED_0 + 1))		{		    smpd_err_printf("WaitForMultipleObjects abandoned due to the hRegEvent.\n");		}		else		{		    smpd_err_printf("WaitForMultipleObjects returned an unexpected value: %d\n", result);		}		RegCloseKey(hKey);		break;	    }	    if (WaitForSingleObject(hQuit, 0) == WAIT_OBJECT_0)	    {		RegCloseKey(hKey);		break;	    }	    /*	    result = WaitForSingleObject(hRegEvent, INFINITE);	    if (result != WAIT_OBJECT_0)	    {		RegCloseKey(hKey);		break;	    }	    */	    if (!ResetEvent(hRegEvent))	    {		result = GetLastError();		smpd_translate_win_error(result, value, 1024, NULL);		smpd_err_printf("ResetEvent failed: %s\n", value);		return SMPD_FAIL;	    }	}    }    else    {	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MPICH\\SMPD", 0, KEY_READ, &hKey) == ERROR_SUCCESS)	{	    for(;;)	    {		result = RegNotifyChangeKeyValue(hKey, FALSE, REG_NOTIFY_CHANGE_NAME, hRegEvent, TRUE);		if (result != ERROR_SUCCESS)		{		    smpd_translate_win_error(result, value, 1024, NULL);		    smpd_err_printf("RegNotifyChangeKeyValue(SOFTWARE\\MPICH\\SMPD) failed: %s\n", value);		    /*printf("result = %d\n", result);*/		    RegCloseKey(hKey);		    break;		}		index = 0;		len = 100;		for(;;)		{		    result = RegEnumKeyEx(hKey, index, name, &len, NULL, NULL, NULL, &t);		    if (result == ERROR_NO_MORE_ITEMS)			break;		    if (result != ERROR_SUCCESS)			break;		    if (len > 0)		    {			if (strcmp(name, "process") == 0)			{			    CloseHandle(hRegEvent);			    RegCloseKey(hKey);			    goto restart;			}		    }		    index++;		    len = 100;		}		hEvents[0] = hQuit;		hEvents[1] = hRegEvent;		result = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);		if (result < WAIT_OBJECT_0 || result > WAIT_OBJECT_0 + 2)		{		    if (result == WAIT_FAILED)		    {			result = GetLastError();			smpd_translate_win_error(result, value, 1024, NULL);			smpd_err_printf("WaitForMultipleObjects failed: %s\n", value);			/*			printf("hQuit = %p\n", hQuit);			printf("hRegEvent = %p\n", hRegEvent);			fflush(stdout);			*/		    }		    else if (result == WAIT_TIMEOUT)		    {			smpd_err_printf("WaitFoMultipleObjects timed out\n");		    }		    else if (result == WAIT_ABANDONED_0)		    {			smpd_err_printf("WaitForMultipleObjects abandoned due to the hQuit event.\n");		    }		    else if (result == (WAIT_ABANDONED_0 + 1))		    {			smpd_err_printf("WaitForMultipleObjects abandoned due to the hRegEvent.\n");		    }		    else		    {			smpd_err_printf("WaitForMultipleObjects returned an unexpected value: %d\n", result);		    }		    RegCloseKey(hKey);		    break;		}		if (WaitForSingleObject(hQuit, 0) == WAIT_OBJECT_0)		{		    RegCloseKey(hKey);		    break;		}		/*		result = WaitForSingleObject(hRegEvent, INFINITE);		if (result != WAIT_OBJECT_0)		{		    RegCloseKey(hKey);		    break;		}		*/		ResetEvent(hRegEvent);	    }	}    }    CloseHandle(hRegEvent);    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}int smpd_watch_processes(){    HANDLE hThread;    char line[1024], cmd[1024];    int result;    /* turn off extra error output */    smpd_process.dbg_state ^= SMPD_DBG_STATE_TRACE;    smpd_process.dbg_state ^= SMPD_DBG_STATE_PREPEND_RANK;    hQuit = CreateEvent(NULL, TRUE, FALSE, NULL);    if (hQuit == NULL)    {	result = GetLastError();	smpd_translate_win_error(result, line, 1024, NULL);	smpd_err_printf("CreateEvent failed: %s\n", line);	goto fn_exit;    }    hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)smpd_watch_processes_thread, NULL, 0, NULL);    if (hThread == NULL)    {	printf("Unable to create a thread to watch the processes, exiting...\n");	fflush(stdout);	goto fn_exit;    }    while (fgets(line, 1024, stdin) != NULL)    {	line[1023] = '\0';	cmd[0] = '\0';	result = sscanf(line, "%s", cmd);	if (result == EOF)	{	    goto fn_exit;	}	if (stricmp(cmd, "start") == 0)	{	    bPrint = SMPD_TRUE;	}	if (stricmp(cmd, "stop") == 0)	{	    bPrint = SMPD_FALSE;	}	if ((stricmp(cmd, "quit") == 0) || (stricmp(cmd, "exit") == 0))	{	    SetEvent(hQuit);	    WaitForSingleObject(hThread, INFINITE);	    break;	}    }fn_exit:    if (hThread != NULL)	CloseHandle(hThread);    if (hQuit != NULL)	CloseHandle(hQuit);    return SMPD_SUCCESS;}#else /* HAVE_WINDOWS_H */#undef FCNAME#define FCNAME "smpd_watch_processes"int smpd_watch_processes(){    smpd_enter_fn(FCNAME);    printf("Process watching not implemented under unix systems, exiting...\n");    fflush(stdout);    smpd_exit_fn(FCNAME);    return SMPD_SUCCESS;}#endif /* HAVE_WINDOWS_H */

⌨️ 快捷键说明

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