shmproc.c

来自「fortran并行计算包」· C语言 代码 · 共 146 行

C
146
字号
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2006 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. *//*  * This file defines a few routines to allow one process to write to the  * memory of another process.  This makes use of a few special interfaces * provided by some operating systems.  For some Unix versions, ptrace * may be used.  Windows provides WriteProcessMemory etc *  */#include "mpidi_ch3_impl.h"#ifndef HAVE_WINDOWS_H#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#ifdef HAVE_SYS_PTRACE_H#include <sys/ptrace.h>#endif#include <sys/wait.h>#include <errno.h>#define OFF_T off_t#define OFF_T_CAST(a) ((off_t)(a))#endif#ifndef HAVE_WINDOWS_H/* FIXME: Do we need these routines for all shmem or only for some options? *//* Initialize for reading and writing to the designated process */int MPIDI_SHM_InitRWProc( pid_t pid, int *fd ){    char filename[256];    int mpi_errno = MPI_SUCCESS;    MPIU_Snprintf(filename, sizeof(filename), "/proc/%d/mem", pid);    *fd = open(filename, O_RDWR );    if (*fd == -1) {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, 			  FCNAME, __LINE__, MPI_ERR_OTHER, 			  "**open", "**open %s %d %d", filename, pid, errno);	return mpi_errno;	    }    return mpi_errno;}#if defined(USE_RDMA_READV) || defined(USE_RDMA_WRITEV)/* Call with vc->ch.nSharedProcessID  * This must be called to allow other operations */int MPIDI_SHM_AttachProc( pid_t pid ){    int mpi_errno = MPI_SUCCESS;    int status;    if (ptrace(PTRACE_ATTACH, pid, 0, 0) != 0) {	MPIU_ERR_SETANDJUMP2(mpi_errno,MPI_ERR_OTHER,"**fail", 			     "**fail %s %d", "ptrace attach failed", errno);    }    if (waitpid(pid, &status, WUNTRACED) != pid) {	MPIU_ERR_SETANDJUMP2(mpi_errno,MPI_ERR_OTHER, "**fail", 			     "**fail %s %d", "waitpid failed", errno);    } fn_fail:    return mpi_errno;}/* Call with vc->ch.nSharedProcessID  * This should be called when access to the designated processes memory  * is no longer needed.  Use MPIDI_SHM_AttachProc to renew access to that * processes memory. */int MPIDI_SHM_DetachProc( pid_t pid ){    int mpi_errno = MPI_SUCCESS;    if (ptrace(PTRACE_DETACH, pid, 0, 0) != 0) {	MPIU_ERR_SETANDJUMP2(mpi_errno,MPI_ERR_OTHER, "**fail", 			     "**fail %s %d", "ptrace detach failed", errno);    } fn_fail:    return mpi_errno;}/* Read by seeking to the memory location on the file descriptor and then   using read. */int MPIDI_SHM_ReadProcessMemory( int fd, int pid, 				 const char *source, char *dest, size_t len ){    off_t offset = OFF_T_CAST(source);    off_t uOffset;    int   num_read;    int mpi_errno = MPI_SUCCESS;    uOffset = lseek( fd, offset, SEEK_SET );    if (uOffset != offset) {	MPIU_ERR_SETANDJUMP2(mpi_errno,MPI_ERR_OTHER, "**fail", 			    "**fail %s %d", "lseek failed", errno);    }    num_read = read( fd, dest, len );    if (num_read < 1) {	if (num_read == -1) {	    MPIU_ERR_SETANDJUMP2(mpi_errno,MPI_ERR_OTHER, "**fail", 				 "**fail %s %d", "read failed", errno);	}	/* If we only read part of the data, use ptrace to do what? */	/* According to the man page on ptrace, this reads	   a word (4 bytes) of memory at the location given by the third 	   argument. This is use to force the page in place.	*/	ptrace( PTRACE_PEEKDATA, pid, source+len - num_read, 0 );    }    /* FIXME: Now what? Why not continue to read? */ fn_fail:    return mpi_errno;}#endif /* defined(USE_RDMA_READV) || defined(USE_RDMA_WRITEV) */#else/* HAVE_WINDOWS_H and use Windows interface *//* Initialize for reading and writing to the designated process */#undef FUNCNAME#define FUNCNAME MPIDI_SHM_InitRWProc#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_SHM_InitRWProc( pid_t pid, int *phandle ){	int mpi_errno = MPI_SUCCESS;    *phandle =	OpenProcess(STANDARD_RIGHTS_REQUIRED | PROCESS_VM_READ | 		    PROCESS_VM_WRITE | PROCESS_VM_OPERATION, 		    FALSE, pid);    if (*phandle == NULL) {	int err = GetLastError();	/* mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**OpenProcess", "**OpenProcess %d %d", info.pg_rank, err); */	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**OpenProcess", "**OpenProcess %d %d", pid, err);    }    return mpi_errno;}#endif

⌨️ 快捷键说明

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