AMcoder - javascript, python, java, html, php, sql

C++ system() ֆունկցիա — Ինչպե՞ս հավաքել թողարկված հրամանի ելքը:

Ես գործարկում եմ մի քանի հրամաններ C++ system() ֆունկցիայով.

int system ( const char * command );

Ինչպե՞ս կարող եմ հավաքել ստանդարտ ելքը թողարկված հրամաններից:

Կոնկրետ լինելու համար ես ուզում եմ հավաքել թողարկված հրամանի ելքը (օրինակ՝ dir հրամանի թողարկման արդյունքը ցուցակագրող գրացուցակը):

17.10.2009

  • Կարծում եմ՝ նա նկատի ունի մեկնաբանությամբ վերադարձված տողը, այսինքն՝ stdout: 18.10.2009
  • այո, ես նկատի ունեմ թողարկված հրամանով վերադարձված տողը 18.10.2009
  • Նկատի ունեցեք, որ system() ֆունկցիան (և ընդունված պատասխանում առաջարկված popen() և pclose() ֆունկցիաները) կիրառելի են նաև C-ի համար: Ես այս հարցին երկակի պիտակ չեմ դրել (ընդհանուր առմամբ լավ գաղափար չէ C-ով և C++-ով կրկնակի պիտակավորել: ), բայց սա կարող է բացառություն լինել կանոնից: 23.12.2014

Պատասխանները:


1

Փնտրու՞մ եք կատարված հրամանի վերադարձված արժեքը (ինչպես «ելքի կարգավիճակում»), թե՞ դրա արդյունքը (ինչպես «ինչ է տպել»):

Եթե ​​վերջինս, ապա օգտագործեք popen() և pclose() փոխարեն:

Եթե ​​առաջինը, նայեք վերադարձի արժեքը system()-ից (և օգտագործեք տեղեկատվությունը waitpid() տեղեկատվություն այն մեկնաբանելու համար):

