के व्यवहार को कैसे परिवर्तित कर सकता है मैं एक बहुत ही दुर्घटनाग्रस्त दुर्घटना को ट्रैक करने की कोशिश कर रहा हूं। इसके बारे में इतना अजीब बात यह है कि कोई कामकाज है जिसे किसी ने खोजा और जिसे मैं समझा नहीं सकता।निष्पादन प्रोग्राम
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
आप देख सकते हैं, सभी को इस कार्यक्रम करता execvp
का उपयोग एक अलग कार्यक्रम के साथ ही बदलने के लिए है:
वैकल्पिक हल इस छोटे से प्रोग्राम है जो मैं 'धावक' के रूप में उल्लेख करेंगे।
कार्यक्रम दुर्घटनाओं जब यह सीधे कमांड लाइन से शुरू हो जाती है:
/path/to/prog args # this crashes
लेकिन ठीक काम करता है जब यह परोक्ष रूप से मेरी धावक शिम के माध्यम से शुरू हो जाती है:
/path/to/runner /path/to/prog args # works successfully
मुझे के जीवन के लिए, मैं यह समझ सकता हूं कि अतिरिक्त निष्पादन कैसे चल रहा है, इस कार्यक्रम के व्यवहार को बदल सकता है (जैसा कि आप देख सकते हैं कि कार्यक्रम पर्यावरण को नहीं बदलता है)।
दुर्घटना पर कुछ पृष्ठभूमि। क्रैश स्वयं सी ++ रनटाइम में हो रहा है। विशेष रूप से, जब प्रोग्राम throw
करता है, तो क्रैशिंग संस्करण गलत तरीके से सोचता है कि कोई मिलान करने वाला कैच नहीं है (हालांकि वहां है) और terminate
पर कॉल करें। जब मैं धावक के माध्यम से प्रोग्राम का आह्वान करता हूं, तो अपवाद ठीक से पकड़ा जाता है।
मेरा प्रश्न कोई विचार है कि अतिरिक्त निष्पादन निष्पादित कार्यक्रम के व्यवहार को क्यों बदलता है?
मुझे नहीं पता: लेकिन execvp कार्यशील निर्देशिका को बदलता है? आप क्या तर्क पारित कर रहे हैं? –
@MartinYork - AFAIK, 'execvp' कभी भी कार्यशील निर्देशिका को बदलता नहीं है (जिसके लिए 'chdir' पर कॉल की आवश्यकता होती है और धावक ऐसा नहीं करता है)। विशिष्ट तर्क अप्रासंगिक हैं; वर्णित व्यवहार प्रोग्राम को पारित विशिष्ट तर्कों से स्वतंत्र है। –
यदि आप 'execvp()' के बजाय 'execv()' का उपयोग करते हैं तो यह वही काम करता है? – caf