Salutare tuturor,<br><br>Stiu ca este vacanta, dar ma gandesc ca poate cineva isi arunca un ochi si pe lista de discutii de la so si ajuta vreun disperat ca mine.<br>Eu ma confrunt cu urmatoarea problema :<br>- incerc sa rulez din shell-ul meu comenzi simple + cele 3 comenzi interne (exit, quit, cd) si dupa ce scriu dir sau alta comanda , imi da outputul acestia si apoi mi se blocheaza<br>
Am folosit copy / paste functia de executare a unui proces din laborator, iar parsarea o fac intr-o bucla (dupa modelul DisplayStructure.cpp) .<br><br>CloseProcess si Exec sunt din laborator.<br>CreateCommand -&gt; creeaza o comanda (concateneaza verbul si parametri (dc exista) si o pune intre ghilimele ca sa o trimita la executie lui Exec .<br>
ExecuteCOmmand -&gt; executa o comanda simpla (momentan).<br>Mainul -&gt; luat cu copy paste din exemplele din parserul vostru<br>Blocarea apare la a doua comanda care ar urma sa fie scrisa, mai precis in bucla de for din main,  intre               cout &lt;&lt; &quot;&gt; &quot;;        si         getline(cin, line);    <br>
<br>Redau mai jos bucata de cod care executa comanda si cea care se ocupa de citirea ei :<br>=================================================================<br>/*@ fn  void CloseProcess(LPPROCESS_INFORMATION ppi)<br>    @brief functia inchide procesul curent; functia este preluata mot-a-mot din laborator<br>
    @param ppi : pointer catre structura de informatii a procesului<br>    @return nimic<br>*/ <br>inline void CloseProcess(LPPROCESS_INFORMATION ppi)<br>{<br>    CloseHandle(ppi-&gt;hThread);<br>    CloseHandle(ppi-&gt;hProcess);<br>
}<br> <br>/*@ fn int Exec(const char *cmdLine)<br>    @brief executa o comanda simpla; functia este preluata mot-a-mot din laborator<br>    @param cmdLine : comanda care trebuie executata<br>    @return -1 la esec; pidul procesului la succes<br>
*/<br>int Exec(const char *cmdLine)<br>{<br>    STARTUPINFO si;<br>    ZeroMemory(&amp;si, sizeof(si));<br>    si.cb = sizeof(si);<br>    PROCESS_INFORMATION pi;<br>    char *cmd = _strdup(cmdLine);    // lpCommandLine not const<br>
    BOOL bRes = CreateProcess(NULL, cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL,<br>        NULL, &amp;si, &amp;pi);<br>    <br>     <br>    if (!bRes) {<br>          cerr &lt;&lt; &quot;eroare la createprocess &quot; &lt;&lt; endl;<br>
        free(cmd);    // proper<br>        return -1;<br>    }<br>    DWORD dwRes = WaitForSingleObject(pi.hProcess, INFINITE);    // signaled = finished<br>     <br>    if (WAIT_FAILED == dwRes) {<br>         cerr &lt;&lt; &quot;eroare la Wait for single object&quot; &lt;&lt;endl;<br>
        free(cmd);    // proper<br>        CloseProcess(&amp;pi);<br>        return -1;<br>    }<br>    bRes = GetExitCodeProcess(pi.hProcess, &amp;dwRes);<br>    <br>    free(cmd);<br>    CloseProcess(&amp;pi);<br>   <br>
    if (!bRes) {<br>            cerr &lt;&lt; &quot; eroare la closeprocess &quot; &lt;&lt; endl;<br>            return -1;<br>        }<br>   <br>    return static_cast&lt;int&gt;(dwRes);<br>}<br><br><br>/*! fn CreateCommand(simple_command_t comanda)<br>
    @brief concateneaza verbul si parametri comenzii pentru o comanda simpla<br>    @param comanda : comanda simpla<br>    @return sirul rezultat din concatenare<br>*/<br><br>char* CreateCommand(simple_command_t *comanda){<br>
    char* rez = (char*) calloc(256,sizeof(char));<br>    if (!rez) {<br>        cerr &lt;&lt;&quot;Eroare la alocare&quot;&lt;&lt;endl;<br>        return NULL;<br>    }<br>    strcat_s(rez,256,comanda-&gt;verb-&gt;string);<br>
    if (comanda-&gt;params != NULL) {<br>        strcat_s(rez,256,&quot; &quot;);<br>        strcat_s(rez,256,comanda-&gt;params-&gt;string);<br>    }    <br>    return rez;<br>}<br>    <br><br>/*! fn ExecuteCommand(command_t* root);<br>
    @brief executa o comanda primita de la utilizator<br>    @param root : este comanda<br>    @return nimic<br>*/<br><br>void ExecuteCommand(command_t *root) {<br>    char *comanda, *comanda_exec;<br>    int res,dim;<br>
    //daca este o comanda simpla<br>    <br>    if(root-&gt;op == OP_NONE) {        <br>        comanda = CreateCommand(root-&gt;scmd);<br>    <br>        //daca este cumva exit/quit<br>        ExitShell((char*) root-&gt;scmd-&gt;verb-&gt;string);<br>
<br>        //daca este cd director<br>        if (_stricmp(root-&gt;scmd-&gt;verb-&gt;string,&quot;cd&quot;) == 0)<br>            ChangeDirectory((const char*)root-&gt;scmd-&gt;params-&gt;string);<br>        else {<br>            dim = 3+strlen(comanda);<br>
            comanda_exec =(char*) calloc(dim , sizeof(char));<br>            if (comanda_exec == NULL) <br>                return;<br>            strcat_s(comanda_exec,dim,&quot;\&quot;&quot;);<br>            strcat_s(comanda_exec,dim,comanda);<br>
            strcat_s(comanda_exec,dim,&quot;\&quot;&quot;);<br>            res = Exec(comanda_exec);<br>            if (res &lt; 0) {<br>                cerr &lt;&lt; &quot;Execution failed for &quot;&lt;&lt;root-&gt;scmd-&gt;verb-&gt;string&lt;&lt;endl;<br>
            }<br>        }    <br>    }    <br>}<br><br>/*! fn int main()<br>    @brief mainul; este mini-shellul in care se ruleaza comenzile<br>    @param fara parametri<br>    @return 0 la succes; -1 la esec<br>*/<br>int main(void)<br>
{<br>    string line;<br>    command_t* root = NULL;        <br><br>    for (;;) {<br>        cout &lt;&lt; &quot;&gt; &quot;;        <br>        getline(cin, line);        <br>        if ((line.length() == 0) &amp;&amp; !cin.good()) {<br>
            // end of file reached<br>            cerr &lt;&lt; &quot;End of file!&quot; &lt;&lt; endl;<br>            return EXIT_SUCCESS;<br>        }<br><br>        if (parse_line(line.c_str(), &amp;root)) {<br>            <br>
            if (root == NULL) {<br>                cout &lt;&lt; &quot;Command is empty!&quot; &lt;&lt; endl;<br>            }<br>            else {<br>                // root points to a valid command tree<br>                // that we can use<br>
                ExecuteCommand(root);<br>        <br>            }<br>        }<br>        else {<br>            // there was an error parsing the command<br>            cout &lt;&lt; &quot;Error parsing!&quot; &lt;&lt; endl;<br>
        }<br>        <br>        cout &lt;&lt; endl &lt;&lt; endl;<br>        free_parse_memory();        <br>    }<br>}<br>===============================================<br><br><br>Multumesc mult de tot. <br>Astept un raspuns.<br>
<br>Ana<br>332cc<br>