সিগিটিশন এবং সিগন্যালের মধ্যে পার্থক্য কী?


143

আমাদের এখানে থাকা একটি অ্যাপ্লিকেশনটিতে আমি একটি অতিরিক্ত সংকেত হ্যান্ডলার যুক্ত করতে যাচ্ছিলাম এবং আমি লক্ষ্য করেছি যে লেখক sigaction()অন্যান্য সংকেত হ্যান্ডলারগুলি সেটআপ করার জন্য ব্যবহার করেছিলেন । আমি ব্যবহার করতে যাচ্ছি signal()। কনভেনশন অনুসরণ করতে আমার ব্যবহার করা উচিত sigaction()তবে আমি যদি স্ক্র্যাচ থেকে লিখছিলাম তবে আমার কোনটি বেছে নেওয়া উচিত?

উত্তর:


167

sigaction()আপনি যদি না করেন তবে খুব বাধ্যতামূলক কারণ না পেয়ে ব্যবহার করুন ।

signal()ইন্টারফেস এর পক্ষে প্রাচীনত্ব (এবং অত: পর প্রাপ্যতা) আছে, এবং এটি সি মান সংজ্ঞায়িত করা হয়। তবুও, এর অনেকগুলি অযাচিত বৈশিষ্ট্য রয়েছে যা sigaction()এড়িয়ে চলে - আপনি যদি sigaction()পুরানো signal()আচরণকে বিশ্বস্ততার সাথে অনুকরণ করার জন্য পরিষ্কারভাবে যুক্ত পতাকা ব্যবহার না করেন তবে ।

  1. signal()ফাংশন না (অগত্যা) অন্যান্য সংকেত আসার সময় বর্তমান হ্যান্ডলার নির্বাহ থেকে ব্লক না; sigaction()বর্তমান হ্যান্ডলার ফিরে না আসা পর্যন্ত অন্যান্য সংকেতগুলি অবরুদ্ধ করতে পারে।
  2. signal()ফাংশন (সাধারণত) সংকেত কর্ম ফিরে রিসেট SIG_DFLপ্রায় সব সংকেত জন্য (ডিফল্ট)। এর অর্থ signal()হ্যান্ডলারের অবশ্যই নিজের প্রথম ক্রিয়া হিসাবে নিজেকে পুনরায় ইনস্টল করতে হবে। এটি সিগন্যাল সনাক্ত হওয়ার সময় এবং হ্যান্ডলারটি পুনরায় ইনস্টল করা হয় এমন সময়ের মধ্যে দুর্বলতার একটি উইন্ডোও খোলে যার মধ্যে সিগন্যালের দ্বিতীয় ঘটনা উপস্থিত হলে ডিফল্ট আচরণ (সাধারণত সমাপ্ত হয়, কখনও কখনও কুসংস্কারের সাথে থাকে - ওরফে কোর ডাম্প) ঘটে।
  3. signal()সিস্টেমের মধ্যে সঠিক আচরণের পরিবর্তিত হয় - এবং মানগুলি সেই পরিবর্তনের অনুমতি দেয়।

সাধারণত এটির sigaction()পরিবর্তে ব্যবহারের ভাল কারণ signal()। তবে এর ইন্টারফেসটি sigaction()নিঃসন্দেহে আরও স্পষ্টভাবে idd

দুই আপনি ব্যবহার যেটা যেমন বিকল্প সংকেত ইন্টারফেস দ্বারা প্রলুব্ধ হয়ো না sighold(), sigignore(), sigpause()এবং sigrelse()। এগুলির নামমাত্র বিকল্প sigaction(), তবে এগুলি কেবল সীমাবদ্ধ and নোট করুন যে পসিক্স স্ট্যান্ডার্ড বলছে যে মাল্টি-থ্রেড প্রোগ্রামগুলিতে তাদের আচরণ অপরিজ্ঞাত।

মাল্টি থ্রেডেড প্রোগ্রাম এবং সিগন্যাল একটি সম্পূর্ণ অন্য জটিল গল্প। আফাইক, উভয়ই signal()এবং sigaction()বহু-থ্রেড অ্যাপ্লিকেশনগুলিতে ঠিক আছে।

কর্নস্টালকস পর্যবেক্ষণ করেছেন :

লিনাক্স ম্যান পেজ signal()বলেছেন:

  signal()একটি বহু-থ্রেড প্রক্রিয়াটির প্রভাবগুলি অনির্দিষ্ট।

সুতরাং, আমি মনে করি sigaction()একমাত্র এটিই বহু-থ্রেড প্রক্রিয়াতে নিরাপদে ব্যবহার করা যেতে পারে।

ইহা আকর্ষণীয়. লিনাক্স ম্যানুয়াল পৃষ্ঠাটি POSIX এর চেয়ে বেশি সীমাবদ্ধ case পসিক্স এর জন্য নির্দিষ্ট করে signal():

যদি প্রক্রিয়াটি বহু-থ্রেডযুক্ত হয়, বা যদি প্রক্রিয়াটি একক থ্রেডযুক্ত হয় এবং সিগন্যাল হ্যান্ডলারটি ফলাফল হিসাবে বাদে অন্য কার্যকর হয়:

  • প্রক্রিয়া কলিং abort(), raise(), kill(), pthread_kill(), অথবা sigqueue()একটি সংকেত অবরোধ করা হয় না জেনারেট করতে
  • একটি মুলতুবি সিগন্যাল অবরোধ মুক্ত থাকা এবং কলটি আনব্লকড হওয়ার আগেই সরবরাহ করা হবে যা এটি ফিরে আসে

আচরণ সংজ্ঞায়িত যদি সিগন্যাল হ্যান্ডলার errnoস্থিতিশীল স্টোরেজ সময়কাল ব্যতীত অন্য কোনও বস্তুর সাথে সম্পর্কিত হিসাবে ঘোষিত কোনও বস্তুর মান নির্ধারণ করে volatile sig_atomic_t, অথবা যদি সিগন্যাল হ্যান্ডলারটি তালিকাভুক্ত ফাংশনগুলির বাইরে অন্য কোনও এই মানটিতে সংজ্ঞায়িত কোনও ফাংশনকে কল করে সিগন্যাল ধারণা

সুতরাং পসিক্স signal()বহু-থ্রেড অ্যাপ্লিকেশনটিতে স্পষ্টভাবে আচরণটি নির্দিষ্ট করে ।

তবুও, sigaction()সমস্ত পরিস্থিতিতে অগ্রাধিকার দেওয়া উচিত - এবং বহনযোগ্য মাল্টি-থ্রেডেড কোড ব্যবহার করা উচিত sigaction()যদি না এটির অতিরঞ্জিত কারণ না থাকে (যেমন "কেবলমাত্র স্ট্যান্ডার্ড সি দ্বারা নির্ধারিত ফাংশনগুলি ব্যবহার করুন" - এবং হ্যাঁ, সি 11 কোডটি একাধিক হতে পারে -threaded)। যা মূলত এই উত্তরটির খোলার অনুচ্ছেদটিও বলে।


12
এই বিবরণটি signalআসলে ইউনিক্স সিস্টেম ভি আচরণের। পসিএক্স এই আচরণ বা আরও বিচক্ষণ বিএসডি আচরণের অনুমতি দেয় তবে আপনি কোনটি পাবেন তা আপনি নিশ্চিত হতে পারেন না, তবে এটি ব্যবহার করা আরও ভাল sigaction
আর .. গীটহাব বন্ধ করুন ICE

1
পুরানো সিগন্যাল () আচরণটি বিশ্বস্ততার সাথে অনুকরণ করার জন্য আপনি যদি ফ্ল্যাগগুলি স্পষ্টভাবে সিগজেশন () এ যুক্ত করেন তবে এটি ব্যবহার করবেন না। সেগুলি কী পতাকা হবে (নির্দিষ্টভাবে)?
ক্রিশ্চান

@AlexFritz: প্রাথমিকভাবে SA_RESETHAND, এছাড়াও SA_NODEFER
জোনাথন লেফলার

2
@BulatM। আপনি ব্যবহার না পারেন, তাহলে sigaction(), তাহলে আপনি মূলত জন্য আদর্শ সি স্পেসিফিকেশন ব্যবহার করতে বাধ্য করছেন signal()। তবে এটি আপনাকে যা করতে পারে তার জন্য একটি অত্যন্ত দরিদ্র বিকল্পগুলির সেট দেয়। আপনি পারেন: পরিবর্তনের (ফাইল স্কোপ) ধরণের ভেরিয়েবল volatile sig_atomic_t; 'দ্রুত প্রস্থান' ফাংশনগুলির একটিতে কল করুন ( _Exit(), quick_exit()) বা abort(); signal()সিগন্যাল আর্গুমেন্ট হিসাবে বর্তমান সংকেত নম্বর দিয়ে কল করুন ; ফিরে যান। এবং এটাই. অন্য যে কোনও কিছুই পোর্টেবল হওয়ার নিশ্চয়তা নেই। এটি এতই কঠোর যে বেশিরভাগ লোকেরা এই নিয়মগুলি উপেক্ষা করে - তবে ফলাফল কোডটি বেআইনী।
জোনাথন লেফলার

1
চমৎকার sigaction()জিসিসি নিজেদের থেকে ডেমো: gnu.org/software/libc/manual/html_node/... ; এবং signal()নিজেরাই জিসিসির কাছ থেকে দুর্দান্ত ডেমো: gnu.org/software/libc/manual/html_node/… । লক্ষ্য করুন যে signalডেমোতে তারা হ্যান্ডলারটিকে এড়িয়ে যাওয়া ( SIG_IGN) এড়িয়ে চলা এড়াতে যদি এটি ইচ্ছাকৃতভাবে সেট করা থাকে।
গ্যাব্রিয়েল স্টেপলস

8

আমার কাছে, নীচের লাইনটি সিদ্ধান্ত নেওয়ার জন্য যথেষ্ট ছিল:

সিগিয়েশন () ফাংশন সংকেতগুলি নিয়ন্ত্রণের জন্য আরও বেশি বিস্তৃত এবং নির্ভরযোগ্য প্রক্রিয়া সরবরাহ করে; নতুন অ্যাপ্লিকেশনগুলির সিগন্যাল () পরিবর্তে সিগিয়েশন () ব্যবহার করা উচিত

http://pubs.opengroup.org/onlinepubs/009695399/functions/signal.html#tag_03_690_07

আপনি স্ক্র্যাচ থেকে শুরু করছেন বা কোনও পুরানো প্রোগ্রামটি সংশোধন করছেন না কেন, হস্তক্ষেপ সঠিক বিকল্প হওয়া উচিত।


5

ওএস এর সিগন্যাল সুবিধার জন্য তারা বিভিন্ন ইন্টারফেস। যদি সম্ভব হয় তবে সিগন্যালে সিগিচেশন ব্যবহার করা পছন্দ করা উচিত কারণ সিগন্যালটি প্রয়োগকরণ-সংজ্ঞায়িত (প্রায়শই রেস প্রবণ) আচরণ করে এবং উইন্ডোজ, ওএস এক্স, লিনাক্স এবং অন্যান্য ইউনিক্স সিস্টেমে ভিন্নভাবে আচরণ করে।

বিশদের জন্য এই সুরক্ষা নোটটি দেখুন ।


1
আমি কেবল গ্লিবিসি উত্স কোড এবং সিগন্যালের দিকে তাকিয়েছি () কেবল সিগেশনে কল করে ()। উপরে MacOS ম্যান পৃষ্ঠাটিও একই দাবি করে তা দেখুন।
bmdhacks

জেনে ভালো লাগলো. আমি কেবল কখনও সিগন্যাল হ্যান্ডলারগুলি প্রস্থান করার আগে খুব সুন্দরভাবে জিনিসগুলি বন্ধ করতে ব্যবহার করতে দেখেছি তাই হ্যান্ডলারটি পুনরায় ইনস্টল করার সাথে আমি সাধারণত আচরণের উপর নির্ভর করি না।
ম্যাথু স্মিথ

5

সিগন্যাল () মান সি, সিগেশন () নয়।

আপনি যদি কোনওটি ব্যবহার করতে সক্ষম হন (এটি হ'ল আপনি পসিক্স সিস্টেমে রয়েছেন), তবে সিগেশন () ব্যবহার করুন; সিগন্যাল () হ্যান্ডলারটি পুনরায় সেট করে কিনা তা অনির্ধারিত, এর অর্থ বহনযোগ্য হতে আপনাকে হ্যান্ডলারের অভ্যন্তরে আবার সংকেত () কল করতে হবে। সবচেয়ে খারাপ এটি হ'ল একটি প্রতিযোগিতা রয়েছে: আপনি যদি দ্রুত পর পর দুটি সিগন্যাল পান এবং হ্যান্ডলারটি পুনরায় ইনস্টল করার আগে দ্বিতীয়টি সরবরাহ করা হয়, তবে আপনার ডিফল্ট ক্রিয়া থাকবে যা সম্ভবত আপনার প্রক্রিয়াটিকে হত্যা করবে। অন্যদিকে , sigication () , "নির্ভরযোগ্য" সংকেত শব্দার্থ ব্যবহারের গ্যারান্টিযুক্ত। আপনাকে হ্যান্ডলারটি পুনরায় ইনস্টল করার দরকার নেই, কারণ এটি কখনও পুনরায় সেট করা হবে না। SA_RESTART এর সাহায্যে আপনি স্বয়ংক্রিয়ভাবে পুনঃসূচনা করার জন্য কিছু সিস্টেম কল পেতে পারেন (যাতে আপনাকে ম্যানুয়ালি EINTR পরীক্ষা করতে হবে না)। sigaction () আরও বিকল্প রয়েছে এবং নির্ভরযোগ্য, তাই এর ব্যবহারকে উত্সাহ দেওয়া হয়।

পিএসএস ... কাউকে বলবেন না আমি আপনাকে এটি বলেছি, তবে পসিক্সের বর্তমানে একটি ফাংশন রয়েছে bsd_signal () যা সিগন্যালের মতো কাজ করে) তবে বিএসডি শব্দার্থকে দেয়, যার অর্থ এটি নির্ভরযোগ্য। এর মূল ব্যবহারটি পুরানো অ্যাপ্লিকেশনগুলির পোর্টিংয়ের জন্য যা নির্ভরযোগ্য সংকেত ধরে নিয়েছিল, এবং পসিক্স এটি ব্যবহারের পরামর্শ দেয় না।


পসিক্সের কোনও ফাংশন নেই bsd_signal()- কিছু পসিক্স বাস্তবায়নে ফাংশন থাকতে পারে তবে পসিক্স নিজেই এই জাতীয় ফাংশন ধারণ করে না (দেখুন পসিক্স )।
জোনাথন লেফলার

4

সংক্ষেপে:

sigaction()ভাল এবং সংজ্ঞায়িত, তবে এটি একটি লিনাক্স ফাংশন এবং তাই এটি কেবল লিনাক্সে কাজ করে। signal()খারাপ এবং দুর্বল সংজ্ঞায়িত, তবে এটি একটি সি স্ট্যান্ডার্ড ফাংশন এবং তাই এটি কোনও কিছুর উপরেই কাজ করে।

লিনাক্স ম্যান পৃষ্ঠাগুলি এ সম্পর্কে কী বলতে পারে?

man 2 signal(এটি অনলাইনে এখানে দেখুন ) বলেছেন:

সিগন্যালের () ব্যবহারটি ইউনিক্স সংস্করণে পৃথক হয়ে থাকে এবং লিনাক্সের বিভিন্ন সংস্করণেও historতিহাসিকভাবে বৈচিত্র রয়েছে। এর ব্যবহার এড়িয়ে চলুন: sigaction(2)পরিবর্তে ব্যবহার করুন। নীচে বহনযোগ্যতা দেখুন।

