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

📄 pipecom.cpp

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 CPP
字号:
/* ---------------------------------------------------------------------- * Where........: CMAP - Polytechnique * File.........: pipecom.c * Author.......: Bertrand Lamy (Equipe genetique) * Created......: Mon Mar 13 13:50:11 1995 * Description..: Communication par pipe bidirectionnel avec un autre process * ---------------------------------------------------------------------- */// MSC equivalent must be written and tested or some #idef instructions added// with a clear message at compile time that this is for Unix only ???#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <cstdlib>#include <cstring>#include <stdio.h>#include <signal.h>#include <unistd.h>#include "pipecom.h"int Check( PCom *com ){    if( ! com ) {	fprintf( stderr, "PipeCom: Null pointer.\n" );	fflush( stderr );	return 0;    }    if( kill( com->pid, 0 ) != 0 ) {	fprintf( stderr, "PipeCom: process doesn't exists.\n" );	fflush( stderr );	return 0;    }    return 1;}PCom * PipeComOpen( char *prog ){    char	*args[2];    args[0] = prog;    args[1] = NULL;    return PipeComOpenArgv( prog, args );}PCom * PipeComOpenArgv( char *prog, char *argv[] ){    int		toFils[2];    int		toPere[2];    int		sonPid;    PCom	* ret = NULL;    if( pipe( toFils ) < 0 ) {	perror( "PipeComOpen: Creating pipes" );	return ret;    }    if( pipe( toPere ) < 0 ) {	perror( "PipeComOpen: Creating pipes" );	return ret;    }    switch( (sonPid = vfork()) ) {    case -1:	perror("PipeComOpen: fork failed" );	return ret;	break;    case 0:	/* --- Here's the son --- */	/* --- replace old stdin --- */	if( dup2( toFils[0], fileno(stdin) ) < 0 ) {	    perror( "PipeComOpen(son): could not connect" );	    exit( -1 );	    /* --- AVOIR: kill my father --- */	}	if( dup2( toPere[1], fileno(stdout) ) < 0 ) {	    perror( "PipeComOpen(son): could not connect" );	    exit( -1 );	}	if( execvp( prog, argv ) < 0 ) {	    perror( prog );	    perror( "PipeComOpen: can't exec" );	    exit(1);	}	break;    default:	ret = (PCom *) malloc( sizeof(PCom) );	if( ! ret )	    return NULL;	ret->fWrit = (FILE *)fdopen( toFils[1], "w" );	ret->fRead = (FILE *)fdopen( toPere[0], "r" );	ret->pid = sonPid;    }    return ret;}int PipeComSend( PCom *to, const char *line ){    int	nb = 0;    if( ! Check(to ) )	return nb;    nb = fprintf( to->fWrit, line );    fflush( to->fWrit );    return nb;}int PipeComSendn( PCom *to, const char *data, int n ){    int	nb = 0;    if( ! Check(to) )	return nb;    nb = fwrite( data, 1, n, to->fWrit );    fflush( to->fWrit );    return nb;}int PipeComReceive( PCom *from, char *data, int max ){    if( ! Check(from) )	return 0;    if( ! data ) {      fprintf( stderr, "PipeComReceive: Invalid data pointer\n" );      fflush( stderr );      return 0;    }    if( fgets( data, max, from->fRead ) )	return strlen(data);    return 0;}int PipeComClose( PCom *to ){    if( ! Check(to) )	return 0;    fclose( to->fRead );    fclose( to->fWrit );    free( to );    return 1;}int PipeComWaitFor( PCom *from, char *what ){    char	buffer[256];    do {	if( ! PipeComReceive( from, buffer, 256 ) )	    return 0;    } while( strcmp( buffer, what ) );    return 1;}// Local Variables:// coding: iso-8859-1// c-file-style: "Stroustrup"// fill-column: 80// End:

⌨️ 快捷键说明

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