SORU
26 Temmuz 2012, PERŞEMBE


Sinyal Linux ile birden çok iş parçacığı işleme

Linux bir program muhtemelen birden çok iş parçacığı olan () bir sinyal, SIGTERM veya SİGHUP gibi alırsa ne olur?

Hangi iş parçacığı sinyal karşılar? Birden çok iş parçacığı aynı sinyal alan var mı? Özel bir konu tamamen sinyal işleme adanmış var mı? Sinyal işlemek için iş parçacığı içinde neler oluyor? Nasıl sinyal sonra yürütme devam rutin tamamlandıktan işleyicisi mu?

CEVAP
27 Temmuz 2012, Cuma


pthreads(7) POSIX olduğunu açıklar.1 işlem payı tüm konuları dahil nitelikler gerektirir:

  • sinyal planlar

POSIX.1 de bazı nitelikler gerektirirfarklıher iş parçacığı için, dahil olmak üzere:

  • maske (pthread_sigmask(3)) sinyal

  • alternatif yığın (sigaltstack(2)) sinyal

Linux çekirdeği complete_signal() rutin -- açıklamaları oldukça kullanışlıdır aşağıdaki kod bloğu vardır:

    /*
     * Now find a thread we can wake up to take the signal off the queue.
     *
     * If the main thread wants the signal, it gets first crack.
     * Probably the least surprising to the average bear.
     */
    if (wants_signal(sig, p))
            t = p;
    else if (!group || thread_group_empty(p))
            /*
             * There is just one thread and it does not need to be woken.
             * It will dequeue unblocked signals before it runs again.
             */
            return;
    else {
            /*
             * Otherwise try to find a suitable thread.
             */
            t = signal->curr_target;
            while (!wants_signal(sig, t)) {
                    t = next_thread(t);
                    if (t == signal->curr_target)
                            /*
                             * No thread needs to be woken.
                             * Any eligible threads will see
                             * the signal in the queue soon.
                             */
                            return;
            }
            signal->curr_target = t;
    }

    /*
     * Found a killable thread.  If the signal will be fatal,
     * then start taking the whole group down immediately.
     */
    if (sig_fatal(p, sig) &&
        !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) &&
        !sigismember(&t->real_blocked, sig) &&
        (sig == SIGKILL || !t->ptrace)) {
            /*
             * This signal will be fatal to the whole group.
             */

Yani, bakınsanasinyal teslim sorumlu

Eğer süreci SIG_IGN SIG_DFL, sonra bir sinyal eğilim varsa sinyal (veya varsayılan öldürmek, çekirdek, ya da görmezden) tüm iş parçacıkları için göz ardı edilir.

İşlemin belirli bir işleyici rutin bir sinyal eğilim varsa, o zaman belirli bir iş parçacığı sinyal maskeleri pthread_sigmask(3) kullanarak işleyerek sinyalleri alacak kontrol edebilirsiniz. Sen-ebilmek aday bir iş parçacığı yönetmek hepsini, ya da oluşturmak için bir iş parçacığı sinyal veya herhangi bir karışım bu seçenekler için belirli sinyalleri, ya da sana güveniyor Linux çekirdeği geçerli varsayılan davranış teslim sinyali, ana iş parçacığı.

Bazı işaretler, ancak, özel

   A signal may be generated (and thus pending) for a process as
   a whole (e.g., when sent using kill(2)) or for a specific
   thread (e.g., certain signals, such as SIGSEGV and SIGFPE,
   generated as a consequence of executing a specific machine-
   language instruction are thread directed, as are signals
   targeted at a specific thread using pthread_kill(3)).  A
   process-directed signal may be delivered to any one of the
   threads that does not currently have the signal blocked.  If
   more than one of the threads has the signal unblocked, then
   the kernel chooses an arbitrary thread to which to deliver
   the signal.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006