19960


emacs の、非同期プロセスの process-status は、どのタイミングで更新されるのでしょう？ lisp
コードが実行している最中に更新されうるものなのでしょうか？具体的には：

[code]

    (defun some-func (process)
      (process-status process)
      ;; some work;
      ;; process は特に操作しない
      (process-status process))
    
[/code]

のようなコードがあったときに、これら `process-status` の結果は、(process の非同期の状態変化により)変わりうるものなのでしょうか？  
非同期プロセスを扱う elisp を記述しようして、この疑問が生じました。

* * *

Sentinel については、

<https://www.gnu.org/software/emacs/manual/html_node/elisp/Sentinels.html#Sentinels>

によると、 emacs が待機状態のときのみに実行される、とありますが、 process-status
がいつ更新されるかの記述が見つからなかったので、質問しています。


CC BY-SA 3.0
2015-12-11T14:35:55.807
19891
2015-12-14T07:07:53.967
2015-12-12T06:02:02.097
754
754
question
emacs elisp
emacs の非同期プロセスの、 process-status の更新タイミングは？


実際には [handle_child_signal (int
sig)](http://git.savannah.gnu.org/cgit/emacs.git/tree/src/process.c?h=emacs-25#n6453)
で process status の更新を行っています。関数名からも判る通り、`signal(SIGCHLD)`
によるソフトウェア割り込みを利用しています。したがって、この関数のコメントにもある通り emacs process
が実行中の間はいつでも更新されうるという事になります。

> Handle a SIGCHLD signal by looking for known child processes of Emacs whose
> status have changed. For each one found, record its new status.
>
> ** WARNING: **this can be called during garbage collection**.  
>  Therefore, it must not be fooled by the presence of mark bits in Lisp
> objects.


CC BY-SA 3.0
2015-12-14T07:07:53.967
19960
2015-12-14T07:07:53.967
19891
answer