Hi Alex, > as in 'open'. Therefore, I would rather reduce the functionality of > 'hear', so that from now on it only accepts a file descriptor (and no > longer a symbolic argument). I'll write it into the ReleaseNotes.
I see, thank you. > You tried to use 'rpc' to send messages to the other > philosophers. While this is basically a correct idea, 'rpc' is not > suitable in the current situation. It sends the message via standard > output, and is intended to be used in a 'pipe' call. What is the functional difference between 'rpc' and 'pr' and why the specific constraint on 'rpc' being suitable only for stdout? With 'rpc' I get: : (hear (pipe (do 3 (wait 2000) (rpc 'println ''Ok)))) -> 3 : Ok Ok Ok and with 'pr' I get the same thing: : (hear (pipe (do 3 (wait 2000) (pr '(println 'Ok)) (flush)))) -> 3 : Ok Ok Ok > If you look in the reference for 'hear', it says "hear is usually > only called explicitly by a top level parent process". The reason is > that upon a 'fork', the 'hear' channel is automatically set up in > the child process to be used by the built-in IPC routines. I see, where can I find this automatic channel, is it a named pipe? If not, what channel is used for communication? > As a consequence, if you re-open that channel with 'hear', the child > is effectively cut off from its parent and could, for example, not > synchronize on DB operations. I noticed that 'tell' did not work for me when I opened the fifos, so this is why:-) > So the recommended and natural way is to use 'tell'. In combination with > 'pid', it can also send messages selectively to other processes. Using 'tell' I cannot send a message to the parent process though. I would like to have the philosophers talking to a monitor process which cannot be the parent but must be another child for 'tell' to work. Is that correct? How are children supposed to communicate with the parent process? > As an example, I modified your "phil.l" (I hope I understood it). Each > philosopher (process) keeps the PIDs of his neighbors in the global > variables '*LeftNeighbor' and '*RightNeighbor', and the state of the > forks in '*LeftFork' and '*RightFork'. In the beginning, he waits until > he received the PIDs from the parent process. That's interesting, thank you. 'tell' seems to be asynchronous. If I want to query the philosopher processes about their state, I cannot use something like: (de philState () (list *Pid *State *LeftFork *RightFork) ) .. and in *Monitor process call... (let S (tell 'pid P 'philState) (println S) because 'tell' does not return the result of calling 'philState'. Is there a standard/easy way of achieving this? Thank you, Tomas -- UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe