java - जब माता-पिता करता है तो मैं बच्चे की प्रक्रिया से बाहर निकलने का कारण कैसे बना सकता हूं?




process (6)

आप बस बाल प्रक्रिया में System.in से थ्रेड पढ़ने शुरू कर सकते हैं। यदि आप अपने बच्चे के stdin के लिए लिख नहीं रहे हैं, कोई और नहीं करेगा और धागा "हमेशा के लिए" ब्लॉक करेगा। लेकिन यदि माता-पिता की प्रक्रिया मारे जाती है या अन्यथा मर जाती है तो आपको एक ईओएफ (या अपवाद) मिलेगा। तो आप बच्चे को भी बंद कर सकते हैं। (जावा प्रक्रिया के साथ बाल प्रक्रिया शुरू हुई। प्रोसेसबिल्डर)

मैं प्रोसेसबिल्डर के साथ एक बाल प्रक्रिया शुरू कर रहा हूं, और माता-पिता की प्रक्रिया होने पर बाहर निकलने के लिए बाल प्रक्रिया की आवश्यकता है। सामान्य परिस्थितियों में, मेरा कोड बच्चे को ठीक से रोक रहा है। हालांकि, अगर मैं ओएस को माता-पिता को मारने का कारण बनता हूं, तो बच्चा दौड़ना जारी रखेगा।

माता-पिता को बाल प्रक्रिया को "टाई" करने का कोई तरीका है, जैसे माता-पिता की हत्या होने पर यह बाहर निकल जाएगा?

समान प्रश्न:


एक बाल प्रक्रिया और उसके माता-पिता के बीच कोई संबंध नहीं है। वे एक-दूसरे को प्रोसेस आईडी जानते हैं, लेकिन उनके बीच कोई कठोर संबंध नहीं है। आप अनाथ प्रक्रिया के बारे में क्या बात कर रहे हैं। और यह एक ओएस स्तर की चिंता है। मतलब किसी भी समाधान शायद मंच निर्भर है।

केवल एक चीज के बारे में मैं सोच सकता हूं कि बच्चा समय-समय पर अपने माता-पिता की स्थिति की जांच कर रहा है, अगर माता-पिता के शटडाउन से बाहर निकल जाए। मुझे नहीं लगता कि यह सब भरोसेमंद होगा।


एक हैकर तरीका प्रदान करें जो @ टोमकरी से उत्तर के समान है और डेमो कोड भी प्रदान करता है।

यदि आपके बच्चे की प्रक्रिया को इनपुट इनपुट स्ट्रीम की आवश्यकता नहीं है, तो बस बाल प्रक्रिया इनपुट स्ट्रीम को अपनी मूल प्रक्रिया की इनपुट स्ट्रीम पर रीडायरेक्ट करें। फिर इनपुट स्ट्रीम को हमेशा पढ़ने के लिए बच्चे में एक धागा जोड़ें और जब यह धागा इनपुट स्ट्रीम से कुछ भी नहीं पढ़ सकता है, तो यह बच्चा प्रक्रिया निकलती है। तो माता-पिता की प्रक्रिया निकलती है -> अभिभावक की इनपुट स्ट्रीम मौजूद नहीं है -> बच्चे की इनपुट स्ट्रीम मौजूद नहीं है -> बाल प्रक्रिया निकलती है।

जावा में सभी डेमो कोड यहां है।

अभिभावक प्रक्रिया:

package process.parent_child;

import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;

public class ParentProc {

    public static void main(String[] args) {
        System.out.println("I'm parent.");

        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
        ProcessBuilder builder = new ProcessBuilder(javaBin, "process.parent_child.ChildProc");

        // Redirect subprocess's input stream to this parent process's input stream.
        builder.redirectInput(Redirect.INHERIT);
        // This is just for see the output of child process much more easily.
        builder.redirectOutput(Redirect.INHERIT);
        try {
            Process process = builder.start();
            Thread.sleep(5000);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Parent exits.");
    }
}

बाल प्रक्रिया:

package process.parent_child;

import java.io.IOException;
import java.util.Scanner;

public class ChildProc {


    private static class StdinListenerThread extends Thread {

        public void run() {
            int c;
            try {
                c = System.in.read();
                while ( c != -1 ) {
                    System.out.print(c);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("\nChild exits.");
            System.exit(0);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println("I'm child process.");
        StdinListenerThread thread = new StdinListenerThread();
        thread.start();
        Thread.sleep(10000);
    }
}

निम्न आदेश द्वारा इस मूल प्रक्रिया को चलाने के बाद:

    java process.parent_child.ParentProc

तुम देखोगे

    I'm parent.
    I'm child process.
    Parent exits.
    xmpy-mbp:bin zhaoxm$
    Child exits

जब माता-पिता की प्रक्रिया निकलती है तो बाल प्रक्रिया तत्काल निकलती है।


खिड़कियों के लिए, मैं इस मतदान हैक के साथ आया था:

static int getPpid(int pid) throws IOException {
    Process p = Runtime.getRuntime().exec("C:\\Windows\\System32\\wbem\\WMIC.exe process where (processid="+pid+") get parentprocessid");
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    br.readLine();
    br.readLine();
    String ppid= br.readLine().replaceAll(" ","");
    return Integer.parseInt(ppid);
}
static boolean shouldExit() {
    try {
        String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
        int ppid = getPpid(Integer.parseInt(pid));
        /* pppid */ getPpid(ppid);
    } catch (Exception e) {
        return true;
    } 
    return false;
}

जबकि आप कठोर गर्भपात (उदाहरण के लिए यूनिक्स पर सिगकिल) के खिलाफ सुरक्षा नहीं कर सकते हैं, तो आप अन्य संकेतों के खिलाफ सुरक्षा कर सकते हैं जो आपके माता-पिता की प्रक्रिया को बंद कर देते हैं (उदाहरण के लिए SIGINT) और अपने बच्चे की प्रक्रिया को साफ करें। आप शटडाउन हुक के उपयोग के माध्यम से इसे पूरा कर सकते हैं: Runtime#addShutdownHook , साथ ही संबंधित एसओ प्रश्न देखें।

आपका कोड ऐसा कुछ दिख सकता है:

String[] command;
final Process childProcess = new ProcessBuilder(command).start();

Thread closeChildThread = new Thread() {
    public void run() {
        childProcess.destroy();
    }
};

Runtime.getRuntime().addShutdownHook(closeChildThread); 

जैसा कि आपने पाया है कि ऑपरेटिंग सिस्टम आपको इस मुद्दे को हल करने की अनुमति देता है। इसके बजाय, दोनों प्रक्रियाओं द्वारा साझा संसाधन बनाएं। जब माता-पिता संसाधन का पालन करते हैं, तो बच्चा बंद करके प्रतिक्रिया करता है। उदाहरण के लिए:

यादृच्छिक उच्च संख्या पोर्ट पर अभिभावक पर स्वीकार्य मोड में सर्वर-साइड टीसीपी / आईपी सॉकेट के साथ एक थ्रेड बनाएं। जब बच्चा शुरू होता है, तो पोर्ट नंबर को पैरामीटर (पर्यावरण चर, डेटाबेस प्रविष्टि, जो भी हो) के रूप में पास करें। क्या यह एक धागा बनाओ और उस सॉकेट को खोलें। धागे हमेशा के लिए सॉकेट पर बैठते हैं। यदि कनेक्शन कभी गिरता है, तो बच्चे को बाहर निकलें।

या

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





process