process_open_write Subroutine

public subroutine process_open_write(cmd, fp, ierr)

NAME

process_open_write(3fm) - [M_process] open a process for writing using a
POSIX interface
(LICENSE:PD)

SYNOPSIS

 subroutine process_open_write(cmd,fp,ierr)

   character(len=*)    :: cmd
   type(streampointer) :: fp
   integer             :: ierr

DESCRIPTION

The M_process Fortran procedures use the ISO_C_BINDING interface to define Fortran-callable versions of the C procedures popen(3c)/pclose(3c) and fgets(3c)/fputs(3c). A set of record-oriented wrapper routines are then used to create a simple Fortran-callable interface.

A POSIX C interface is generally available but may require using a Linux subwindow or an application such as CygWin on MSWindows platforms.

See “M_process” for an extended description.

OPTIONS

cmd      command passed to system to start process
fp       C file pointer returned by process_open_*()
ierr     error flag returned.

          o process_writeline(3f) : negative indicates an error
          o process_readline(3f)  : Non-zero indicates an error

maximum character value length is currently 4096

EXAMPLES

This example shows a routine to write lines to the stdin of a system process

program demo_process_open_write use, intrinsic :: iso_fortran_env, only : & & stdin=>input_unit, & & stdout=>output_unit, & & stderr=>error_unit use M_process ,ONLY: process_open_write, process_writeline use M_process ,ONLY: streampointer, process_close implicit none type(streampointer) :: fp ! line of data to write character(len=4096) :: line integer :: ierr integer :: i ! open process to write to call process_open_write(‘cat -n’,fp,ierr) write(stdout,)’OPENWTEST: process is opened with status ‘,ierr ! remember C and Fortran I/O are often independent of each other flush(stdout) ierr=0 line=’xxxxxxxxxxxxxxxxxxxxxxxxxxx’ do i=1,10 ! write a line to the process call process_writeline(trim(line),fp,ierr) if(ierr.lt.0)then write(stdout,)’OPENWTEST: ierr is ‘,ierr exit endif enddo call process_close(fp,ierr) write(stdout,*)’OPENWTEST: process closed with status ‘,ierr end program demo_process_open_write

Sample output:

OPENWTEST: process is opened with status 0 1 xxxxxxxxxxxxxxxxxxxxxxxxxxx 2 xxxxxxxxxxxxxxxxxxxxxxxxxxx 3 xxxxxxxxxxxxxxxxxxxxxxxxxxx 4 xxxxxxxxxxxxxxxxxxxxxxxxxxx 5 xxxxxxxxxxxxxxxxxxxxxxxxxxx 6 xxxxxxxxxxxxxxxxxxxxxxxxxxx 7 xxxxxxxxxxxxxxxxxxxxxxxxxxx 8 xxxxxxxxxxxxxxxxxxxxxxxxxxx 9 xxxxxxxxxxxxxxxxxxxxxxxxxxx 10 xxxxxxxxxxxxxxxxxxxxxxxxxxx OPENWTEST: process closed with status 0

SEE ALSO

o PIPES: pipe(3c), popen(3c), pclose(3c), fflush(3c)
o NAMED PIPES: mkfifo(3c), mknod(3c)
o SUBPROCESSES: fork(3c)
o OTHER: fflush(3c)

AUTHOR

John S. Urban

LICENSE

Public Domain

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: cmd
type(streampointer), intent(out) :: fp
integer, intent(out) :: ierr

Contents

Source Code


Source Code

subroutine process_open_write(cmd,fp,ierr)

! ident_3="@(#)M_process::process_open_write(3f): open process to write to"

! shell command to start process with
character(len=*),intent(in)     :: cmd
! file pointer returned for process
type(streampointer),intent(out) :: fp
! status for attempt to open process (0= no error)
integer,intent(out)             :: ierr
! read/write mode parameter to pass to popen(3c)
character(len=3),parameter      :: mode='w'
!-------------------------------------------------------------------------------
   ierr=0
   call process_open(cmd,mode,fp,ierr)

end subroutine process_open_write