বহনযোগ্যতা সিগন্যালের একমাত্র বহনযোগ্য ব্যবহার হ'ল SIG_DFL বা SIG_IGN এ সিগন্যালের স্বভাব নির্ধারণ করা। সংকেত হ্যান্ডলার স্থাপন করতে সিগন্যাল () ব্যবহার করার সময় শব্দার্থবিজ্ঞানগুলি সিস্টেম জুড়ে পরিবর্তিত হয় (এবং POSIX.1 স্পষ্টতই এই পরিবর্তনের অনুমতি দেয়); এই উদ্দেশ্যে এটি ব্যবহার করবেন না।

অন্য কথায়: ব্যবহার করবেন না signal()sigaction()পরিবর্তে ব্যবহার করুন!

জিসিসি কী ভাবেন?

সামঞ্জস্যতা দ্রষ্টব্য: উপরে যেমনটি বলা হয়েছে signal, সম্ভব হলে এই ফাংশনটি এড়ানো উচিত। sigactionপছন্দসই পদ্ধতি।

সূত্র: https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html# বেসিক- সিগন্যাল- হ্যান্ডলিং

সুতরাং, যদি লিনাক্স এবং জিসিসি উভয়ই ব্যবহার না করতে বলে signal(), তবে sigaction()পরিবর্তে ব্যবহার করতে বলে , তবে এই প্রশ্নটি উঠছে: হেক আমরা এই বিভ্রান্তিকর sigaction()জিনিসটি কীভাবে ব্যবহার করি !?

ব্যবহারের উদাহরণ:

জিসিসির দুর্দান্ত signal()উদাহরণটি এখানে পড়ুন : https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html# বেসিক- সিগন্যাল- হ্যান্ডলিং

এবং তাদের দুর্দান্ত sigaction()উদাহরণ এখানে: https://www.gnu.org/software/libc/manual/html_node/Sigction-Function- উদাহরণ Html

এই পৃষ্ঠাগুলি পড়ার পরে, আমি নিম্নলিখিত কৌশলগুলি নিয়ে এলাম sigaction():

1. sigaction(), যেহেতু এটি উল্লিখিত হিসাবে একটি সংকেত হ্যান্ডলার সংযুক্ত করার সঠিক উপায়:

#include <errno.h>  // errno
#include <signal.h> // sigaction()
#include <stdio.h>  // printf()
#include <string.h> // strerror()

#define LOG_LOCATION __FILE__, __LINE__, __func__ // Format: const char *, unsigned int, const char *
#define LOG_FORMAT_STR "file: %s, line: %u, func: %s: "

/// @brief      Callback function to handle termination signals, such as Ctrl + C
/// @param[in]  signal  Signal number of the signal being handled by this callback function
/// @return     None
static void termination_handler(const int signal)
{
    switch (signal)
    {
    case SIGINT:
        printf("\nSIGINT (%i) (Ctrl + C) signal caught.\n", signal);
        break;
    case SIGTERM:
        printf("\nSIGTERM (%i) (default `kill` or `killall`) signal caught.\n", signal);
        break;
    case SIGHUP:
        printf("\nSIGHUP (%i) (\"hang-up\") signal caught.\n", signal);
        break;
    default:
        printf("\nUnk signal (%i) caught.\n", signal);
        break;
    }

    // DO PROGRAM CLEANUP HERE, such as freeing memory, closing files, etc.


    exit(signal);
}

