class WAITPID_INPUT
Summary
A specific input stream that gathers child process exit status. It must be created at most once.
If this stream is created then exiting children will send data in this channel.
Each child sends exactly one empty line, plus "out-of-band" information containing the child PID and its exit status.
Direct parents
Inherit list: TERMINAL_INPUT_STREAM
Insert list: SINGLETON
Class invariant
Overview
Creation features
{PROCESS_WAIT}
Features
{ANY}
{FILTER}
{}
{ANY}
{ANY}
{FILTER_INPUT_STREAM}
{FILTER}
{ANY}
{}
{ANY}
{}
{STREAM_HANDLER}
{ANY}
{}
{RECYCLING_POOL}
  • recycle
    Do whatever needs to be done to free resources or recycle other objects when recycling this one
{}
  • dispose
    Action to be executed just before garbage collection reclaims an object.
{}
{ANY}
Skipping separators:
{ANY}
To read one number at a time:
{ANY}
To read one line or one word at a time:
{ANY}
Other features:
{ANY}
{}
{FILTER}
{ANY}
  • is_equal (other: WAITPID_INPUT): BOOLEAN
    Is other attached to an object considered equal to current object?
{}
is_connected: BOOLEAN
is True
constant attribute
{ANY}
True if the stream is connected.
Only in that case can data be transferred via this stream.
can_disconnect: BOOLEAN
is False
constant attribute
{ANY}
True if the stream can be safely disconnected (without data loss, etc.)
require
    • is_connected
    • is_connected
disconnect
effective procedure
{ANY}
Try to disconnect the stream.
Note that it *does not* ensure that the stream will effectively be disconnected (some terminal streams, for instance, are always connected) but the feature can be used to "shake off" filters.
require
    • is_connected
    • can_disconnect
    • is_connected
    • can_disconnect
ensure
  • not is_filtered
can_unread_character: BOOLEAN
effective function
{ANY}
require
  • is_connected
  • valid_last_character
valid_last_character: BOOLEAN
effective function
{ANY}
require
  • is_connected
end_of_input: BOOLEAN
is False
constant attribute
{ANY}
end_of_input means the previous attempt in character reading failed because the end has been reached.
So last_character is not valid and you are not allowed to do any read attempt anymore.
Notes:
  • Just after a successful connect, end_of_input is always False because you did not yet read anything).
  • Once the end of input has been reached, this is definitive in that no more characters will ever be provided (but of course you can still come back if can_unread_character; end_of_input will be changed if you unread_character). In that, it is different from can_read_character which is only a temporary state.
Please refer to the Liberty Eiffel FAQ or tutorial/io examples.
effective function
{ANY}
require
status: INTEGER_32
effective function
{ANY}
require
has_oob_info: BOOLEAN
effective function
{ANY}
drop_oop_info
effective procedure
{ANY}
filtered_descriptor: INTEGER_32
effective function
Find the descriptor of the terminal stream...
Filters do not have descriptors of their own
require
    • is_connected
    • filtered_has_descriptor
    • is_connected
    • filtered_has_descriptor
filtered_has_descriptor: BOOLEAN
is True
constant attribute
True if the underlying terminal stream has a descriptor
require
    • is_connected
    • is_connected
filtered_stream_pointer: POINTER
effective function
Find the pointer of the terminal stream...
Filters do not have pointers of their own
require
    • is_connected
    • filtered_has_stream_pointer
    • is_connected
    • filtered_has_stream_pointer
filtered_has_stream_pointer: BOOLEAN
is False
constant attribute
True if the underlying terminal stream has a pointer
require
    • is_connected
    • is_connected
filtered_read_character
effective procedure
require
  • is_connected
  • can_read_character
filtered_unread_character
effective procedure
require
  • is_connected
  • can_unread_character
filtered_last_character: CHARACTER
effective function
require
  • is_connected
  • valid_last_character
