6

親プログラムがシグナルos.Interruptによって中断されると、によって実行されるexec.Start()プログラムは終了しますが、親プログラムが正常に終了すると、子プログラムは終了しません。その2つの条件の違いは何ですか? 例えば:

package main

import "fmt"
import "os"
import "time"
import "os/exec"

func main(){
    cmd := exec.Command("sleep", "100000")
    cmd.Env = os.Environ()
    fmt.Println(cmd.Env)
    cmd.Start()

    time.Sleep(1e9*20)
    return
} 

後の状態では、メイン プログラムを中断しなければ、親は20 代以降sleep 100000になります。init process

4

2 に答える 2

12

何が起こっているかというと、プロセス SIGINT を送信すると (たとえば os.Interrupt が行うように)、同じプロセス グループ内のすべてのプロセスもそのシグナルを受け取ります (これには子プロセスが含まれます) - SIGINT はデフォルトでプロセスを終了します。

ただし、SIGINT などの理由ではなく、親プロセスが正常に終了した場合、同じプロセス グループ内のプロセスはシグナルを受信しません。プロセスは引き続き実行されますが、init プロセスによって採用されます。これは Go に固有のものではありません。

于 2013-10-08T10:31:09.507 に答える
1

Startこれは、の代わりに を使用しているためだと思いますRun

Start は、指定されたコマンドを開始しますが、完了するまで待機しません。

一方:

Run は、指定されたコマンドを開始し、完了するまで待機します。

したがってStart、Go (親) プロセスが終了すると、プロセスがオペレーティング システムに引き渡されます。

于 2013-10-08T10:12:57.293 に答える