Re: More Specific Broken Pipe Error

new topic     » goto parent     » topic index » view thread      » older message » newer message

On Tue, 14 Nov 2000, Kayhlan wrote:
>> Being an avid Euphoria user, but admittedly a very novice C user I actually
>> have more questions about your questions than I do answers.

Im not C expert myself, infact i was just in your position a little while ago.
 
>> First, man 2 write when talking about error messages lists EPIPE "fd is
>> connected to a pipe or socket
>> whose reading end is closed. When this happens, the writing process will
>> receive a SIGPIPE signal: if
>> it catches, blocks or ignores this error, EPIPE is returned."

hehe, now i see that part of the man page, stupid me

>> Questions about this:
>> 
>> You say errno would be set properly, but how is this passed into Euphoria?
>> Do I have to make a global integer in Euphoria or is this just not possible?

Now again, i dont know a whole lot about C like others on this list (Bernie
Ryan for sure knows his C programming) but i know that errno is a variable
declared as "extern int errno" in the include <errno.h>

As far as i know there is no way to access this variable from Euphoria other
than perhaps peeking into the memory where errno is allocated but i do not know
how to do this myself. Give Bernie Ryan or other more highly qualified C guys a
shout about that question

>> As I said, I have never recorded xxx equal to anything but the length of the
>> data sent.
>> (Possibly because the time it would return -1 it terminates with the broken
>> pipe)

I agree with this theory of why you are never getting -1

>> I do use recv() instead of read, however I cannot make Euphoria pass strings
>> to C so I have been
>> unable to get send() to work properly.

to get Euphoria to pass a string to a C routine, you need to put your sequence
(the euphoria string) into memory ala C style. This can be accomplished using a
simple function like this:

function alloc_string( sequence str )
  atom ptr
  
  ptr = allocate( length( str ) + 1 )
  poke( ptr, str & 0 )

  return ptr
end function

A C compliant pointer is returned by alloc_string which can be used in wherever
a "char *" is needed. In your case, the second argument to send( )

send can also accept pointers to any type of data so if you are not sending
strings, it will work exactly the same.

>> And as far as "catching" the signal, other than poll() (which is not catching
>> the disconnect all the
>> time) I have no clue how to go about detecting the disconnection another way.
>> Is there some function
>> that would test a socket to see if it is still active?

To "catch" a signal sent to a process, you have to install a new signal handler
by using the function "signal( )". the man 2 signal page has some info on
signal but its still kinda confusing so i can give you a little extra help on
that. I have a wrapper for "signal( )" that i *think* works but i have not
tested it, it goes as follows:

function signal( int signum, int routine )
  atom sig_handler_ptr, ret_ptr
  
  sig_handler_ptr = call_back( routine )
  ret_ptr = c_func( signal_, { signum, sig_handler_ptr } )
  
  if ret_ptr = sig_handler_ptr then
    return 0
  else
    return 1
  end if  
end function

Now for my documentation. signal( ) above takes two arguments, the first is the
signal number you want "catch" (in your case SIGPIPE or 13). The second
argument is the routine_id of the function that you will be using to handle the
signal when it is recived. You can get the routine_id of any function in
euphoria by using "routine_id( s )" check the Euphoria reference manual for
details.

If you need some more help with signal or if you dont understand my
rambling, mail back once more and i will try to be a little more clear and
in-depth.

>> thanks very much for your help so far,

No problem, this is what the mailing list is for!

>> Kayhlan

-- 
evil, corruption and bad taste
^[cense]

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu