বাশ: অসীম ঘুম (অসীম অবরুদ্ধ)


158

আমি startxএক্স শুরু করতে ব্যবহার করি যা আমার মূল্যায়ন করবে .xinitrc। আমার মধ্যে .xinitrcআমি আমার উইন্ডো ম্যানেজার ব্যবহার করে শুরু করি /usr/bin/mywm। এখন, আমি যদি আমার ডাব্লুএমকে হত্যা করি (অন্য কিছু ডাব্লুএম এর পরীক্ষা করার জন্য), এক্সটিও বন্ধ হয়ে যাবে কারণ .xinitrcস্ক্রিপ্টটি ইওএফে পৌঁছেছে। সুতরাং আমি আমার শেষে এটি যুক্ত করেছি .xinitrc:

while true; do sleep 10000; done

আমি আমার ডাব্লুএম কে মেরে ফেললে এইভাবে এক্স শেষ হবে না। এখন আমার প্রশ্ন: আমি কীভাবে ঘুমের বদলে অসীম ঘুম করব? কোন কমান্ড আছে যা স্ক্রিপ্ট হিমায়িত করতে চাইবে?

শুভেচ্ছান্তে

উত্তর:


330

sleep infinity বিড়ালদের অপব্যবহার ছাড়াই যা প্রস্তাবিত এবং কাজ করে ঠিক তা করে।


16
কুল। দুর্ভাগ্যক্রমে আমার ব্যস্তবক্স বুঝতে পারে না।
এক-ব্যবহারকারী নয়

12
বিএসডি (বা কমপক্ষে ওএস এক্স) বুঝতে পারে না sleep infinity, যদিও লিনাক্সের জন্য শিখতে এটি দুর্দান্ত জিনিস ছিল। তবে, while true; do sleep 86400; doneপর্যাপ্ত বিকল্প হওয়া উচিত।
ইভান এক্স

16
এটি সম্পর্কে, আমি একটি পৃথক উত্তরে নথিভুক্ত কিছু গবেষণা করেছি। সংক্ষিপ্তসার হিসাবে: infinityসিতে স্ট্রিং থেকে ক এ রূপান্তরিত হয় double। তারপরে এটি doubleঅনুমোদিত সর্বাধিক মানগুলিতে কাটা হয় timespec, যার অর্থ খুব বড় পরিমাণের সেকেন্ড (আর্কিটেকচার-নির্ভর) তবে তাত্ত্বিকভাবে সীমাবদ্ধ।
jp48

72

tail ব্লক করে না

সর্বদা হিসাবে: প্রতিটি কিছুর জন্য একটি উত্তর রয়েছে যা সংক্ষিপ্ত, সহজে বোঝা যায়, অনুসরণ করা সহজ এবং সম্পূর্ণ ভুল। এখানে tail -f /dev/nullএই বিভাগে পড়ে;)

আপনি যদি এটির সাথে এটি strace tail -f /dev/nullলক্ষ্য করেন তবে খেয়াল করবেন যে এই সমাধানটি ব্লক করা থেকে দূরে! এটি সম্ভবত sleepপ্রশ্নের সমাধানের চেয়েও খারাপ , কারণ এটি (লিনাক্সের আওতায়) inotifyসিস্টেমের মতো মূল্যবান সংস্থান ব্যবহার করে । এছাড়াও অন্যান্য প্রক্রিয়া যা লুপ /dev/nullতৈরি করতে লিখেন tail। (আমার উবুন্টু 1664 ১..১০ এ এটি ইতিমধ্যে ব্যস্ত সিস্টেমে প্রতি সেকেন্ডে বেশ কয়েকটি 10 ​​টিस्कেল যুক্ত করেছে))

প্রশ্নটি ছিল একটি ব্লকিং কমান্ডের জন্য

দুর্ভাগ্যক্রমে, এরকম কোনও জিনিস নেই ..

পড়ুন: আমি সরাসরি শেলটি দিয়ে সংরক্ষণাগারভুক্ত করার কোনও উপায় জানি না।

কিছু কিছু (এমনকি sleep infinity) কিছু সংকেত দ্বারা বাধাগ্রস্ত হতে পারে। সুতরাং আপনি যদি সত্যিই নিশ্চিত হতে চান যে এটি ব্যতিক্রমীভাবে ফিরে না আসে, তবে এটি অবশ্যই একটি লুপে চলবে, যেমনটি আপনি ইতিমধ্যে আপনার জন্য করেছিলেন sleep। দয়া করে মনে রাখবেন, এটি (লিনাক্সে) /bin/sleepস্পষ্টতই 24 দিনের মধ্যে ক্যাপড থাকে (একবার দেখুন strace sleep infinity), সুতরাং আপনি সম্ভবত সেরাটি করতে পারেন:

while :; do sleep 2073600; done

(নোট করুন যে আমি বিশ্বাস করি যে sleep24 দিনের চেয়ে উচ্চতর মানের জন্য অভ্যন্তরীণভাবে লুপগুলি রয়েছে, তবে এর অর্থ: এটি অবরুদ্ধ নয়, এটি খুব ধীরে ধীরে লুপিং So

.. তবে আপনি নামবিহীন বেশ কাছাকাছি আসতে পারেন fifo

প্রক্রিয়াটিতে কোনও সংকেত প্রেরণ না করা পর্যন্ত আপনি এমন কিছু তৈরি করতে পারেন যা সত্যই অবরুদ্ধ। নিম্নলিখিত ব্যবহার bash 4, 2 পিআইডি এবং 1 fifo:

bash -c 'coproc { exec >&-; read; }; eval exec "${COPROC[0]}<&-"; wait'

আপনি straceযদি এটি পছন্দ করেন তবে সত্যই এটির সাথে বাধা রয়েছে তা আপনি পরীক্ষা করতে পারেন:

strace -ff bash -c '..see above..'

এটি কীভাবে নির্মিত হয়েছিল

readকোনও ইনপুট ডেটা না থাকলে ব্লক করে (কিছু অন্যান্য উত্তর দেখুন)। তবে, tty(ওরফে stdin) সাধারণত কোনও ভাল উত্স নয়, কারণ ব্যবহারকারী লগ আউট করার সময় এটি বন্ধ হয়ে যায়। এছাড়াও এটি থেকে কিছু ইনপুট চুরি করতে পারে tty। সুন্দর না.

readঅবরুদ্ধ করতে , আমাদের এমন কিছু অপেক্ষা করতে fifoহবে যা কখনই কিছুই ফেরত না। ইন bash 4কমান্ড যা ঠিক যেমন একটি সঙ্গে আমাদের প্রদান করতে পারেন আছে fifo: coproc। আমরা যদি অবরুদ্ধকরণ read(যা আমাদের coproc) অপেক্ষা করি তবে আমাদের কাজ শেষ হয়ে যায়। দু: খজনকভাবে এটি দুটি পিআইডি ও খোলার দরকার fifo

নামের সাথে বৈকল্পিক fifo

আপনি যদি নাম ব্যবহার করে বিরক্ত না করেন তবে আপনি নীচের মতো এটি fifoকরতে পারেন:

mkfifo "$HOME/.pause.fifo" 2>/dev/null; read <"$HOME/.pause.fifo"

রিডে একটি লুপ ব্যবহার না করা কিছুটা opালু, তবে আপনি নিজের পছন্দ মতো এটি পুনরায় ব্যবহার fifoকরতে পারেন এবং readব্যবহার করে এস টার্মিনেটটি তৈরি করতে touch "$HOME/.pause.fifo"পারেন (যদি একক পড়ার অপেক্ষা বেশি থাকে, সমস্ত একবারে বন্ধ হয়ে যায়)।

অথবা লিনাক্স pause()সিস্কেল ব্যবহার করুন

অসীম অবরুদ্ধ করার জন্য একটি লিনাক্স কার্নেল কল রয়েছে pause(), যা আমরা যা চাই তা করি: চিরকাল অপেক্ষা করুন (কোনও সংকেত না আসা পর্যন্ত)। তবে এটির (এখনও) জন্য কোনও ইউজারস্পেস প্রোগ্রাম নেই।

সি

যেমন একটি প্রোগ্রাম তৈরি করা সহজ। এখানে বলা একটি খুব ছোট লিনাক্স প্রোগ্রাম তৈরি করতে একটি স্নিপেট হয় pauseযা অনির্দিষ্টকালের জন্য একটু থামেন (চাহিদা diet, gccইত্যাদি):

printf '#include <unistd.h>\nint main(){for(;;)pause();}' > pause.c;
diet -Os cc pause.c -o pause;
strip -s pause;
ls -al pause

python

আপনি যদি নিজের কিছু সংকলন করতে না চান তবে আপনি pythonইনস্টল করেছেন, আপনি এটি লিনাক্সের অধীনে ব্যবহার করতে পারেন:

python -c 'while 1: import ctypes; ctypes.CDLL(None).pause()'

(দ্রষ্টব্য: exec python -c ...বর্তমান শেলটি প্রতিস্থাপনের জন্য এটি একটি পিআইডি মুক্ত করে some কিছু আইও পুনঃনির্দেশের সাহায্যে অব্যবহৃত এফডি মুক্ত করে সমাধানটি উন্নত করা যেতে পারে This এটি আপনার উপর নির্ভর করে))

