नहीं करना चाहिए, मैं मिनी-शैल लिख रहा हूं (नहीं, स्कूल के लिए नहीं: पी; अपने स्वयं के आनंद के लिए) और अधिकांश बुनियादी कार्यक्षमता अब की गई है लेकिन मैं SIGTSTP को संभालने का प्रयास करते समय अटक गया हूं।वेटपिड अवरुद्ध करना जब इसे
माना जाता है कि जब कोई उपयोगकर्ता Ctrl+Z
दबाता है, तो SIGTSTP को खोल की अग्रभूमि प्रक्रिया में भेजा जाना चाहिए, और शैल सामान्य रूप से जारी रखना चाहिए।
प्रत्येक प्रक्रिया बनाने (अगर यह एक अग्रभूमि प्रक्रिया है) के बाद, निम्न कोड इंतजार कर रहा है:
if(waitpid(pid, &processReturnStatus, WUNTRACED)>0){//wait stopped too
if(WIFEXITED(processReturnStatus) || WIFSIGNALED(processReturnStatus))
removeFromJobList(pid);
}
और मैं संकेत से निपटने कर रहा हूँ इस प्रकार है:
void sigtstpHandler(int signum)
{
signum++;//Just to remove gcc's warning
pid_t pid = findForegroundProcessID();
if(pid > -1){
kill(-pid, SIGTSTP);//Sending to the whole group
}
}
क्या होता है जब मैं Ctrl+Z
दबाता हूं, तो प्रक्रिया की स्थिति को देखने के लिए बच्चे की प्रक्रिया वास्तव में निलंबित हो जाती है (ps -all
का उपयोग करके) लेकिन मेरा खोल waitpid
पर लटका हुआ है आर रिटर्न देता है भले ही मैंने WUNTRACED
फ्लैग पास किया, जहां तक मुझे समझा जाता है कि प्रक्रिया को बंद होने पर waitpid
वापस करना है।
तो मैं गलत क्या कर सकता था? या क्या मैं वेटपीड के व्यवहार को गलत तरीके से समझता हूं?
नोट्स:
-findForegroundProcessID() सही पिड देता है; मैंने दोबारा जांच की।
मैं प्रत्येक प्रक्रिया के समूह को बदलने हूँ जब सही होने के बाद मैं fork
-Handling Ctrl+C
ठीक काम कर रहा है
-अगर मैं एक टर्मिनल का उपयोग मेरी खोल रुक जाता है के बाद SIGCONT भेजने के लिए, बच्चे प्रक्रिया अपना काम शुरू और खोल यह काटनेवाला अंत में।
- मैं SIGTSTP को पकड़ रहा हूं जहां तक मैंने पढ़ा (और परीक्षण) पकड़ा जा सकता है। - मैंने वेटपिड के बजाय वेटिड का उपयोग करने की कोशिश की, अगर समस्या बनी रहती है। संपादित करें:
void sigchldHandler(int signum)
{
signum++;//Just to remove the warning
pid_t pid;
while((pid = waitpid(-1, &processReturnStatus, 0)) > 0){
removeFromJobList(pid);
}
if(errno != ECHILD)
unixError("kill error");
}
मेरे SIGCHLD हैंडलर।
IIUC, आप SIGSTP को पकड़ने की कोशिश कर रहे हैं। आप सिगस्ट या सिगकिल नहीं पकड़ सकते हैं। – wildplasser
मुझे यकीन नहीं है कि सिगस्टॉप एसआईजीएसटीपी जैसा ही है लेकिन एक पुस्तक के मुताबिक, सिगस्टॉप पकड़ा नहीं जा सकता है लेकिन सिगस्टॉप कर सकता है, असल में मुझे यकीन है कि मैंने इसे पकड़ा क्योंकि मैंने टेस्ट – Fingolfin
ओओएस, मेरे बुरे परीक्षण के रूप में कुछ प्रिंट किया था। अगर मैं सही ढंग से पढ़ता हूं, तो एसआईजीटीएसटीपी को जानबूझकर पकड़ा जाने की अनुमति देने के लिए बनाया गया था, प्रक्रिया-समूह/टर्मिनल-समूह को इसके सदस्यों के बीच प्रचार करने की अनुमति देने के लिए। यदि आप जिस पुस्तक को संदर्भित करते हैं वह एपीयूई है, तो आप शायद इसे सही ढंग से करने में सक्षम होंगे ... – wildplasser