/// @brief      Set a new signal handler action for a given signal
/// @details    Only update the signals with our custom handler if they are NOT set to "signal ignore" (`SIG_IGN`),
///             which means they are currently intentionally ignored. GCC recommends this "because non-job-control
///             shells often ignore certain signals when starting children, and it is important for children
///             to respect this." See
///             https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling
///             and https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html.
///             Note that termination signals can be found here:
///             https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html#Termination-Signals
/// @param[in]  signal  Signal to set to this action
/// @param[in]  action  Pointer to sigaction struct, including the callback function inside it, to attach to this signal
/// @return     None
static inline void set_sigaction(int signal, const struct sigaction *action)
{
    struct sigaction old_action;

    // check current signal handler action to see if it's set to SIGNAL IGNORE
    sigaction(signal, NULL, &old_action);
    if (old_action.sa_handler != SIG_IGN)
    {
        // set new signal handler action to what we want
        int ret_code = sigaction(signal, action, NULL);
        if (ret_code == -1)
        {
            printf(LOG_FORMAT_STR "sigaction failed when setting signal to %i;\n"
                   "  errno = %i: %s\n", LOG_LOCATION, signal, errno, strerror(errno));
        }
    }
}

int main(int argc, char *argv[])
{
    //...

    // Register callbacks to handle kill signals; prefer the Linux function `sigaction()` over the C function
    // `signal()`: "It is better to use sigaction if it is available since the results are much more reliable."
    // Source: https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html#Basic-Signal-Handling
    // and /programming/231912/what-is-the-difference-between-sigaction-and-signal/232711#232711.
    // See here for official gcc `sigaction()` demo, which this code is modeled after:
    // https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html

    // Set up the structure to specify the new action, per GCC's demo.
    struct sigaction new_action;
    new_action.sa_handler = termination_handler; // set callback function
    sigemptyset(&new_action.sa_mask);
    new_action.sa_flags = 0;

    // SIGINT: ie: Ctrl + C kill signal
    set_sigaction(SIGINT, &new_action);
    // SIGTERM: termination signal--the default generated by `kill` and `killall`
    set_sigaction(SIGTERM, &new_action);
    // SIGHUP: "hang-up" signal due to lost connection
    set_sigaction(SIGHUP, &new_action);

    //...
}

২. এবং এর জন্য signal(), যদিও উপরে বর্ণিত হিসাবে এটি একটি সিগন্যাল হ্যান্ডলার সংযুক্ত করার ভাল উপায় নয় তবে এটি কীভাবে ব্যবহার করতে হয় তা এখনও জানা ভাল।

এখানে জিসিসি প্রদর্শন কোড কপি-পেস্ট করা হয়েছে, এটি যতটা পেতে চলেছে তেমনই দুর্দান্ত:

#include <signal.h>

void
termination_handler (int signum)
{
  struct temp_file *p;

  for (p = temp_file_list; p; p = p->next)
    unlink (p->name);
}

int
main (void)
{
  
  if (signal (SIGINT, termination_handler) == SIG_IGN)
    signal (SIGINT, SIG_IGN);
  if (signal (SIGHUP, termination_handler) == SIG_IGN)
    signal (SIGHUP, SIG_IGN);
  if (signal (SIGTERM, termination_handler) == SIG_IGN)
    signal (SIGTERM, SIG_IGN);
  
}

সচেতন হওয়ার জন্য প্রধান লিঙ্কগুলি:

  1. স্ট্যান্ডার্ড সিগন্যাল: https://www.gnu.org/software/libc/manual/html_node/Sandard-Signals.html# স্ট্যান্ডার্ড- সংকেত
    1. সমাপ্তি সংকেত: https://www.gnu.org/software/libc/manual/html_node/Termission-Signals.html# সমাধি- সংকেত
  2. বেসিক সিগন্যাল হ্যান্ডলিং, অফিসিয়াল জিসিসি signal()ব্যবহারের উদাহরণ সহ : https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html# বেসিক- সিগন্যাল- হ্যান্ডলিং
  3. অফিসিয়াল জিসিসির sigaction()ব্যবহারের উদাহরণ: https://www.gnu.org/software/libc/manual/html_node/Sigction-Function- উদাহরণ। HTML
  4. সিগন্যাল সেটগুলি সহ sigemptyset()এবং sigfillset(); আমি এখনও এগুলি ঠিক বুঝতে পারি না, তবে জানি যে সেগুলি গুরুত্বপূর্ণ: https://www.gnu.org/software/libc/manual/html_node/Signal-Sets.html

