वर्तमान प्रक्रिया को उसके प्रतिरूप / बच्चे द्वारा बदलें


10

मेरे पास एक कार्यक्रम है Pजो "हैलो" और आउटपुट "क्यों?" एक सुविधा प्रदान करने से पहले। इस सुविधा का उपयोग अन्य कार्यक्रमों द्वारा किया जाता है जो इस बात से अवगत नहीं हैं कि "हैलो" के साथ बातचीत शुरू करना सामान्य शिष्टाचार है। मैं इस प्रकार Pइस तरह के काम करता है (zsh वाक्य रचना) के लिए एक आवरण लिखना चाहता हूँ :

coproc P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.

का उपयोग करना catया ddमें Replace...(जैसे कुछ हिस्सा cat <&p &; exec cat >&p) अनावश्यक बफरिंग का परिणाम है। मेरे विकल्प क्या हैं?


क्या आप एक zshसमाधान चाहते हैं या एक bashसमाधान स्वीकार्य है?
रोएमा

1
मैं एक ऐसे bashसमाधान से निराश हो जाऊंगा जो लागू नहीं है zsh, लेकिन निश्चित रूप से इसे स्वीकार करेंगे ë
माइकेल

क्या यह पता है कि इस स्क्रिप्ट को चलाने वाले अन्य कार्यक्रम क्या होंगे? क्या यह एक परिमित सूची है, या यह कोई संख्या हो सकती है? स्पष्ट रूप से दूसरे कार्यक्रम को कॉल करने के लिए इस बारे में जानने की जरूरत है।
छिपकली

मेरा विशिष्ट उपयोग sshइसके विकल्प के साथ था ProxyCommand
मिशेल नोए

1
catआम तौर पर बफर नहीं करता है। यदि यह आपके सिस्टम पर करता है, तो प्रयास करें cat -u
स्टीफन चेज़लस

जवाबों:


1

आपके द्वारा बताई गई समस्या वास्तव में किसी प्रक्रिया को बदलने के बारे में नहीं है , बल्कि एक मौजूदा प्रक्रिया की धाराओं को बदलने के बारे में है । लक्ष्य प्रक्रिया के साथ थोड़ी बातचीत करना है, फिर इसके इनपुट / आउटपुट को अन्य धाराओं के जोड़े में सौंपना है।

इसे सीधे करने का कोई तरीका नहीं है (कम से कम, शेल में, प्रक्रिया के अंदर, एक dup2कॉल बोधगम्य रूप से काम कर सकता है)। आपको धाराओं को विभाजित करने की आवश्यकता होगी। अर्थात:

( echo Hello ; cat ) | P | ( read ; cat )

coprocअपने उदाहरण के अनुसार उपयोग करना भी ठीक है। ध्यान दें कि कमांड फ़ाइल डिस्क्रिप्टर को एक सरणी में सहेजता है, और आप बाद में उन्हें पुनर्निर्देशन के लिए उपयोग कर सकते हैं।

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


-1

बफरिंग से बचने के लिए पर्ल का उपयोग करके नीचे दिए गए कोड के साथ परीक्षण करने में सक्षम, कोशिश करें कि यह आपके लिए काम करता है

P का नमूना संस्करण

$ cat /tmp/P
#!/bin/bash
read input
if [[ $input = "Hello" ]]
then
    echo "Why?"
else
    exit 1
fi
echo "Got Hello from client, working ..."
sleep 10
echo "Need to read some input"
read x
echo "Got: $x"

रैपर कार्यक्रम

$ cat /tmp/wrapper 
#!/usr/bin/zsh
coproc /tmp/P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
if [[ "$line" = "Why?" ]]; then
    perl -e '$|=1;print $_ while(<>);' <& p &
    perl -e '$|=1;print $_ while(<>);' >& p
else
    echo "Could not get P's attention."
fi

परीक्षण चालन

$ /tmp/wrapper 
Got Hello from client, working ...
Need to read some input
hi there P!   <== Typed in at teminal
Got: hi there P!

dd ibs=1उदाहरण के लिए, यह उपयोग करने के समान ही है । मैं इसके साथ ठीक नहीं हूं। एक तरह से, कापोक की अपनी बफरिंग होती है, और यह वह है जिसे मैं उपयोग करना चाहता हूं।
माइकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.