এটি কীভাবে কাজ করে (আমি মনে করি): ctypes.CDLL(None)স্ট্যান্ডার্ড সি লাইব্রেরি লোড করে pause()এবং এতে কিছু অতিরিক্ত লুপের মধ্যে ফাংশনটি চালায় । সি সংস্করণের চেয়ে কম দক্ষ, তবে কাজ করে।

আপনার জন্য আমার সুপারিশ:

লুপিং ঘুমে থাকুন। এটি বোঝা সহজ, খুব বহনযোগ্য এবং বেশিরভাগ সময় অবরুদ্ধ।


1
@ অ্যান্ড্রু সাধারণত আপনার প্রয়োজন হয় না trap(যা সংকেতগুলির সাথে শেলের আচরণকে পরিবর্তন করে) বা ব্যাকগ্রাউন্ড (যা শেলটি স্ট্রিং + সি এর মতো টার্মিনাল থেকে সংকেতগুলিকে বাধা দেয়)। তাই sleep infinityযথেষ্ট ( exec sleep infinityপার্থক্যের ব্যবহারটি দেখতে এটি শেষ স্টেটমেন্টের মতো আচরণ করে strace -ffDI4 bash -c 'YOURCODEHERE')। লুপিং ঘুম ভাল, কারণ sleepনির্দিষ্ট পরিস্থিতিতে ফিরে আসতে পারে। উদাহরণস্বরূপ, আপনি চান না যে এক্স 11 হঠাৎ বন্ধ হয়ে যায় killall sleep, কেবলমাত্র ঘুম লুপের পরিবর্তে .xstartupশেষ হয় sleep infinity
টিনো

কিছুটা অস্পষ্ট হতে পারে তবে s6-pauseএটি চালানোর জন্য একটি ইউজারল্যান্ড কমান্ড pause(), বিকল্পভাবে বিভিন্ন সংকেত উপেক্ষা করে।
প্যাট্রিক

@ টিনো /bin/sleepআপনার কথায় 24 দিনের মতো আবদ্ধ হয় না। এটি আপডেট করতে পারলে ভাল লাগবে। এখনই লিনাক্সে, এই কোডটি সক্রিয়। এটি nanosleep()24 দিনের জন্য পৃথক সিস্কলগুলি ক্যাপ করে তবে এগুলিকে একটি লুপে কল করে। সুতরাং sleep infinity24 দিনের পরে প্রস্থান করা উচিত নয়। doubleইতিবাচক অনন্ত একটি রূপান্তরিত পরার struct timespec। জিডিবিতে দেখলে rpl_nanosleep, উবুন্টু 16.04 এ infinityরূপান্তরিত হয় { tv_sec = 9223372036854775807, tv_nsec = 999999999 }
এনএইচ 2