make
effective procedure
{}
writable attribute
{}
index: INTEGER_32
writable attribute
{}
upper: INTEGER_32
writable attribute
{}
oob_info_pid: RING_ARRAY[INTEGER_32]
writable attribute
{}
oob_info_status: RING_ARRAY[INTEGER_32]
writable attribute
{}
set_oob_info (a_pid: INTEGER_32, a_status: INTEGER_32)
effective procedure
{}
read_buffer
effective procedure
{}
basic_exec_waitpid_read_buffer (data: POINTER): INTEGER_32
{}
basic_exec_waitpid_fd: INTEGER_32
{}
basic_exec_waitpid_init (obj: WAITPID_INPUT)
{}
can_read_character: BOOLEAN
is True
constant attribute
{ANY}
Note that this state is usually temporary.
Usually it is called until either it becomes True or the stream is disconnected:
 from
 until
    stream.can_read_character or else not stream.is_connected
 loop
    -- some "still waiting..." code, maybe a sandglass?
 end
 if stream.is_connected then
    stream.read_character
 end
See also: is_connected, end_of_input
require
  • is_connected
ensure
  • Result implies not end_of_input
can_read_line: BOOLEAN
is True
constant attribute
{ANY}
require
  • is_connected
read_character
effective procedure
{ANY}
If read_character fail, end_of_input is set.
Else, use last_character. Read tutorial or io cluster documentation to learn the read_character usage pattern.
require
  • is_connected
  • not is_filtered and then can_read_character
ensure
read_line_in (buffer: STRING)
effective procedure
{ANY}
Same job as read_line but storage is directly done in buffer.
Read tutorial or io cluster documentation to learn the read_line usage pattern.
require
  • is_connected
  • not is_filtered and then can_read_line
  • buffer /= Void
read_available_in (buffer: STRING, limit: INTEGER_32)
effective procedure
{ANY}
Same job as read_available but storage is directly done in buffer.
The usage pattern is the same as for read_line.
require
  • is_connected
  • not is_filtered
  • buffer /= Void
  • limit > 0
unread_character
effective procedure
{ANY}
require
  • is_connected
  • not is_filtered and then can_unread_character
ensure
last_character: CHARACTER
effective function
{ANY}
require
  • is_connected
  • not end_of_input
  • not is_filtered and then valid_last_character
ensure
detach
effective procedure
{ANY}
Shake off the filter.
ensure
  • not is_filtered
filtered_read_available_in (buffer: STRING, limit: INTEGER_32)
effective procedure
require
filtered_read_line_in (buffer: STRING)
effective procedure
require
writable attribute
The filter that uses this stream as backend
event_can_read: EVENT_DESCRIPTOR
effective function
{ANY}
writable attribute
{}
new_url: URL
effective function
{}
ensure
  • Result /= Void
descriptor: INTEGER_32
effective function
{ANY}
Some OS-dependent descriptor.
Mainly used by the sequencer library (see READY_CONDITION).
require
has_descriptor: BOOLEAN
effective function
{ANY}
True if that stream can be associated to some OS-meaningful descriptor.
require
url: URL
frozen
effective function
{ANY}
The URL to this stream as resource
ensure
  • not_void: Result /= Void
  • always_the_same: Result = url
url_memory: URL
writable attribute
{}
stream_pointer: POINTER
effective function
Some Back-end-dependent pointer (FILE* in C, InputStream or OutputStream in Java)
has_stream_pointer: BOOLEAN
effective function
True if that stream can be associated to some Back-end-meaningful stream pointer.
require
event_exception: EVENT_DESCRIPTOR
effective function
{ANY}
stream_exception: STREAM_EXCEPTION
writable attribute
{}
recycle
effective procedure
Do whatever needs to be done to free resources or recycle other objects when recycling this one
dispose
effective procedure
{}
Action to be executed just before garbage collection reclaims an object.
sequencer_descriptor (file: POINTER): INTEGER_32
{}
is_filtered: BOOLEAN
deferred function
{ANY}
skip_separators
effective procedure
{ANY}
Skip all separators (see is_separator of class CHARACTER) and make the first non-separator available in last_character.
This non-separator character is pushed back into the stream (see unread_character) to be available one more time (the next read_character will consider this non-separator). When end_of_input occurs, this process is automatically stopped.
require
skip_separators_using (separators: STRING)
effective procedure
{ANY}
Same job as skip_separators using the separators set.
require
skip_remainder_of_line
effective procedure
{ANY}
Skip all the remainder of the line including the end of line delimiter itself.
read_integer
effective procedure
{ANY}
Read an integer according to the Eiffel syntax.
 Make result available in last_integer.  Heading
