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

📄 iserv_p4.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
#include "p4.h"#include "p4_sys.h"extern int errno;extern char *sys_errlist[];VOID reaper();main(argc,argv)int argc;char **argv;{    int listen_fd, connection_fd;    int port;    int done;    struct sockaddr_in from;    int fromlen;        p4_initenv(&argc,argv);    sprintf(whoami_p4, "server"); /* alter p4 environment */    net_setup_listener(5, UNRESERVED_PORT, &listen_fd);#ifdef P4BSD    signal(SIGCHLD, reaper);#endif#ifdef P4SYSV    signal(SIGCLD, reaper);#endif    done = FALSE;    while (!done)    {	fromlen = sizeof(from);	connection_fd = accept(listen_fd, &from, &fromlen);	if (connection_fd == -1)	{	    if (errno == EINTR)		continue;	    else	    {		perror("server accept");		exit(1);	    }	}	p4_dprintfl(20,"accepted on %d\n", connection_fd);	done = process_connection(connection_fd);	shutdown(connection_fd, 2);	close(connection_fd);    }    shutdown(listen_fd, 2);    close(listen_fd);}process_connection(fd)int fd;{struct net_message_t msg;int type;char *pgm;char *host;char *am_slave;int port;    if (net_recv(fd, &msg, sizeof(msg)) == NET_RECV_EOF)	return(FALSE);    type = p4_n_to_i(msg.type);    switch (type)    {	case NET_EXEC:	    pgm = msg.pgm;	    host = msg.host;	    am_slave = msg.am_slave;	    port = p4_n_to_i(msg.port);	    p4_dprintfl(20,"server got exec msg: pgm=%s host=%s port=%d am_slave=%s\n",		   pgm, host, port, am_slave);	    exec_pgm(host, pgm, port, am_slave);	    msg.type = p4_i_to_n(NET_RESPONSE);	    msg.success = p4_i_to_n(1);	    net_send(fd, &msg, sizeof(msg), FALSE);	    return(FALSE);	case NET_DONE:	    p4_dprintfl(20,"server got done message\n");	    return(TRUE);	default:	    p4_dprintfl(20,"server got unknown message type %d\n", type);	    return(FALSE);    }}	VOID exec_pgm(host, pgm, port, am_slave)char *host, *pgm, *am_slave;int port;{int pid;int rc;char shortpgm[100];char sport[10];char *s;    if ((s = rindex(pgm, '/')) != NULL)	strcpy(shortpgm, s + 1);    else	strcpy(shortpgm, pgm);    sprintf(sport, "%d", port);    p4_dprintfl(20,"exec_pgm: pgm=%s short=%s sport=%s\n",		    pgm, shortpgm, sport);    fflush(stdout);    pid = fork();  /* Not fork_p4 here as don't want interrupts on error */    if (pid < 0)	p4_error("exec_pgm fork",pid);    if (pid == 0)    {	/* The child */	/****	  RB This line is typically used, but some versions	  of exec seem to have a bug requiring the full pgm	  name to be in both arg positions.	rc = execl(pgm, shortpgm, host, sport, am_slave, NULL);	****/	rc = execl(pgm, pgm, host, sport, am_slave, NULL);	if (rc < 0)	    p4_error("exec_pgm execl",rc);	exit(1);    }}VOID reaper(){int status;int pid;        p4_dprintfl(20,"server: entering reaper\n");    pid = wait(&status);    p4_dprintfl(20,"server: pid %d died with status %d\n", pid, status);}int slave() /* dummy proc */{    return(0);}

⌨️ 快捷键说明

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