C 在命令函数中保持状态

C 在命令函数中保持状态,c,command,C,Command,我做了一个函数,你可以从中得到命令的输出。它可以工作,但不会保留上一个命令的状态,例如,如果更改目录(cd dir),则在新命令中不会更改它。是否可以更改该函数,以便在下一个命令中更改目录时保留该函数?这是我的职责: int execute(char *command, char *output) { int rc; char buffer[4096], *cmd; DWORD byte, bytes;

我做了一个函数,你可以从中得到命令的输出。它可以工作,但不会保留上一个命令的状态,例如,如果更改目录(cd dir),则在新命令中不会更改它。是否可以更改该函数,以便在下一个命令中更改目录时保留该函数?这是我的职责:

    int execute(char *command, char *output)
    {
            int rc;
            char buffer[4096], *cmd;
            DWORD byte, bytes;
            HANDLE in_read, in_write, out_read, out_write;
            PROCESS_INFORMATION pi;
            SECURITY_ATTRIBUTES sa;
            STARTUPINFO si;

            cmd = malloc(sizeof(char) * (strlen(command) + 8));
            strcpy(cmd, "cmd /c ");
            strcat(cmd, command);

            ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
            ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
            ZeroMemory(&si, sizeof(STARTUPINFO));

            sa.nLength = sizeof(SECURITY_ATTRIBUTES);
            sa.bInheritHandle = TRUE;
            sa.lpSecurityDescriptor = NULL;

            rc = CreatePipe(&out_read, &out_write, &sa, 0);
            check(rc != 0)
            rc = SetHandleInformation(out_read, HANDLE_FLAG_INHERIT, 0);
            check(rc != 0)
            rc = CreatePipe(&in_read, &in_write, &sa, 0);
            check(rc != 0)
            rc = SetHandleInformation(in_write, HANDLE_FLAG_INHERIT, 0);
            check(rc != 0)

            si.cb = sizeof(STARTUPINFO);
            si.dwFlags = STARTF_USESTDHANDLES;
            si.hStdError = out_write;
            si.hStdOutput = out_write;
            si.hStdInput = in_read;

            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);

            rc = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, 
            NULL, NULL, &si, &pi);
            check(rc != 0)

            CloseHandle(out_write);

            bytes = 0;
            while (ReadFile(out_read, &buffer, 4096, &byte, NULL)) {
                if (bytes == 0) {
                    bytes = bytes + byte;
                    check(bytes > sizeof(output))
                    strcpy(output, buffer);
                    ZeroMemory(&buffer, sizeof(buffer));
                } else {
                    bytes = bytes + byte;
                    check(bytes > sizeof(output))
                    strcat(output, buffer);
                    ZeroMemory(&buffer, sizeof(buffer));
                }
            };

            CloseHandle(in_read);
            CloseHandle(in_write);
            CloseHandle(out_read);
            free(cmd);

            return 1;

        error:
            free(cmd);

            return -1;
    }

CreateProcess
启动一个独立于您的流程运行的全新流程

如果您使独立进程更改其自己的当前工作目录,那么它将仅在新进程中更改,而不会在运行程序的进程中更改