separators are automatically skipped using is_separator of class CHARACTER.  Trailing separators
are not skipped.
require ensure
last_integer: INTEGER_32
writable attribute
{ANY}
Last integer read using read_integer.
valid_last_integer: BOOLEAN
writable attribute
{ANY}
Was the last call to read_integer successful ?
last_real: REAL_64
writable attribute
{ANY}
Last real read with read_real.
valid_last_real: BOOLEAN
writable attribute
{ANY}
Was the last call to read_real successful ?
read_real
effective procedure
{ANY}
Read a REAL and make the result available in last_real.
require ensure
last_string: STRING
once function
{ANY}
Access to the unique common buffer to get for example the result computed by read_line, read_word, newline, etc.
This is a once function (the same common buffer is used for all streams).
read_line
effective procedure
{ANY}
Read a complete line ended by '%N' or end_of_input.%
% Make the result available in last_string common buffer. The end of line character (usually '%N') is not added in the last_string buffer. Read tutorial or io cluster documentation to learn the read_line usage pattern.
See also read_line_in.
require
read_available (limit: INTEGER_32)
effective procedure
{ANY}
Read as many characters as possible, as long as the stream does not block and up to the given limit.
read_word
effective procedure
{ANY}
Read a word using is_separator of class CHARACTER.
The result is available in the last_string common buffer. Heading separators are automatically skipped. Trailing separators are not skipped (last_character is left on the first one). If end_of_input is encountered, Result can be the empty string.
require
newline
effective procedure
{ANY}
Consume input until newline ('%N') is found.
% The corresponding STRING is stored in last_string common buffer.
require
reach_and_skip (keyword: STRING)
effective procedure
{ANY}
Try to skip enough characters in order to reach the keyword which is skipped too.
If the keyword is not in the remainder of this stream, the process is stopped as soon as end_of_input occurs.
require ensure
read_word_using (separators: STRING)
effective procedure
{ANY}
Same job as read_word using separators.
require
read_tail_in (str: STRING)
effective procedure
{ANY}
Read all remaining character of the stream in str.
require ensure
io_getc (stream: POINTER): INTEGER_32
{}
io_ungetc (byte: CHARACTER, stream: POINTER)
{}
io_fread (buf: NATIVE_ARRAY[CHARACTER], size: INTEGER_32, stream: POINTER): INTEGER_32
{}
return size read or 0 if end of input (-1 on error => exception ?)
{}
set_filter (a_filter: FILTER)
effective procedure
Used by the filter itself to get attached
require
  • a_filter /= Void
ensure
is_equal (other: WAITPID_INPUT): BOOLEAN
effective function
{ANY}
Is other attached to an object considered equal to current object?
require
  • other /= Void
ensure
  • commutative: generating_type = other.generating_type implies Result = other.is_equal(Current)
is_real_singleton: BOOLEAN
effective function
{}
ensure
  • assertion_check_only: Result
singleton_memory_pool: HASHED_DICTIONARY[POINTER, STRING]
once function
{}
This pool is unique in the whole system.
A memory is kept for each singleton type (type, not class) in the system.
current_is_not_an_expanded_type: BOOLEAN
effective function
{}
Check that the dynamic type of the SINGLETON is not an expanded type.