আরো দেখুন:

  1. টিউটোরিয়ালপয়েন্ট সি ++ সিগন্যাল হ্যান্ডলিং [দুর্দান্ত ডেমো কোড সহ]: https://www.tutorialspPoint.com/cplusplus/cpp_signal_handling.htm
  2. https://www.tutorialspoint.com/c_standard_library/signal_h.htm

2

থেকে signal(3)মানুষ পৃষ্ঠা:

বর্ণনা

 This signal() facility is a simplified interface to the more
 general sigaction(2) facility.

দু'জনেই একই অন্তর্নিহিত সুবিধার্থে আবেদন করে। আপনার অনুমান করা উচিত যে প্রতিক্রিয়া উভয়ের সাথে একক সিগন্যালকে হস্তান্তর করা উচিত নয়, তবে তাদের মিশ্রণের ফলে কোনও কিছুই ভেঙে ফেলা উচিত নয় ...


এটা আমার ম্যান পেজে নেই! আমি যা পাই তা হ'ল "বিবরণ সিগন্যাল () সিস্টেম কলটি নম্বর সাইনাম সহ সিগন্যালের জন্য একটি নতুন সিগন্যাল হ্যান্ডলার ইনস্টল করে" "আমাকে দরকারী ম্যান পেজ প্যাকেজে আপগ্রেড করতে হবে ।
ম্যাথু স্মিথ

1
এটি ম্যাক ওএস এক্স 10.5 পৃষ্ঠাগুলির বাইরে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

Glibc এর উত্স কোড থেকেও যাচাই করা হয়েছে। সিগন্যাল () কেবলমাত্র সিগিজেশন ()
বিএমড্যাকস

2
এটি সিগন্যালের সমস্ত বাস্তবায়নের ক্ষেত্রে সত্য নয়। আপনি যদি "সিগিয়েশন" আচরণটি আদেশ করতে চান তবে এই অনুমানের উপর নির্ভর করবেন না।
বেন বার্নস

1

আমি সিগিয়েশন () ওভার সিগন্যাল () ব্যবহার করার পরামর্শ দেব এবং আরও একটি পয়েন্ট যুক্ত করতে চাই। সিগিটি () আপনাকে আরও বিকল্প দেয় যেমন প্রক্রিয়াটির পিড মারা গেছে (সিগিনফো_আউট স্ট্রাক্ট ব্যবহার করে সম্ভব)।


0

আমি সিগন্যালটি ব্যবহার করব) যেহেতু এটি তাত্ক্ষণিকভাবে আরও বহনযোগ্য। আমি এমন কোনও মন্তব্যকারীকে ভোট দিয়ে দেব যিনি একটি আধুনিক সিস্টেম নিয়ে আসতে পারেন যার কাছে পসিক্স সামঞ্জস্যতা স্তর নেই এবং সংকেত সমর্থন করে () supports

জিলিবিসি ডকুমেন্টেশন থেকে উদ্ধৃতি :

একক প্রোগ্রামের মধ্যে উভয়ই সিগন্যাল এবং সিগিকেশন ফাংশন ব্যবহার করা সম্ভব তবে আপনাকে সতর্কতা অবলম্বন করতে হবে কারণ তারা কিছুটা অদ্ভুত উপায়ে ইন্টারঅ্যাক্ট করতে পারে।

সিগিয়েশন ফাংশন সিগন্যাল ফাংশনের চেয়ে বেশি তথ্য সুনির্দিষ্ট করে, তাই সংকেত থেকে প্রাপ্ত ফেরতের মান অগ্রগতি সম্ভাবনার পুরো পরিসীমা প্রকাশ করতে পারে না। অতএব, আপনি যদি সংরক্ষণের জন্য সিগন্যাল ব্যবহার করেন এবং পরে কোনও ক্রিয়াকলাপ পুনরায় স্থাপন করেন, তবে এটি এমন একটি হ্যান্ডলার যথাযথভাবে পুনঃপ্রকাশ করতে সক্ষম হবে না যা সিগনিটি দিয়ে প্রতিষ্ঠিত হয়েছিল।

