kill.go#Action
    Action: func(context *cli.Context) error {        if err := checkArgs(context, 1, minArgs); err != nil {            return err        }        if err := checkArgs(context, 2, maxArgs); err != nil {            return err        }        container, err := getContainer(context)        if err != nil {            return err        }        sigstr := context.Args().Get(1)        if sigstr == "" {            sigstr = "SIGTERM"        }        signal, err := parseSignal(sigstr)        if err != nil {            return err        }        return container.Signal(signal, context.Bool("all"))    },func parseSignal(rawSignal string) (syscall.Signal, error) {    s, err := strconv.Atoi(rawSignal)    if err == nil {        return syscall.Signal(s), nil    }    signal, ok := signalMap[strings.TrimPrefix(strings.ToUpper(rawSignal), "SIG")]    if !ok {        return -1, fmt.Errorf("unknown signal %q", rawSignal)    }    return signal, nil}
1) libcontainer/container_linux.go#linuxContainer.Signal
func (c *linuxContainer) Signal(s os.Signal, all bool) error {    if all {        return signalAllProcesses(c.cgroupManager, s)    }    status, err := c.currentStatus()    if err != nil {        return err    }    // to avoid a PID reuse attack    if status == Running || status == Created || status == Paused {        if err := c.initProcess.signal(s); err != nil {            return newSystemErrorWithCause(err, "signaling init process")        }        return nil    }    return newGenericError(fmt.Errorf("container not running"), ContainerNotRunning)}
1.1) libcontainer/process_linux.go#initProcess.signal
func (p *initProcess) signal(sig os.Signal) error {    s, ok := sig.(syscall.Signal)    if !ok {        return errors.New("os: unsupported signal type")    }    return unix.Kill(p.pid(), s)}