命令功能的保存状态

问题描述 投票:0回答:1

我做了一个函数,您可以在其中获得命令的输出。它可以工作,但不会保留前一命令的状态,例如,如果您更改目录(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;
    }
c command
1个回答
1
投票
如果您使该独立进程更改其自己的当前工作目录,那么它将仅在新进程中而不是在运行程序的进程中进行更改。
© www.soinside.com 2019 - 2024. All rights reserved.