[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Graphics in forked subprocess
From: |
Pavel Hofman |
Subject: |
Re: Graphics in forked subprocess |
Date: |
Mon, 20 May 2019 08:23:32 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 |
Hi Mike,
Dne 19. 05. 19 v 22:53 Mike Miller napsal(a):
On Sun, May 19, 2019 at 21:52:39 +0200, Pavel Hofman wrote:
Thanks a lot for your help. I did use exec. But exec creates two
child processes: A) octave which runs B)
/usr/lib/x86_64-linux-gnu/octave/4.2.2/exec/x86_64-pc-linux-gnu/octave-gui.
B) runs the actual script while PID of A) is returned by exec().
Are you sure the process IDs of A and B are different? In my testing
they are the same. The intent is for the process ID to remain the
same.
There are two processes for each octave created:
4868 pts/4 S+ 0:00 octave testExec.m
4869 ? Ssl 0:00
/usr/lib/x86_64-linux-gnu/octave/4.2.2/exec/x86_64-pc-linux-gnu/octave-gui
testExec.m
4885 ? S 0:00 octave testGui.m
4886 ? Ssl 0:00
/usr/lib/x86_64-linux-gnu/octave/4.2.2/exec/x86_64-pc-linux-gnu/octave-gui
testGui.m
The fork call returns PID 4885. If testExec does not use waitpid() and
4885 gets killed (kill 4885), the child 4886 exits correctly, but 4885
stays running as zombie process and checking with kill(4885, 0) keeps
returning 0 - the process is still running.
I need to start 3 children. The waitpid(-1) should be waiting for any
child and return the child PID which finished. Still my controlling
thread cannot block, it must be able to react to user requests. My idea
was to check for all child PIDs existence with a loop using kill(PID,
0), without blocking with waitpid().
I could have one thread blocked with waitpid, restarting the respective
children if needed, and another sending the kills if requested by the user.
But GUI (pushbutton callback) and waitpid do not mix as the GUI callback
requires pause/waitfor while waitpid blocks, never reaching that code...
That is why I skipped the exec call and sourced octave code
directly after forking.
Please what is the best practice for this kind of control? I know I
can use a side channel, but I want to be able to kill the child
reliably (kill -15 ?) even if it gets stuck.
That sounds like a fine approach.
Well, I really do not want to use the side channel as it is not reliable.
Keep in mind there is at least one
known bug with ending an Octave process with SIGTERM in Octave 4.4
and later versions.
https://savannah.gnu.org/bugs/?54444)
Interesting, please any chance of that fixed? I do not know if that
would affect my case but probably yes - I wanted to be sending sigterm
signals.
Please does this fork/exec/kill functionality work in windows octave
build too? If not, no reason to fight this in octave and I whould
directly use bash for linux and vbs for windows somehow.
Thanks a lot,
Pavel.