সি থেকে মিলিসেকেন্ডে বিকল্প বিকল্প আছে কি?


133

আমার কাছে কিছু সোর্স কোড রয়েছে যা উইন্ডোজে সংকলিত হয়েছিল। আমি এটিকে রেড হ্যাট লিনাক্সে চালানোর জন্য রূপান্তর করছি।

উত্স <windows.h>কোডটিতে শিরোলেখ ফাইলটি অন্তর্ভুক্ত করা হয়েছে এবং প্রোগ্রামারটি Sleep()মিলিসেকেন্ডের জন্য অপেক্ষা করতে ফাংশনটি ব্যবহার করেছে । এটি লিনাক্সে কাজ করবে না।

যাইহোক, আমি sleep(seconds)ফাংশনটি ব্যবহার করতে পারি তবে এটি সেকেন্ডে পূর্ণসংখ্যার ব্যবহার করে। আমি মিলিসেকেন্ডগুলিকে সেকেন্ডে রূপান্তর করতে চাই না। লিনাক্সে জিসিসি সংকলন সহ আমি কী বিকল্প স্লিপ ফাংশন ব্যবহার করতে পারি?


sleep(/*seconds*/)মধ্যে <unistd.h>কাজ, কিন্তু যদি আমি সঙ্গে ব্যবহার printf("some things")ছাড়া \n, তার না কাজ করে।
ইসমাeল

এই ক্ষেত্রে ব্যবহারের জন্য, আমরা আউটপুট অনিদ্রা আবশ্যক fflush(stdout);প্রতিটি পরprintf()
EsmaeelE

উত্তর:


179

হ্যাঁ - পুরানো POSIX মানগুলি সংজ্ঞায়িত করা হয়েছে usleep(), সুতরাং এটি লিনাক্সে উপলব্ধ:

   int usleep(useconds_t usec);

বর্ণনা

ইউএসপ () ফাংশনটি (কমপক্ষে) ইউজেক মাইক্রোসেকেন্ডের জন্য কলিং থ্রেডের সম্পাদন স্থগিত করে। ঘুম কোনও সিস্টেমের ক্রিয়াকলাপের মাধ্যমে বা কল প্রক্রিয়াকরণে ব্যয় করা সময় বা সিস্টেম টাইমারগুলির গ্রানুলারিটির দ্বারা কিছুটা দীর্ঘ হতে পারে।

usleep()মাইক্রোসেকেন্ড নেয় , সুতরাং আপনাকে মিলি সেকেন্ডে ঘুমাতে 1000 কে ইনপুটটি গুণতে হবে।


usleep()এর পর থেকে পসিক্স থেকে অবহেলিত এবং পরে অপসারণ করা হয়েছে; নতুন কোডের জন্য, nanosleep()অগ্রাধিকার দেওয়া হয়:

   #include <time.h>

   int nanosleep(const struct timespec *req, struct timespec *rem);

বর্ণনা

nanosleep() অন্তত নির্দিষ্ট সময় পর্যন্ত নির্দিষ্ট না হওয়া পর্যন্ত কলিং থ্রেডের সম্পাদন স্থগিত করে *req অতিবাহিত না হওয়া বা কলিং থ্রেডে কোনও হ্যান্ডলারের ডাকে বা প্রক্রিয়াটি সমাপ্ত হওয়া সংকেত সরবরাহের ।

কাঠামোর টাইমস্পেক ন্যানোসেকেন্ড যথার্থতার সাথে সময়ের ব্যবধানগুলি নির্দিষ্ট করতে ব্যবহৃত হয়। এটা অনুসরণ হিসাবে সংজ্ঞায়িত করা হয়:

       struct timespec {
           time_t tv_sec;        /* seconds */
           long   tv_nsec;       /* nanoseconds */
       };

একটি সিগন্যাল দ্বারা বাধাগ্রস্ত হলে ঘুম চালিয়ে যাওয়া, msleep()ব্যবহার করে একটি উদাহরণ ফাংশন প্রয়োগ করা nanosleep()হয়:

#include <time.h>
#include <errno.h>    

/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
    struct timespec ts;
    int res;

    if (msec < 0)
    {
        errno = EINVAL;
        return -1;
    }

    ts.tv_sec = msec / 1000;
    ts.tv_nsec = (msec % 1000) * 1000000;

    do {
        res = nanosleep(&ts, &ts);
    } while (res && errno == EINTR);

    return res;
}

19
কেন তারা জটিল ক্রিয়াকলাপের জন্য সাধারণ ক্রিয়াকলাপকে হ্রাস করে চলে। ন্যানোসেকেন্ডে আপনার মস্তিষ্ককে আবদ্ধ করার পরিবর্তে (আপাতত) আমাদের ঘুম ব্যবহার করতে পারে।

52

আপনি এই ক্রস-প্ল্যাটফর্মের ফাংশনটি ব্যবহার করতে পারেন:

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds) // cross-platform sleep function
{
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    usleep(milliseconds * 1000);
#endif
}

3
যখন বা _POSIX_C_SOURCE >= 199309Lআমাদের ক্ষেত্রে নেই , আমি পরিবর্তে ব্যবহার করার পরামর্শ দেব । ক্রেডিট এখানে যায় । -ansi-std=c89struct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);usleep(milliseconds * 1000);
জোশ সানফোর্ড

