On 22 November 2012 16:04, Max Leske <maxleske@gmail.com> wrote:
On 22.11.2012, at 12:28, Igor Stasenko <siguctua@gmail.com> wrote:
On 22 November 2012 11:19, Max Leske <maxleske@gmail.com> wrote:
I have run into a small problem with fork():
pid := self primitiveRun. pid isZero ifTrue: [ "child code with exec" ] ifFalse: [ "parent code" ]
primitiveRun <primitive: #primitiveNativeCall module: #NativeBoostPlugin> ^ self nbCall: #( int fork() )
Only the parent code is ever executed, #pid is never 0.
are you sure about that? if you evaluate self fork it will always answer non-zero.. because it is parent process, where you observing result. But that doesnt means that there is no child process which observes different return value.
Assuming that I wouldn't be able to observer when #pid is 0, then the following should still work:
pid := self primitiveRun. pid isZero ifTrue: [ StandardFileStream forceNewFileNamed: 'foo.log' ] <----------------------- ifFalse: [ "parent code" ]
The file 'foo.log' is never created.
The UnixOSProcessPlugin has pretty much the same code:
((pid := self cCode: 'vfork()') = 0) ifFalse: [ "child code" ] ifTrue: [ "parent code" ]
BTW: using vfork() instead of fork() (as OSProcess does) doesn't work either (the image hangs as expected but the file 'foo.log' is not created).
what you mean image hangs? do you see if child process created? -- Best regards, Igor Stasenko.