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

📄 smpd.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include <stdio.h>#include <stdlib.h>#include "smpd.h"#include "mpi.h"#include "smpd_implthread.h"#ifdef HAVE_WINDOWS_H#include "smpd_service.h"#endif#ifdef HAVE_SIGNAL_H#include <signal.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_SYS_STAT_H#include <sys/stat.h>#endif#ifdef HAVE_FCNTL_H#include <fcntl.h>#endif#undef FCNAME#define FCNAME "main"int main(int argc, char* argv[]){    int result;#ifdef HAVE_WINDOWS_H    SERVICE_TABLE_ENTRY dispatchTable[] =    {        { TEXT(SMPD_SERVICE_NAME), (LPSERVICE_MAIN_FUNCTION)smpd_service_main },        { NULL, NULL }    };#else    char smpd_filename[SMPD_MAX_FILENAME] = "";    char response[100] = "no";    char *homedir;#endif    smpd_enter_fn(FCNAME);    /* initialization */    putenv("PMI_SMPD_FD=0");    result = PMPI_Init(&argc, &argv);    SMPD_CS_ENTER();    if (result != MPI_SUCCESS)    {	smpd_err_printf("MPI_Init failed,\n error: %d\n", result);	smpd_exit_fn(FCNAME);	return result;    }    /* Initialization now done by MPI_Init above.    result = MPIDU_Sock_init();    if (result != MPI_SUCCESS)    {	smpd_err_printf("MPIDU_Sock_init failed,\nsock error: %s\n", get_sock_error_string(result));	smpd_exit_fn(FCNAME);	return result;    }    result = smpd_init_process();    if (result != SMPD_SUCCESS)    {	smpd_err_printf("smpd_init_process failed.\n");	smpd_exit_fn(FCNAME);	return result;    }    */    /* parse the command line */    result = smpd_parse_command_args(&argc, &argv);    if (result != SMPD_SUCCESS)    {	smpd_err_printf("Unable to parse the command arguments.\n");	smpd_exit_fn(FCNAME);	return result;    }#ifdef HAVE_WINDOWS_H    if (smpd_process.bService)    {	/*	printf( "\nStartServiceCtrlDispatcher being called.\n" );	printf( "This may take several seconds.  Please wait.\n" );	fflush(stdout);	*/	/* If StartServiceCtrlDispatcher returns true the service has exited */	result = StartServiceCtrlDispatcher(dispatchTable);	if (result)	{	    smpd_exit_fn(FCNAME);	    smpd_exit(0);	}	result = GetLastError();	if (result != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)	{	    smpd_add_error_to_message_log(TEXT("StartServiceCtrlDispatcher failed."));	    smpd_exit_fn(FCNAME);	    smpd_exit(0);	}	smpd_print_options();	smpd_exit_fn(FCNAME);	smpd_exit(0);    }    /*    printf("\nRunning smpd from the console, not as a service.\n");    fflush(stdout);    smpd_process.bService = SMPD_FALSE;    */#endif    if (smpd_process.passphrase[0] == '\0')	smpd_get_smpd_data("phrase", smpd_process.passphrase, SMPD_PASSPHRASE_MAX_LENGTH);    if (smpd_process.passphrase[0] == '\0')    {	if (smpd_process.noprompt)	{	    printf("Error: No smpd passphrase specified through the registry or .smpd file, exiting.\n");	    smpd_exit_fn(FCNAME);	    return -1;	}	printf("Please specify an authentication passphrase for this smpd: ");	fflush(stdout);	smpd_get_password(smpd_process.passphrase);#ifndef HAVE_WINDOWS_H	homedir = getenv("HOME");	if(homedir != NULL){	    strcpy(smpd_filename, homedir);	    if (smpd_filename[strlen(smpd_filename)-1] != '/')	        strcat(smpd_filename, "/.smpd");	    else	        strcat(smpd_filename, ".smpd");	}else{	    strcpy(smpd_filename, ".smpd");	}	printf("Would you like to save this passphrase in '%s'? ", smpd_filename);	fflush(stdout);	fgets(response, 100, stdin);	if (smpd_is_affirmative(response))	{	    FILE *fout;	    umask(0077);	    fout = fopen(smpd_filename, "w");	    if (fout == NULL)	    {		printf("Error: unable to open '%s', errno = %d\n", smpd_filename, errno);		smpd_exit_fn(FCNAME);		return errno;	    }	    fprintf(fout, "phrase=%s\n", smpd_process.passphrase);	    fclose(fout);	}#endif    }    result = smpd_entry_point();    smpd_finalize_printf();    SMPD_CS_EXIT();    smpd_exit(result);    smpd_exit_fn(FCNAME);    return result;}#undef FCNAME#define FCNAME "smpd_entry_point"int smpd_entry_point(){    int result;    MPIDU_Sock_set_t set;    MPIDU_Sock_t listener;    SMPD_BOOL print_port = SMPD_FALSE;    /* This function is called by main or by smpd_service_main in the case of a Windows service */    smpd_enter_fn(FCNAME);#ifdef HAVE_WINDOWS_H    /* prevent the os from bringing up debug message boxes if this process crashes */    if (smpd_process.bService)    {	SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);	if (!smpd_report_status_to_sc_mgr(SERVICE_RUNNING, NO_ERROR, 0))	{	    result = GetLastError();	    smpd_err_printf("Unable to report that the service has started, error: %d\n", result);	    smpd_exit_fn(FCNAME);	    return result;	}	smpd_clear_process_registry();    smpd_get_smpd_data("phrase", smpd_process.passphrase, SMPD_PASSPHRASE_MAX_LENGTH);    }#endif    /* This process is the root_smpd.  All sessions are child processes of this process. */    smpd_process.id = 0;    smpd_process.root_smpd = SMPD_TRUE;    if (smpd_process.pszExe[0] != '\0')    {	smpd_set_smpd_data("binary", smpd_process.pszExe);    }    result = MPIDU_Sock_create_set(&set);    if (result != MPI_SUCCESS)    {	smpd_err_printf("MPIDU_Sock_create_set failed,\nsock error: %s\n", get_sock_error_string(result));	smpd_exit_fn(FCNAME);	return result;    }    smpd_process.set = set;    smpd_dbg_printf("created a set for the listener: %d\n", MPIDU_Sock_get_sock_set_id(set));    if (smpd_process.port == 0)	print_port = SMPD_TRUE;    result = MPIDU_Sock_listen(set, NULL, &smpd_process.port, &listener);     if (result != MPI_SUCCESS)    {	/* If another smpd is running and listening on this port, tell it to shutdown or restart? */	smpd_err_printf("MPIDU_Sock_listen failed,\nsock error: %s\n", get_sock_error_string(result));	smpd_exit_fn(FCNAME);	return result;    }    smpd_dbg_printf("smpd listening on port %d\n", smpd_process.port);    if (print_port)    {	printf("%d\n", smpd_process.port);	fflush(stdout);    }    result = smpd_create_context(SMPD_CONTEXT_LISTENER, set, listener, -1, &smpd_process.listener_context);    if (result != SMPD_SUCCESS)    {	smpd_err_printf("unable to create a context for the smpd listener.\n");	smpd_exit_fn(FCNAME);	return result;    }    result = MPIDU_Sock_set_user_ptr(listener, smpd_process.listener_context);    if (result != MPI_SUCCESS)    {	smpd_err_printf("MPIDU_Sock_set_user_ptr failed,\nsock error: %s\n", get_sock_error_string(result));	smpd_exit_fn(FCNAME);	return result;    }    smpd_process.listener_context->state = SMPD_SMPD_LISTENING;    if (smpd_process.root_smpd){		if(smpd_option_on("no_dynamic_hosts") == SMPD_FALSE){			smpd_insert_into_dynamic_hosts();		}	}#ifndef HAVE_WINDOWS_H    /* put myself in the background if flag is set */    if (smpd_process.bNoTTY)    {	int fd, maxfd;        if (fork() != 0)	{	    /* parent exits */	    exit(0);	}	/* become session leader; no controlling tty */	setsid();	/* make sure no sighup when leader ends */	smpd_signal(SIGHUP, SIG_IGN);	/* leader exits; svr4: make sure do not get another controlling tty */        if (fork() != 0)	    exit(0);	/* redirect stdout/err to nothing */	fd = open("/dev/null", O_APPEND);	if (fd != -1)	{	    close(1);	    close(2);	    dup2(fd, 1);	    dup2(fd, 2);	    close(fd);	}	/* the stdin file descriptor 0 needs to be occupied so it doesn't get used by socketpair */	/*close(0);*/	/* maybe 0 should be redirected to "/dev/null" just like 1 and 2? */	fd = open("/dev/null", O_RDONLY);	if (fd != -1)	{	    close(0);	    dup2(fd, 0);	    close(fd);	}	/* get out of the current directory to get out of the way of possibly mounted directories */	chdir("/");	/* close all open file descriptors */	/* We don't want to close the listener sock.  This code should be moved to the very beginning of main */	/*	maxfd = sysconf(_SC_OPEN_MAX);	if (maxfd < 0)	    maxfd = 255;	for (i=3; i<maxfd; i++)	    close(i);	*/    }#endif    result = smpd_enter_at_state(set, SMPD_SMPD_LISTENING);    if (result != SMPD_SUCCESS)    {	smpd_err_printf("state machine failed.\n");    }    if (smpd_process.root_smpd)	smpd_remove_from_dynamic_hosts();    result = MPIDU_Sock_destroy_set(set);    if (result != MPI_SUCCESS)    {	smpd_err_printf("unable to destroy the set, error:\n%s\n",	    get_sock_error_string(result));    }    /*    result = MPIDU_Sock_finalize();    if (result != MPI_SUCCESS)    {	smpd_err_printf("MPIDU_Sock_finalize failed,\nsock error: %s\n", get_sock_error_string(result));    }    */    smpd_exit_fn(FCNAME);    return 0;}

⌨️ 快捷键说明

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