2011-05-31 14 views
6

यदि मेरा ऐप क्रैश हो जाता है तो मुझे एनएसटीस्क को समाप्त करने का मौका नहीं मिलता है, इसलिए वे संसाधनों को खाने के आसपास रहते हैं।ऐप क्रैश होने पर भी एनएसटीस्क को समाप्त करें

क्या कोई कार्य लॉन्च करने का कोई तरीका है, जिससे आपका ऐप समाप्त हो जाता है (भले ही यह दुर्घटनाग्रस्त हो)?

+0

हाँ, अपने ऐप को क्रैश होने से रोकें ;-) –

उत्तर

3

मुझे लगता है कि आपको मैन्युअल रूप से एप्लिकेशन क्रैश को संभालने और स्पॉन्डेड प्रक्रियाओं को समाप्त करने के एक अलग तरीके से संभालने की आवश्यकता है। उदाहरण के लिए, आप निम्न आलेख http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html और अपवाद/सिग्नल हैंडलर में देख सकते हैं जब एप्लिकेशन क्रैश मारने (पिड, सिगकिल) का उपयोग करके अपने बच्चे की प्रक्रियाओं को समाप्त सिग्नल भेजता है, लेकिन इसके लिए आपको बच्चे की प्रक्रियाओं के पिड को रखने की भी आवश्यकता होती है (NSTask - (int) processIdentifier) ​​कहीं इसे अपवाद/सिग्नल हैंडलर से प्राप्त करने के लिए।

+0

धन्यवाद, ऐसा लगता है कि यह ठीक काम कर रहा है। – Enchilada

0

आप अपने कार्यों को समय-समय पर जांच सकते हैं कि उनकी मूल प्रक्रिया अभी भी मौजूद है या नहीं।

+0

मैं टास्क ऐप के नियंत्रण में नहीं हूं। मैं एक और पहले से ही एक कार्यक्रम चला रहा हूं, जैसे "टैर" या "सीडी"। – Enchilada

1

मैंने जो किया है वह अतीत में किया गया है, मूल प्रक्रिया में एक पाइप बना है, और उस पाइप के लिखने के अंत में बच्चे को पास करें। माता-पिता कभी भी पढ़ने के अंत को बंद नहीं करता है, और बच्चा लिखने के अंत को बंद करने के लिए देखता है। यदि लिखने का अंत कभी बंद हो जाता है, तो इसका मतलब है कि माता-पिता निकल गए हैं। निष्पादन को बंद करने के लिए आपको पाइप के पैर के अंत को चिह्नित करने की भी आवश्यकता होगी।

+0

क्या आपके पास कुछ नमूना कोड है? एनएसटीस्क/एनएसपीआईपी/एनएसएफइल हैंडलर डॉक्स/गाइड बहुत व्यापक आईएमओ नहीं हैं और उनके पास थोड़ा नमूना कोड है। – Enchilada

2

मैं वास्तव में wrote a program/script/whatever that does just this ... यहां शेल स्क्रिप्ट है जो इसकी नींव थी ... परियोजना वास्तव में एक्स-कोड के भीतर एक फ़ाइल निष्पादन योग्य के रूप में लागू करती है .. अजीब है कि सेब यह इतना अनिश्चित, आईएमओ बनाता है।

#!/bin/bash 
echo "arg1 is the SubProcess: $1, arg2 is sleepytime: $2, and arg3 is ParentPID, aka $$: $3" 
CHILD=$1 && SLEEPYTIME=$2 || SLEEPYTIME=10; PARENTPID=$3 || PARENTPID=$$ 

GoSubProcess() {      # define functions, start script at very end. 
$1 arguments &       # "&" puts SubP in background subshell 
CHILDPID=$!       # what all the fuss is about. 
if kill -0 $CHILDPID; then    # rock the cradle to make sure it aint dead 
    echo "Child is alive at $!"  # glory be to god 
else echo "couldnt start child. dying."; exit 2; fi 
babyRISEfromtheGRAVE # keep an eye on child process 
} 
babyRISEfromtheGRAVE() { 
echo "PARENT is $PARENTPID";   # remember where you came from, like j.lo 
while kill -0 $PARENTPID; do   # is that fount of life, nstask parent alive? 
    echo "Parent is alive, $PARENTPID is it's PID" 
    sleep $SLEEPTIME     # you lazy boozehound 
    if kill -0 $CHILDPID; then  # check on baby. 
     echo "Child is $CHILDPID and is alive." 
     sleep $SLEEPTIME    # naptime! 
    else echo "Baby, pid $CHILDPID died! Respawn!" 
     GoSubProcess; fi    # restart daemon if it dies 
done         # if this while loop ends, the parent PID crashed. 
logger "My Parent Process, aka $PARENTPID died!" 
logger "I'm killing my baby, $CHILDPID, and myself." 
kill -9 $CHILDPID; exit 1    # process table cleaned. nothing is left. all three tasks are dead. long live nstask. 
} 
GoSubProcess    # this is where we start the script. 
exit 0      # this is where we never get to 
संबंधित मुद्दे