ফলস্বরূপ সমস্যা এড়াতে সর্বদা হ্যান্ডলারের সংরক্ষণ এবং পুনরুদ্ধার করতে কঠোরতা ব্যবহার করুন যদি আপনার প্রোগ্রামটি যদি সর্বনিম্ন ব্যবহার করে। যেহেতু অচলতা বেশি সাধারণ, এটি মূলত সিগন্যাল বা সঙ্কোচনের সাথে প্রতিষ্ঠিত কিনা তা নির্বিশেষে এটি যে কোনও ক্রিয়াকলাপটি যথাযথভাবে সংরক্ষণ এবং পুনরায় স্থাপন করতে পারে।

কিছু সিস্টেমে যদি আপনি সিগন্যাল দিয়ে কোনও ক্রিয়া স্থাপন করেন এবং তারপরে এটি নিবিড়তার সাথে পরীক্ষা করেন তবে যে হ্যান্ডলারের ঠিকানাটি আপনি পেয়েছেন সেটি সিগন্যালের সাথে নির্দিষ্ট করে দেওয়া নাও হতে পারে। এটি সিগন্যাল সহ অ্যাকশন আর্গুমেন্ট হিসাবে ব্যবহারের জন্য উপযুক্ত নাও হতে পারে। তবে আপনি এটিকে সিগেশনের যুক্তি হিসাবে ব্যবহার করার উপর নির্ভর করতে পারেন। এই সমস্যা জিএনইউ সিস্টেমে কখনই ঘটে না।

সুতরাং, আপনি একক প্রোগ্রামের মধ্যে নিয়মিতভাবে এক বা অন্য প্রক্রিয়াটি ব্যবহার করা ভাল।

বহনযোগ্যতা দ্রষ্টব্য: মৌলিক সংকেত ফাংশনটি আইএসও সি-র একটি বৈশিষ্ট্য, যখন অচলতা POSIX.1 মানের অংশ। আপনি যদি নন-পসিক্স সিস্টেমের বহনযোগ্যতা সম্পর্কে উদ্বিগ্ন হন তবে তার পরিবর্তে আপনার সিগন্যাল ফাংশনটি ব্যবহার করা উচিত।

কপিরাইট (সি) 1996-2008 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক।

জিএনইউ ফ্রি ডকুমেন্টেশন লাইসেন্স, সংস্করণ ১.২ বা ফ্রি সফটওয়্যার ফাউন্ডেশন কর্তৃক প্রকাশিত পরবর্তী সংস্করণ অনুসারে এই নথিটি অনুলিপি, বিতরণ এবং / বা সংশোধন করার অনুমতি দেওয়া হয়েছে; কোনও আক্রমণকারী বিভাগ নেই, কোনও ফ্রন্ট-কভার টেক্সট নেই এবং কোনও ব্যাক-কভার পাঠ্য নেই। লাইসেন্সের একটি অনুলিপি "জিএনইউ ফ্রি ডকুমেন্টেশন লাইসেন্স" শিরোনামে বিভাগে অন্তর্ভুক্ত রয়েছে।


0

ম্যান পেজ সিগন্যাল থেকে (7)

প্রক্রিয়া-নির্দেশিত সংকেত যে কোনও থ্রেডে সরবরাহ করা যেতে পারে যা বর্তমানে সিগন্যালটি অবরুদ্ধ করে নেই। যদি থ্রেডগুলির একটিরও বেশি সংকেতটি অবরোধবিদ্ধ থাকে, তবে কার্নেল সিগন্যালটি সরবরাহ করার জন্য একটি নির্বিচার থ্রেড চয়ন করে।

এবং আমি বলব যে এই "সমস্যা "টি সিগন্যাল (2) এবং সিগিটিশন (2) এর জন্য বিদ্যমান । সুতরাং সংকেত এবং pthreads সাবধান।

... এবং সিগন্যাল (2) গিলিকের সাথে লিনাক্সের নীচে সিগজেশন (2) বলে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.