@ এনএইচ 2 এটি ইতিমধ্যে পাঠ্যে উল্লেখ করা হয়েছিল যে পুরোপুরি অবরুদ্ধ হওয়ার পরিবর্তে ঘুম সম্ভবত লুপ হয়। আশা করি এই সত্যটিকে কিছুটা আরও পরিষ্কার করার জন্য আমি এখন এটি সামান্য সম্পাদনা করেছি। দয়া করে এটি " সম্ভবত " নোট করুন , কারণ straceএকা থেকেই আমি সত্যটি প্রমাণ করতে পারছি না যে সত্যই কিছু লুপিং কোড সংকলিত হয়েছে sleepএবং আমি এটি পরীক্ষা করার জন্য 24 দিনের অপেক্ষা করতে চাই না (বা পচনশীল /bin/sleep)। কোনও গাণিতিক প্রমাণ না থাকলে ডিফেন্সিয়ালি প্রোগ্রাম করা সর্বদা ভাল, কিছুটা সত্যই যেমন রয়েছে বলে মনে হয় তেমন। কখনও কোনও কিছুর উপর আস্থা রাখবেন না:killall -9 sleep
টিনো

বিরতি () বিকল্পটি পার্ল দিয়ে খুব সহজেই করা যায়: পার্ল-এমপিএসআইএক্স -e 'বিরতি ()'
tgoodhart

70

সম্ভবত এটি কুরুচিপূর্ণ বলে মনে হচ্ছে তবে কেন কেবল দৌড়াবেন না catএবং এটিকে চিরতরে ইনপুটটির জন্য অপেক্ষা করতে দিন?


4
আপনার যদি ঝুলন্ত পাইপ না থেকে পড়তে হয় তবে এটি কাজ করে না। দয়া করে উপদেশ দাও.
ম্যাট যোগদানকারী

2
@ ম্যাট, সম্ভবত একটি পাইপ বানাবেন এবং catএটি? mkfifo pipe && cat pipe
মিশা ট্রাইবাস

@ টালবার্গ যা বলে, তবে ততক্ষণে আপনি অবিলম্বে 3 এ পুনরায় সাইন করতে এবং এখানে লিঙ্কমুক্ত করতে পারেন, এখানে দেখানো হয়েছে: superuser.com/a/633185/762481
jp48

32

টিএল; ডিআর: sleep infinityপ্রকৃতপক্ষে অনুমোদিত সর্বাধিক সময় ঘুমায় যা সীমাবদ্ধ।

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

  1. strtod'অনন্ত' ডাবল স্পষ্টতায় রূপান্তর করতে প্রথম যুক্তিতে সি স্ট্ডলিব ব্যবহার করুন । সুতরাং, ধরে নিলাম আইইইই 754 ডাবল যথার্থতা 64-বিট ধনাত্মক অনন্ত মান secondsভেরিয়েবলে সংরক্ষণ করা হয়েছে ।
  2. ডাকা xnanosleep(seconds)( gnulib পাওয়া ), এই ঘুরে পূজা মধ্যে dtotimespec(seconds)( এছাড়াও gnulib মধ্যে ) থেকে রূপান্তর করতে doubleকরতে struct timespec
  3. struct timespecসংখ্যা মাত্র একটি জোড়া: পূর্ণসংখ্যা অংশ (সেকেন্ডে) এবং ভগ্নাংশ অংশ (ন্যানোসেকেন্ডে)। ইতিমধ্যে ইতিবাচক অনন্তকে পূর্ণসংখ্যায় রূপান্তর করার ফলে অপরিজ্ঞাত আচরণের ফলাফল হবে (সি স্ট্যান্ডার্ড থেকে .36.3.1.4 দেখুন), সুতরাং পরিবর্তে এটি কেটে যায় TYPE_MAXIMUM (time_t)
  4. এর আসল মানটি TYPE_MAXIMUM (time_t)স্ট্যান্ডার্ডে সেট করা হয়নি (এমনকি sizeof(time_t)তা নয়); সুতরাং, উদাহরণস্বরূপ, আসুন একটি সাম্প্রতিক লিনাক্স কার্নেল থেকে x86-64 চয়ন করি।

এটি TIME_T_MAXলিনাক্স কার্নেলের মধ্যে রয়েছে, যা ( time.h) হিসাবে সংজ্ঞায়িত রয়েছে :

(time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)

নোট যে time_tহয় __kernel_time_tএবং time_tহয় long; LP64 ডেটা মডেল ব্যবহৃত হয়, তাই sizeof(long)8 (64 বিট)।

