c - 在命令功能中保留状态

标签 c command

我创建了一个函数,您可以在其中获取命令的输出。它可以工作,但不会保留上一个命令的状态,例如,如果您更改目录(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 启动一个独立于您的进程运行的全新进程。

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

关于c - 在命令功能中保留状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59393663/

相关文章:

C - Strtok() ,将字符串拆分为 '\n' 但保留分隔符

python - Tkinter 菜单命令目标函数带参数?

command - 为什么 "-n"通常用于试运行?

command-line - 无法杀死在端口 80 上运行的任何进程

ruby - 如何创建支持 Ruby 的 shell 命令?

c - 这些奇怪的问号是什么意思?

c - C 中的范围值

我可以将字符串存储在长度为1的char数组中吗

java - 在Blackberry中集成C和JAVA

带偏移量的 Linux 头/尾