দুর্দান্ত উত্তর! দ্রষ্টব্য, এখানে nanosleep()ডকুমেন্টেশনটি রয়েছে: man7.org/linux/man-pages/man2/nanosleep.2.html । এখানে ব্যবহৃত প্রতিটি প্ল্যাটফর্ম-নির্দিষ্ট ফাংশনের জন্য ডকুমেন্টেশন লিঙ্কগুলি পোস্ট করা কার্যকর হবে।
গ্যাব্রিয়েল স্টেপলস

এছাড়াও মনে রাখবেন যে, যখন সঙ্গে সংকলন gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_testলিনাক্স উবুন্টু উপর, জিসিসি সংস্করণ 4.8.4 সঙ্গে, আমি নিম্নলিখিত সতর্কবার্তা পাবেন: warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]। সমাধানটি হ'ল নিম্নলিখিত 2 টি আপনার কোডের একেবারে শীর্ষে সংজ্ঞায়িত করা হয়: 1) #define __USE_POSIX199309এবং 2) #define _POSIX_C_SOURCE 199309Lউভয়ই কোনও সতর্কতা ছাড়াই সংকলন করার জন্য কোডটি অর্জন করতে হবে (এবং nanoseconds()এটি উপলব্ধ রয়েছে যে ফাংশনটিও ব্যবহার করতে পারে)।
গ্যাব্রিয়েল স্টেপলস

সম্পর্কিত উত্তর আমি স্রেফ তৈরি করেছি: stackoverflow.com/a/55860234/4561887
গ্যাব্রিয়েল স্ট্যাপলস

32

বিকল্প হিসাবে usleep(), যা পোসেক্স ২০০৮-এ সংজ্ঞায়িত করা হয়নি (যদিও এটি পসিক্স ২০০৪ পর্যন্ত সংজ্ঞায়িত হয়েছিল, এবং এটি লিনাক্স এবং অন্যান্য প্ল্যাটফর্মে POSIX কমপ্লায়েন্সের ইতিহাস সহ স্পষ্টত উপলভ্য), পসিক্স ২০০৮ এর মানটি সংজ্ঞায়িত করে nanosleep():

nanosleep - উচ্চ রেজোলিউশন ঘুম

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

nanosleep()ফাংশন করাব বর্তমান থ্রেড মৃত্যুদন্ড থেকে স্থগিত করা না হওয়া পর্যন্ত পারেন সময় বিরতি দ্বারা নির্দিষ্ট rqtpযুক্তি অতিবাহিত হয়েছে বা একটি সংকেত কলিং থ্রেডে দেওযা হবে, এবং তার কর্ম একটি সংকেত আকর্ষণীয় ফাংশন ডাকা অথবা পদ্ধতি বিনষ্ট হয়। স্থগিতের সময়টি অনুরোধের চেয়ে বেশি দীর্ঘ হতে পারে কারণ আর্গুমেন্টের মান ঘুমের রেজোলিউশনের একটি পূর্ণসংখ্য একাধিক পর্যন্ত বা সিস্টেমের দ্বারা অন্যান্য ক্রিয়াকলাপের সময়সূচির কারণে হয়। তবে, একটি সংকেত দ্বারা বাধাগ্রস্থ হওয়ার বিষয়টি বাদে সাসপেনশন সময়টি নির্দিষ্ট করা সময়ের চেয়ে কম হওয়া উচিত নয় rqtp, যেমন সিস্টেম ক্লক CLOCK_REALTIME দ্বারা পরিমাপ করা হয়।

nanosleep()কোনও সিগন্যালের ক্রিয়া বা বাধায় ফাংশনটির ব্যবহারের কোনও প্রভাব নেই।


24

আমাদের ঘুমের বাইরে , NULL ফাইল বর্ণনাকারী সেটগুলির সাথে নম্র নির্বাচন আপনাকে মাইক্রোসেকেন্ড নির্ভুলতার সাথে বিরতি দিতে দেয় এবং ঝুঁকি ছাড়াইSIGALRM জটিলতার ।

sigtimedwait এবং sigwaitinfo অনুরূপ আচরণ দেয়।


1
'সিগালার্মের ঝুঁকি ছাড়াই': কোন ঝুঁকি এবং কোন ক্ষেত্রে? ঘুম আর আমাদের ঘুম?
ম্যাসিমো

2
@Massimo জন্য লিঙ্ক বৈশিষ্ট usleep অনির্দিষ্ট SIGALARM আচরণের উপর বিভিন্ন বাক্য হয়েছে। (মূলত, পুরাতন অ্যালার্ম প্রক্রিয়াটি দিয়েই ঘুমোতে এবং ঘুম প্রয়োগের অনুমতি দেওয়া হয় , যা আপনি কল্পনা করতে পারেন যে ঘুম এবং সিগন্যালমের নিরাপদ ব্যবহারকে জটিল করে তুলবে I আমি কোনও আধুনিক সিস্টেমের এটি জানি না যা এটি করে তবে এটি এখনও রয়েছে স্পেক।)
পাইলক্রো


-7
#include <stdio.h>
#include <stdlib.h>
int main () {

puts("Program Will Sleep For 2 Seconds");

system("sleep 2");      // works for linux systems


return 0;
}

1
এটি মিলিসেকেন্ডগুলির জন্য ঘুমায় না এবং আরও অনেক বেশি ওভারহেডেরও পরিচয় দেয় যা সময়কে আরও অবিশ্বাস্য করে তোলে।
ডিভোলাস

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