যা ফলাফল: TIME_T_MAX = 9223372036854775807

এটি হল: sleep infinite9223372036854775807 সেকেন্ড (10 ^ 11 বছর) এর আসল ঘুমের ফলাফল results এবং 32-বিট লিনাক্স সিস্টেমের জন্য ( sizeof(long)এটি 4 (32 বিট)): 2147483647 সেকেন্ড (68 বছর; এছাড়াও বছর 2038 সমস্যা দেখুন )।


সম্পাদনা : দৃশ্যত nanosecondsডাকা ফাংশনটি সরাসরি সিস্কল নয়, তবে একটি ওএস-নির্ভর নির্ভর মোড়ক ( gnulib এছাড়াও সংজ্ঞায়িত )।

সেখানে ফলে একটি অতিরিক্ত পদক্ষেপ আছে: কিছু সিস্টেমে যেখানে জন্য HAVE_BUG_BIG_NANOSLEEPহয় trueঘুম 24 দিন ছেঁটে ফেলা হয়েছে এবং তারপর একটি লুপ বলা হয়। এটি কিছু (বা সমস্ত?) লিনাক্স ডিস্ট্রোসের ক্ষেত্রে case নোট করুন যে কোনও কনফিগার- সময় পরীক্ষা ( উত্স ) সফল হলে এই মোড়ক ব্যবহার করা যাবে না ।

বিশেষত, এটি হবে 24 * 24 * 60 * 60 = 2073600 seconds(প্লাস 999999999 ন্যানোসেকেন্ডস); তবে নির্দিষ্ট ঘুমের সময়কে সম্মানের জন্য এটিকে একটি লুপে ডাকা হয়। অতএব পূর্ববর্তী সিদ্ধান্তগুলি বৈধ থাকবে।


উপসংহারে, ফলস্বরূপ ঘুমের সময় অসীম নয় তবে সমস্ত ব্যবহারিক উদ্দেশ্যে পর্যাপ্ত পরিমাণে উচ্চতর হয় , এমনকি যদি প্রকৃত সময় পার হয়ে যায় তবে পোর্টেবল হয় না; এটি ওএস এবং আর্কিটেকচারের উপর নির্ভর করে।

মূল প্রশ্নের উত্তর দেওয়ার জন্য, এটি স্পষ্টতই যথেষ্ট ভাল তবে যদি কোনও কারণে ( খুব রিসোর্স-সীমাবদ্ধ সিস্টেম) আপনি যদি সত্যিই অকেজো অতিরিক্ত কাউন্টডাউন টাইমার এড়াতে চান তবে আমার ধারণা সঠিক catউত্তরটি অন্য উত্তরে বর্ণিত পদ্ধতিটি ব্যবহার করা ।


1
পরবর্তী কোর্টিলগুলিতে sleep infinityএখন লুপিং ছাড়াই চিরতরে ঘুমোবেন
ভ্লাদিমির

8

sleep infinityসবচেয়ে মার্জিত দেখায় তবে কখনও কখনও এটি কোনও কারণে কার্যকর হয় না। যে ক্ষেত্রে, আপনি অন্যান্য ব্লক কমান্ড যেমন চেষ্টা করে দেখতে পারেন cat, read, tail -f /dev/null, grep aইত্যাদি


1
tail -f /dev/nullআমার জন্য সাশ প্ল্যাটফর্মেও ছিল একটি সমাধান সমাধান
স্কচমঙ্ক

2
tail -f /dev/nullস্টিডিন গ্রহণ না করার সুবিধাও রয়েছে। আমি এই কারণে এটি ব্যবহার করেছি।
সুডো বাশ

এই বিকল্পটি বিবেচনা করে তাদের এই বিকল্পটির প্রবিধান সম্পর্কে জানতে এই উত্তরটি পড়তে হবে ।
শেডো

6

নিজেই একটি সাইনস্টপ প্রেরণ সম্পর্কে কী ?

SIGCONT প্রাপ্ত না হওয়া পর্যন্ত প্রক্রিয়াটি বিরতি দেওয়া উচিত। যা আপনার ক্ষেত্রে: কখনই নয়।

kill -STOP "$$";
# grace time for signal delivery
sleep 60;

6
সংকেতগুলি অ্যাসিনক্রোনাস। সুতরাং নিম্নলিখিতটি ঘটতে পারে: ক) শেল কলগুলি হত্যা খ) কিল কার্নেলকে বলে যে শেল সিগন্যাল স্টপ গ্রহণ করবে সি) খুন সমাপ্ত হবে এবং শেলের কাছে ফিরে আসবে) শেলটি অবিরত থাকবে (সম্ভবত বন্ধ হয়ে যায় কারণ স্ক্রিপ্ট শেষ হয়) e) কার্নেল অবশেষে সরবরাহের সময় খুঁজে পায়
কোনও ব্যবহারকারীর

1
@ টেম্পল গ্রেট ইনসাইট, সিগন্যালগুলির অ্যাসিনক্রোনাস প্রকৃতি সম্পর্কে ভাবেন নি। ধন্যবাদ!
মিচুয়েলনিক

4

sleep infinityএটি ডকুমেন্টেড না হলেও কেন কাজ করে তা আমাকে ব্যাখ্যা করুন । jp48 এর উত্তরও দরকারী।

সর্বাধিক গুরুত্বপূর্ণ বিষয়: নির্দিষ্টকরণের মাধ্যমে infবা infinity(উভয় ক্ষেত্রে সংবেদনশীল), আপনি আপনার প্রয়োগের অনুমতি দেয় সবচেয়ে দীর্ঘ সময় ধরে ঘুমাতে পারবেন (অর্থাত্ এর ছোট মান HUGE_VALএবং TYPE_MAXIMUM(time_t))।

এখন বিশদ খনন করা যাক। সোর্স কোড sleepহুকুম থেকে পড়া যায় coreutils / src / sleep.c । মূলত, ফাংশনটি এটি করে:

double s; //seconds
xstrtod (argv[i], &p, &s, cl_strtod); //`p` is not essential (just used for error check).
xnanosleep (s);

বোধশক্তি xstrtod (argv[i], &p, &s, cl_strtod)

xstrtod()

Gnulib / lib / xstrtod.c এর মতে , xstrtod()রূপান্তরকারী স্ট্রিংকে argv[i]একটি ভাসমান বিন্দুতে *sরূপান্তর করে এবং রূপান্তরকারী ফাংশন ব্যবহার করে এটিকে সংরক্ষণ করে cl_strtod()

cl_strtod()

থেকে দেখা যায় হিসাবে coreutils / lib / অনুপস্থিত CL-strtod.c , cl_strtod()একটি ফ্লোটিং পয়েন্ট মান একটি স্ট্রিং পরিবর্তিত ব্যবহার strtod()

strtod()

অনুসারে man 3 strtod, strtod()একটি স্ট্রিংকে টাইপের মানতে রূপান্তরিত করে double। ম্যানপেজটি বলে

(স্ট্রিংয়ের প্রাথমিক অংশ) স্ট্রিংয়ের প্রত্যাশিত রূপটি হ'ল ... বা (iii) একটি অনন্ত, বা ...

এবং একটি অনন্ত হিসাবে সংজ্ঞায়িত করা হয়

একটি অনন্তটি হয় হয় "আইএনএফ" বা "ইনফিনিটি", কেস উপেক্ষা করে।

যদিও দলিলটি বলে দেয়

সঠিক মানটি যদি অতিরিক্ত প্রবাহের কারণ হয়ে থাকে তবে প্লাস বা বিয়োগ HUGE_VAL( HUGE_VALF, HUGE_VALL) ফিরে আসবে

এটি অনন্তর কীভাবে আচরণ করা হয় তা পরিষ্কার নয়। সুতরাং আসুন সোর্স কোডটি gnulib / lib / strtod.c দেখুন । আমরা যা পড়তে চাই তা হ'ল

else if (c_tolower (*s) == 'i'
         && c_tolower (s[1]) == 'n'
         && c_tolower (s[2]) == 'f')
  {
    s += 3;
    if (c_tolower (*s) == 'i'
        && c_tolower (s[1]) == 'n'
        && c_tolower (s[2]) == 'i'
        && c_tolower (s[3]) == 't'
        && c_tolower (s[4]) == 'y')
      s += 5;
    num = HUGE_VAL;
    errno = saved_errno;
  }

সুতরাং, INFএবং INFINITY(উভয় ক্ষেত্রে সংবেদনশীল) হিসাবে বিবেচিত হয় HUGE_VAL

HUGE_VAL পরিবার

সি স্ট্যান্ডার্ড হিসাবে N1570 ব্যবহার করা যাক । HUGE_VAL, HUGE_VALFএবং HUGE_VALLম্যাক্রোগুলি §7.12-3 এ সংজ্ঞায়িত করা হয়

ম্যাক্রোটি
    HUGE_VAL
ইতিবাচক ডাবল ধ্রুবক অভিব্যক্তিতে প্রসারিত হয়, এটি অবশ্যই কোনও ফ্লোট হিসাবে প্রতিনিধিত্বযোগ্য নয়। ম্যাক্রোগুলি
    HUGE_VALF
    HUGE_VALL
যথাক্রমে ভাসমান এবং এর দীর্ঘ ডাবল এনালগগুলি HUGE_VAL

HUGE_VAL, HUGE_VALFএবং HUGE_VALLকোনও প্রয়োগে ইতিবাচক অসম্পূর্ণতা হতে পারে যা অসম্পূর্ণতা সমর্থন করে।

এবং §7.12.1-5 এ

একটি ভাসমান ফলাফলের উপচে এবং ডিফল্ট রাউন্ডইং কার্যকর হয়, তাহলে ফাংশনটি ম্যাক্রোর মান HUGE_VAL, HUGE_VALFবা HUGE_VALLরিটার্ন টাইপ অনুযায়ী

বোধশক্তি xnanosleep (s)

এখন আমরা সমস্ত সারাংশ বুঝতে xstrtod()। উপরের ব্যাখ্যাগুলি থেকে, এটি স্ফটিক-স্পষ্ট যে xnanosleep(s)আমরা প্রথমে প্রকৃত অর্থ দেখেছি xnanosleep(HUGE_VALL)

xnanosleep()

সোর্স কোড gnulib / lib / xnanosleep.c অনুসারে , xnanosleep(s)মূলত এটি করে:

struct timespec ts_sleep = dtotimespec (s);
nanosleep (&ts_sleep, NULL);

dtotimespec()

এই ফাংশন প্রকারের একটি যুক্তিকে ধরণের doubleএকটি বস্তুতে রূপান্তর করে struct timespec। যেহেতু এটি খুব সহজ, আমি উত্স কোডটি gnulib / lib / dtotimespec.c উদ্ধৃত করি । সব মন্তব্য আমার দ্বারা যুক্ত করা হয়।

struct timespec
dtotimespec (double sec)
{
  if (! (TYPE_MINIMUM (time_t) < sec)) //underflow case
    return make_timespec (TYPE_MINIMUM (time_t), 0);
  else if (! (sec < 1.0 + TYPE_MAXIMUM (time_t))) //overflow case
    return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
  else //normal case (looks complex but does nothing technical)
    {
      time_t s = sec;
      double frac = TIMESPEC_HZ * (sec - s);
      long ns = frac;
      ns += ns < frac;
      s += ns / TIMESPEC_HZ;
      ns %= TIMESPEC_HZ;

      if (ns < 0)
        {
          s--;
          ns += TIMESPEC_HZ;
        }

      return make_timespec (s, ns);
    }
}

যেহেতু time_tএকটি অবিচ্ছেদ্য টাইপ হিসাবে সংজ্ঞায়িত হয়েছে (দেখুন §7.27.1-3), তাই আমরা স্বাভাবিকভাবেই ধরে নিই যে প্রকারের সর্বাধিক মান (প্রকারের ) time_tচেয়ে ছোট , যার অর্থ আমরা ওভারফ্লো ক্ষেত্রে প্রবেশ করি। (আসলে এই অনুমানের প্রয়োজন নেই, যেহেতু সব ক্ষেত্রেই প্রক্রিয়াটি মূলত একই রকম।)HUGE_VALdouble

make_timespec()

আমাদের উপরে উঠতে হবে শেষ প্রাচীর make_timespec()। খুব সৌভাগ্যক্রমে, এটি এত সহজ যে উত্স কোডটি gnulib / lib / timespec.h উদ্ধৃত করা যথেষ্ট।

_GL_TIMESPEC_INLINE struct timespec
make_timespec (time_t s, long int ns)
{
  struct timespec r;
  r.tv_sec = s;
  r.tv_nsec = ns;
  return r;
}

2

আমার সম্প্রতি এটি করা দরকার ছিল। আমি নিম্নলিখিত ফাংশন নিয়ে এসেছি যা কোনও বাহ্যিক প্রোগ্রাম না ডেকে বাশকে চিরতরে ঘুমাতে দেয়:

snore()
{
    local IFS
    [[ -n "${_snore_fd:-}" ]] || { exec {_snore_fd}<> <(:); } 2>/dev/null ||
    {
        # workaround for MacOS and similar systems
        local fifo
        fifo=$(mktemp -u)
        mkfifo -m 700 "$fifo"
        exec {_snore_fd}<>"$fifo"
        rm "$fifo"
    }
    read ${1:+-t "$1"} -u $_snore_fd || :
}

দ্রষ্টব্য: আমি এর আগে এমন একটি সংস্করণ পোস্ট করেছি যা প্রতিবার ফাইল বর্ণনাকারী খোলার এবং বন্ধ করে দেবে, তবে আমি দেখেছি যে কয়েকটি সিস্টেমে কয়েক সেকেন্ডে এটি কয়েক সেকেন্ডে করে শেষ পর্যন্ত লক হয়ে যায়। সুতরাং নতুন সমাধানটি ফাংশনটির কলগুলির মধ্যে ফাইল বর্ণনাকারী রাখে। বাশ যাইহোক প্রস্থান করার সময় এটি পরিষ্কার করবে।

এটিকে ঠিক / বিন / ঘুমের মতো বলা যেতে পারে এবং এটি অনুরোধকৃত সময়ের জন্য ঘুমাবে। প্যারামিটার ছাড়াই কল করা, এটি চিরতরে স্তব্ধ হয়ে যাবে।

snore 0.1  # sleeps for 0.1 seconds
snore 10   # sleeps for 10 seconds
snore      # sleeps forever

আমার ব্লগে এখানে অতিরিক্ত বিবরণ সহ একটি লিখনআপ রয়েছে


1

প্রক্রিয়াটি বাঁচিয়ে রাখার জন্য এই পদ্ধতির কোনও সংস্থান গ্রহণ করা হবে না।

while :; do sleep 1; done & kill -STOP $! && wait $!

ভাঙ্গন

  • while :; do sleep 1; done & পটভূমিতে একটি ডামি প্রক্রিয়া তৈরি করে
  • kill -STOP $! পটভূমি প্রক্রিয়া থামায়
  • wait $! ব্যাকগ্রাউন্ড প্রক্রিয়াটির জন্য অপেক্ষা করুন, এটি চিরতরে অবরুদ্ধ হবে, কারণ ব্যাকগ্রাউন্ড প্রক্রিয়া আগে বন্ধ হয়ে গিয়েছিল

0

তার জন্যে উইণ্ডো ম্যানেজার হত্যার সঙ্গে নতুন এক চলমান চেষ্টা --replaceবা -replaceযদি পাওয়া যায়।


1
আমি যদি ব্যবহার --replaceকরি তবে আমি সর্বদা একটি সতর্কতা পাই another window manager is already running। এটি আমার কাছে খুব একটা বোঝায় না।

-2
while :; do read; done

বাচ্চাদের ঘুমানোর প্রক্রিয়াটির জন্য অপেক্ষা নেই।


1
এটির stdinপরেও যদি এটির সাথে সংযুক্ত হতে থাকে তবে এটি খায় tty। আপনি যদি এটি দিয়ে < /dev/nullব্যস্ত-লুপগুলি চালান । এটি নির্দিষ্ট পরিস্থিতিতে কিছুটা ব্যবহারের হতে পারে, তাই আমি উজ্জীবিত হই না।
টিনো

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