17.10.2009
  • Շնորհակալություն ակնարկի համար - ես կփորձեմ popen()-ով 18.10.2009
  • Արդյո՞ք համակարգը պարզապես passthru զանգ չէ այն իմաստով, որ stdout/stderr-ը փոխանցվում է ծնողին ոչ stdout/stderr: 18.10.2009
  • @David. այո, բայց OP-ն չի ցանկանում, որ այն փոխանցվի: նա ցանկանում է այն հավաքել իր ծրագրում լարով 18.10.2009

  • 2

    system()-ը վերադարձնում է int, այնպես որ պարզապես վերցրեք այն՝ int rvalue = system(command);

    Կարծում եմ, որ ճշգրիտ մանրամասները, թե որ system()-ը կվերադառնա, կապված են համակարգի հետ:

    17.10.2009
  • Դրանք իսկապես հետևյալն են. 7.20.4.6 Համակարգի գործառույթը. Եթե արգումենտը զրո ցուցիչ է, ապա համակարգի ֆունկցիան վերադարձնում է ոչ զրոյական, միայն եթե առկա է հրամանի պրոցեսոր: Եթե ​​արգումենտը զրոյական ցուցիչ չէ, և համակարգի ֆունկցիան վերադառնում է, այն վերադարձնում է իրականացման կողմից սահմանված արժեք 18.10.2009
  • Ինձ պետք չէ system()-ի retrun արժեքը - Ես ուզում եմ հավաքել թողարկված հրամանի վերադարձի տողը... 18.10.2009
  • Ի՞նչ եք կարծում, ի՞նչ է վերադարձնում համակարգը: Այն վերադարձնում է հրամանի վերադարձի արժեքը: 18.10.2009
  • Ես գիտեմ, որ համակարգը () վերադարձնում է int. Հետևաբար, ես հարցրեցի, թե արդյոք կա՞ տարբերակ հավաքելու թողարկված հրամանի վերադարձի արժեքը: 18.10.2009
  • Այդ int-ի արժեքը հրամանի վերադարձված արժեքն է: Գուցե նկատի ունեք, որ ցանկանում եք հավաքել ելքը հոսքերից մեկի վրա, ինչպիսին stdout-ն է: 18.10.2009
  • @mspoerr. Կարծում եմ, որ դուք պետք է բացատրեք թողարկված հրամանի վերադարձի արժեքը, քանի որ դուք կարծես օգտագործում եք վերադարձի արժեքը ոչ սովորական ձևով (եթե դա ոչ այն int-ն է, որին հետևում եք): Եթե ​​դուք իսկապես չգիտեք, թե ինչպես պահել int-ը փոփոխականում, մենք հաղորդակցվելու ավելի խորը խնդիր ունենք: 18.10.2009

  • 3

    Համակարգային ծրագրի համար սովորաբար արժեք «վերադարձնելու» երկու եղանակ կա՝ գրելով stdout-ին և վերադարձնելով կարգավիճակի ամբողջ թիվը ծրագրի վերջում: (Հաճախ արդյունքները վերադարձնելու ավելի շատ եղանակներ կան, օրինակ՝ գրելով ֆայլ կամ տվյալների բազա, բայց ես ենթադրում եմ, որ դրանք այստեղ շրջանակից դուրս են):

    Ստատուսի կոդը ստանալու համար պարզապես ստուգեք system ֆունկցիայի վերադարձի արժեքը:

    Արդյունքը ստանալու համար կամ վերահղեք այն ֆայլի մեջ, այնուհետև կարդացեք ֆայլը, կամ օգտագործեք popen:

    17.10.2009

    4

    system-ի վերադարձի արժեքը (հեգնանքով) կախված է համակարգից, բայց POSIX համակարգերում (ներառյալ Linux և այլն), այն նույնն է, ինչ սպասեք -- ցածր 8 կամ 16 բիթը երեխայի ելքի կարգավիճակն է (հավանաբար այն, ինչ դուք նկատի ունեք «վերադարձված արժեք» ասելով), ավելի բարձր բիթերը ցույց են տալիս, թե ինչպիսի ազդանշան է դադարեցրել երեխային, Եթե ​​որեւէ. Իմ տված մենեջերի URL-ն ապահովում է նախապրոցեսորային մակրոները, որոնք կարող եք օգտագործել այդ վերադարձի արժեքը բաժանելու համար:

    Ծրագրի «վերադարձի տող» հասկացություն չկա, քանի որ դուք հիմա պարզաբանել եք մեկնաբանությունում, դա այն է, ինչ ցանկանում եք. Որպես մեկ այլ պատասխան արդեն նշվել է, եթե ցանկանում եք տեքստը, որը ելք է ստանում մյուս ծրագրի կողմից, դուք պետք է օգտագործեք popensystem-ի փոխարեն:

    17.10.2009

    5

    Ոգեշնչված bmorin-ի փորձից, բայց աշխատում և փորձարկված՝ այս հատվածը կվերցնի char* հրամանը և կվերադարձնի char*, որը պարունակում է այդ հրամանի կատարման արդյունքները...

    // Calling function must free the returned result.
    char* exec(const char* command) {
      FILE* fp;
      char* line = NULL;
      // Following initialization is equivalent to char* result = ""; and just
      // initializes result to an empty string, only it works with
      // -Werror=write-strings and is so much less clear.
      char* result = (char*) calloc(1, 1);
      size_t len = 0;
    
      fflush(NULL);
      fp = popen(command, "r");
      if (fp == NULL) {
        printf("Cannot execute command:\n%s\n", command);
        return NULL;
      }
    
      while(getline(&line, &len, fp) != -1) {
        // +1 below to allow room for null terminator.
        result = (char*) realloc(result, strlen(result) + strlen(line) + 1);
        // +1 below so we copy the final null terminator.
        strncpy(result + strlen(result), line, strlen(line) + 1);
        free(line);
        line = NULL;
      }
    
      fflush(fp);
      if (pclose(fp) != 0) {
        perror("Cannot close stream.\n");
      }
      return result;
    }
    

    Ես նայեցի պարզապես bmorin-ի կոդը խմբագրելուն, բայց ստիպված կլինեի փոխել տողերի մեծ մասը, ուստի առանձին պատասխանը ավելի տեղին էր թվում: Ներողություն, եթե ոչ: (Ի թիվս այլ խնդիրների, bmorin-ի կոդը իրականում չի կուտակել տողերը, այն տպել է դրանք stdout-ում, որտեղ ես ենթադրում եմ, որ նրանք չեն ցանկանա, քանի որ system()-ը դա կանի, և այն անվավեր է վերադարձել մեկ սխալի ճանապարհով, երբ Ֆունկցիան պետք է վերադարձնի char*, որպեսզի կոդը չկազմվի: Ամենակարևորը, թերևս, այն ազատեց արդյունքը այն վերադարձնելուց անմիջապես առաջ:)

    13.02.2014

    6

    system() հայտարարված է և սահմանված է libc-ում: Դուք կարող եք կամ կարդալ իմ տրամադրած առաջին հղումը, կամ անել man system հրամանի տողում ձեր shell-ում:

    17.10.2009

    7

    Ես առաջարկում եմ popen() ֆունկցիաները, ինչպես ասում են նաև այլ մարդիկ, բայց այս խնդիրը հատուկ է հարթակին: popen() ֆունկցիան հասանելի է օպերացիոն համակարգերում, որոնք օգտագործում են POSIX API: Ես վստահ չեմ, արդյոք այս հրամանը կաշխատի այլ API-ների վրա, ինչպիսին է WIN32-ը

    17.10.2009

    8

    Ահա կոդի հատված (պարզ C-ով), որը կատարում է հրաման popen-ով և վերադարձնում դրա ելքը.

    char* exec(const char* command) {
        FILE* fp;
        char* result = NULL;
        size_t len = 0;
    
        fflush(NULL);
        fp = popen(command, "r");
        if (fp == NULL) {
            printf("Cannot execute command:\n%s\n", command);
            return;
        }
    
        while(getline(&result, &len, fp) != -1) {
            fputs(result, stdout);
        }
    
        free(result);
        fflush(fp);
        if (pclose(fp) != 0) {
            perror("Cannot close stream.\n");
        }
        return result;
    }
    
    29.04.2013
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..