2010-12-01 10 views
7

का उपयोग कर मैक ओएस पर एक प्रक्रिया कैसे बनाएं I अपेक्षाकृत सरल, स्वतंत्र "प्रक्रिया स्टार्टर" पर काम कर रहा हूं कि मैं विंडोज (XP, Vista, 7) पर काम करना चाहता हूं), लिनक्स (उबंटू 10.10) और विशेष रूप से मैक ओएस एक्स (10.6)। लिनक्स और विंडोज मूल रूप से काम करते हैं, लेकिन मुझे मैक संस्करण के साथ कुछ परेशानी हो रही है। मैं उम्मीद कर रहा था कि fork() और exec() फ़ंक्शन मैक ओएस के तहत काम करेंगे क्योंकि वे लिनक्स में काम करते हैं। तो मेरा पहला सवाल यह है:फोर्क() और exec()

  1. मैं इन का उपयोग करना चाहिए मैक पर एक प्रक्रिया बनाने के लिए या किसी भी मंच विशिष्ट कार्यों हैं इस्तेमाल किया जा करने के लिए?

मेरे वर्तमान कोड (जो ठीक लिनक्स के तहत काम किया) यह कुछ इस तरह दिखता डिबग करने के लिए:

pid_t processId = 0; 
if (processId = fork()) == 0) 
{ 
    const char * tmpApplication = "/Path/to/TestApplication"; 

    int argc = 1; 
    char * argv[argc + 1]; 

    argv[0] = tmpApplication; 
    argv[1] = NULL; 

    execv(tmpApplication, argv); 
}else 
{ 
    //[...] 
} 

किसी भी विचार करता है, तो इस वजह से मेरे बच्चे प्रक्रिया है, साथ ही मैक ओएस एक्स के तहत काम कर सकता था बस लॉन्च नहीं किया जा रहा है, जबकि कोई त्रुटि नहीं होगी।

धन्यवाद!

उत्तर

10

निम्नलिखित कार्यक्रम, अपने कोड से अनुकूलित, ठीक मेरे लिए ओएस एक्स के तहत काम करता है:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main (void) { 
    pid_t processId; 
    if ((processId = fork()) == 0) { 
     char app[] = "/bin/echo"; 
     char * const argv[] = { app, "success", NULL }; 
     if (execv(app, argv) < 0) { 
      perror("execv error"); 
     } 
    } else if (processId < 0) { 
     perror("fork error"); 
    } else { 
     return EXIT_SUCCESS; 
    } 
    return EXIT_FAILURE; 
} 

मैं सुझाव है कि आप इस सरल टुकड़ा के साथ शुरू, और यह चीजों को जोड़ने आप पाते हैं जब तक क्या बनाता रखें काम करता है यह तोड़ता है

+0

बहुत बहुत धन्यवाद Arkku – Chris

+0

ठीक है - मुझे लगता है कि मुझे पता है कि मेरी समस्या अब क्या है, मैंने वास्तव में मूल प्रक्रिया में स्मृति तक पहुंचने की कोशिश की (देखने के लिए वास्तविक बाल प्रक्रिया का नाम), जो दुर्भाग्य से विफल रहता है - कोई सुझाव है कि मैं यह कैसे करूं? अधिक स्पष्ट होने के लिए: 'execk() 'आदेश को पास करने के लिए' फोर्क() 'को कॉल करने के बाद मुझे मनमाने ढंग से एप्लिकेशन नाम तक पहुंचने की आवश्यकता है। – Chris

+0

@ क्रिस आपको शायद उस समस्या के बारे में एक नया प्रश्न बनाना चाहिए और इसे कोड नमूना के साथ चित्रित करना चाहिए। मैं, एक के लिए, मुझे यकीन नहीं है कि मैं समझ गया कि आप क्या कर रहे हैं। – Arkku

5

TestApplication एक वास्तविक निष्पादन योग्य, या एक आवेदन बंडल (.app) है? आप केवल execv() जैसे फ़ंक्शंस का उपयोग करके वास्तविक निष्पादन योग्य लॉन्च कर सकते हैं। आम तौर पर एक आवेदन बंडल के अंदर निष्पादन योग्य ApplicationName.app/Contents/MacOS/ApplicationName पर पाया जा सकता है।

+0

धन्यवाद जस्टिन - लेकिन टेस्टप्लिकेशंस एक "सादा" यूनिक्स निष्पादन योग्य है जिसे मैं स्वयं बनाता हूं और बिना किसी समस्या के विंडोज और लिनक्स के तहत उपयोग करता हूं - इसलिए यह एक एप्लिकेशन बंडल नहीं है :( – Chris

+1

अपने मूल प्रश्न का उत्तर देने के लिए, 'कांटा () 'और' execv() 'उपयोग करने के लिए पूरी तरह से ठीक हैं। आपके' execv() '? –

+0

हम्म को आजमाने के बाद 'strerror()' क्या कहता है - मुझे वास्तव में पता नहीं है, क्योंकि execv() को निष्पादित किया जाएगा बच्चे की प्रक्रिया और मुझे वास्तव में पता नहीं है कि मैं उपरोक्त कोड – Chris