का जवाब नहीं दे रहा है, मैं सी में मूल खोल को कोड कर रहा हूं, और मैं अभी एक बाल प्रक्रिया को निलंबित करने पर काम कर रहा हूं।एसआईजीटीएसटीपी के साथ बाल प्रक्रिया को निलंबित करने के बाद, शेल
मुझे लगता है कि मेरी संकेत हैंडलर सही है, और मेरे बच्चे प्रक्रिया निलंबित किया जाता है, लेकिन उसके बाद, टर्मिनल माता पिता प्रक्रिया पर लौट जाना चाहिए और कहा कि नहीं हो रहा है।
बच्चे को निलंबित कर दिया गया है, लेकिन मेरा खोल अब इनपुट या आउटपुट पंजीकृत नहीं कर रहा है। tcsetpgrp() मदद नहीं कर रहा प्रतीत होता है।
यहाँ SIGTSTP के लिए मेरे खोल कोड में मेरी संकेत हैंडलर है:
void suspend(int sig) {
pid_t pid;
sigset_t mask;
//mpid is the pgid of this shell.
tcsetpgrp(STDIN_FILENO, mpid);
tcsetpgrp(STDOUT_FILENO, mpid);
sigemptyset(&mask);
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
signal(SIGTSTP, SIG_DFL);
//active.pid is the pid of the child currently in the fg.
if (active.pid != 0) {
kill(active.pid, SIGTSTP);
}
else{
//if this code is being run in the child, child calls SIGTSTP on itself.
pid = getpid();
if (pid != 0 && pid != mpid){
kill(pid, SIGTSTP);
}
}
signal(SIGTSTP, suspend);
}
किसी को भी मुझे बता सकते हैं मैं गलत क्या कर रहा हूँ?
क्या मैं अपने खोल को बच्चे के साथ निलंबित कर रहा हूं, और क्या मुझे किसी भी तरह से शैल में स्टडीन और स्टडआउट वापस करने की ज़रूरत है? यह मैं कैसे करूंगा?
धन्यवाद!
उत्तर के लिए धन्यवाद। मैंने जो कहा है, उसे करने की कोशिश की है, लेकिन जब मैं अपना सिग्नल हैंडलर लेता हूं तो टर्मिनल सिर्फ माता-पिता को निलंबित करता है और बैश पर लौटता है। मुझे दौड़ने के लिए माता-पिता की ज़रूरत है। – user1710304
यह सादा गलत है, SIGTSTP को पकड़ने से निश्चित रूप से उसका खोल निलंबित हो जाएगा और बच्चों को प्रक्रियाओं को आगे बढ़ने देगा। उसे पकड़ने की जरूरत है ताकि उसका खोल निलंबित नहीं होगा। मुझे अभी भी एक ही समस्या का सामना करना पड़ रहा है, उसे पहले – Fingolfin
@AdelQodmani का सामना करना पड़ा, टर्मिनल का केवल अग्रभूमि प्रक्रिया समूह एक SIGTSTP प्राप्त करता है जब आप Ctrl-Z दबाते हैं। वह खोल जो सिर्फ प्रक्रिया की समाप्ति की प्रतीक्षा कर रहा है, एक प्रक्रिया समूह में है जो टर्मिनल का अग्रभूमि प्रक्रिया समूह नहीं है। यदि आप चाहें तो _ignore_ SIGTSTP कर सकते हैं, यह संभव है कि अधिकांश गोले क्या करें। मेरा मुद्दा यह था कि आपको टर्मिनल के अग्रभूमि प्रक्रिया समूह के साथ खेलना होगा। –