একটি স্থগিত প্রক্রিয়া হত্যা?


17

আমি কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

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

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

উহু!

সত্যই উপলব্ধি করে, এখন যে আমি এটি সম্পর্কে চিন্তা করি, vimএটি সিগন্যাল হ্যান্ডলারটি ছাড়তে বলা এবং এটি করার জন্য চালিত হতে হবে।

তবে স্পষ্টতই আমি যা করতে চেয়েছিলাম তা নয়।

একক আদেশে "জেগে ওঠার" উপায় কি আছে? অর্থাত্, একটি অন্তর্নির্মিত ওরফে জন্য kill %N && fg %N?

পটভূমিতে পুনরায় কাজ কেন কাজ করে না? আমি bgপরিবর্তে যদি fg, ভিম আমার অবধি বেঁচে থাকে fg, যা আমার উপরের স্বজ্ঞাততাগুলিকে ভঙ্গ করে।

উত্তর:


20

vi-vi-viশয়তানের। তোমরা অবশ্যই তা আগুনে মেরে ফেলবে। বা SIGKILL:

kill -KILL %1

বিল্টিনগুলি স্থগিত প্রক্রিয়াগুলিতে killপ্রেরণের SIGCONTজন্য যথেষ্ট দয়া করে যাতে আপনার নিজের এটি করার দরকার নেই, তবে প্রক্রিয়াটি আপনি যে সিগন্যালটি প্রেরণ করছেন তা বাধা দেয় বা যদি সংকেত পরিচালনার ফলে প্রক্রিয়াগুলি স্থগিত হয়ে যায় আবার (যদি কোনও পটভূমি প্রক্রিয়া টার্মিনাল থেকে ডিফল্টরূপে পড়ার চেষ্টা করে তবে তা প্রেরণ করা হবে SIGTTIN, যা যদি পরিচালনা না করে প্রক্রিয়া স্থগিত করে)।


1
কেন পৃথিবীতে আপনি SIGABRT ব্যবহার করবেন? এটি একটি প্রোগ্রাম বাগ নির্দেশ করার জন্য বোঝানো হয়েছিল। আপনি প্রোগ্রামটি চান কিনা তা এখনই মেরে ফেলতে চাওয়ার জন্য সইগাইল ঠিক আছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
প্রকৃতপক্ষে, দেখে মনে হচ্ছে SIGTERMএখন ঘুম থেকে ওঠার প্রক্রিয়াগুলি রয়েছে, কমপক্ষে যদি তাদের পক্ষে হ্যান্ডলার না থাকে। আমি এটা এই ভাবে কাজ করতে, যেহেতু আমি হচ্ছে মনে রাখবেন ব্যবহার করা হয়নি মনে bgবা fgকিছু আগেই সংকেত চলে যেতে হবে। তবে আমি পরীক্ষা করেছিলাম awk 'BEGIN{while(42){}}' &এবং এর সাথে এবং strace kill $!কেবলমাত্র একটি kill(2)সিস্টেম কল রয়েছে SIGTERM
পিটার কর্ডেস

6

vimsigprocmask(2)সাধারণ সংকেতগুলি উপেক্ষা করার জন্য সিগন্যাল হ্যান্ডলারগুলি ইনস্টল করে (এবং সম্ভবত সেটিংসও করা হচ্ছে ) যাতে কোনও স্ট্রে কন্ট্রোল + সি বা এলোমেলোভাবে কিল সংকেতের কারণে যে কোনও ফাইল সম্পাদনা হচ্ছে তা হারিয়ে না যায়। একটি সহজ প্রোগ্রাম সহজেই হত্যা করা হয়:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

মেকিং vimথেকে প্রস্থান (নিরাপদে) একটি সংকেত হ্যান্ডলার প্রয়োজন করবে vimযে গ্রহণ করে TERMবা USR1বা কিছু, সংরক্ষণ (পরিত্যাগ বা?) কোনো বাফার ইত্যাদি কি আপনি প্রয়োজন কি করতে করতে চেষ্টা করছেন vimভালো প্রস্থান?


"এইভাবে ভিএম প্রস্থান করার জন্য আপনি কী করার চেষ্টা করছেন?" - কিছুই না, এটি একটি আসল "tmp" ফাইল যা আমি সম্পাদনা করছিলাম। vimসাসপেনশনটি পরীক্ষা করার জন্য প্রোগ্রামটি ছিল কেবল একটি কল্পনাশক্তি।
ওজেফোর্ড

1
"সাধারণ সংকেতগুলি উপেক্ষা করুন যাতে কোনও স্ট্রে কন্ট্রোল + সি বা র্যান্ডম কিল সংকেতের কারণে যে কোনও ফাইল সম্পাদনা হচ্ছে তা হারিয়ে না যায়" - তবে আমি fgতিই ছাড়ার সাথে সাথে এটি কেবল ততক্ষণ বন্ধ হয়ে যায় যতক্ষণ না এটি স্থগিত করা হয়েছিল?
ওজেফোর্ড

2
@ অলিফোর্ড: কেবল SIGKILLএকটি ঘুমানোর প্রক্রিয়া জাগায় তাই এটি মারা যেতে পারে। স্থগিত প্রক্রিয়াতে সংকেত প্রেরণে কাস্টম হ্যান্ডলারগুলি তাদের কাছে তা জাগে না। (অন্যান্য তুলনায় SIGCONT, সিগন্যাল অবিরত, অবশ্যই। bgএবং fgপাঠাতে SIGCONT।)
পিটার Cordes
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.