Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi: Dapatkan sumber isyarat

Pergi: Dapatkan sumber isyarat

王林
王林ke hadapan
2024-02-12 08:30:09793semak imbas

Pergi: Dapatkan sumber isyarat

Alat praktikal yang disyorkan oleh editor php Baicao ialah Go: Dapatkan sumber isyarat. Alat ini boleh membantu pembangun mendapatkan maklumat yang berkaitan tentang sumber isyarat, termasuk kekuatan isyarat, jenis isyarat, pengendali, dsb. Dengan menggunakan alat ini, pembangun boleh menjalankan ujian dan pengoptimuman isyarat dengan mudah untuk meningkatkan pengalaman pengguna. Pada masa yang sama, alat ini juga menyediakan pelbagai pilihan fungsi, seperti paparan carta isyarat, pemantauan perubahan isyarat, dsb., yang membolehkan pembangun mempunyai pemahaman yang lebih menyeluruh tentang situasi isyarat, untuk menyahpepijat dan mengoptimumkan dengan lebih baik. Sama ada pembangunan aplikasi mudah alih atau pengoptimuman web, Go: Get Source ialah alat yang berguna.

Kandungan soalan

Saya menggunakan go untuk melancarkan beberapa skrip yang menggunakan isyarat "maklum" apabila mereka menghadapi beberapa masalah, saya tahu go boleh menangkap isyarat ini, tetapi saya perlu mengetahui pid isyarat itu. Dalam c, pengendali isyarat menghantar struktur untuk mengetahui pid isyarat, tetapi dalam perjalanan, ini nampaknya tidak berlaku

package main

import (
    "fmt"
    "os"
    "os/signal"
)

func main() {

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt, os.Kill)

    s := <-c
    fmt.Println("Got signal:", s)
    fmt.Printf("%+v\n",s)
}

Contoh di bawah (diekstrak daripada dokumentasi isyarat) menghantar saya isyarat yang memulakan panggilan, tetapi tidak menghantar sebarang maklumat berguna (seperti pid)

Penyelesaian

Tidak, anda tidak boleh melakukan ini dalam yang disokong secara rasmi cara. Masa jalan pergi diperlukan untuk mempunyai pengendali isyarat dan tidak mendedahkan maklumat tambahan dalam apa jua cara.

Anda masih boleh melakukan ini dari c dengan menyediakan pengendali isyarat baharu, tetapi saya akan sangat berhati-hati tentang perkara ini (lihat sesuatu seperti isu/7227). Anda mungkin lebih baik menggunakan kaedah komunikasi lain selain daripada memberi isyarat.

Berikut ialah contoh separa berdasarkan kod ian dalam isu 7227:

package main

/*
#include <stdio.h>
#include <signal.h>
#include <string.h>

struct sigaction old_action;
void handler(int signum, siginfo_t *info, void *context) {
    printf("Sent by %d\n", info->si_pid);
}

void test() {
    struct sigaction action;
    sigaction(SIGUSR1, NULL, &action);
    memset(&action, 0, sizeof action);
    sigfillset(&action.sa_mask);
    action.sa_sigaction = handler;
    action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO | SA_ONSTACK;
    sigaction(SIGUSR1, &action, &old_action);
}
*/
import "C"

import (
    "os"
    "syscall"
    "time"
)

func main() {
    C.test()
    pid := os.Getpid()
    for {
        syscall.Kill(pid, syscall.SIGUSR1)
        time.Sleep(time.Second)
    }
}

Atas ialah kandungan terperinci Pergi: Dapatkan sumber isyarat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam