gpt4 book ai didi

c++ - 在Linux中这里有 “CreatePipe”和 “CreateProcessW”函数吗?

转载 作者:行者123 更新时间:2023-12-02 10:35:56 24 4
gpt4 key购买 nike

如何在Linux中使用“CreatePipe”和“CreateProcessW”功能,当我在Linux中编译C++代码时,出现一些错误,如下所示:在此范围内未声明“CreatePipe”。未在此范围内声明“CreateProcessW”。

最佳答案

Posix / Linux:

int pipe(int pipefd[2]);
pipefd[0]指向管道的读取端。 pipefd[1]指向管道的写入端。

特定于Linux:
int pipe2(int pipefd[2], int flags);

关于 CreateProcess,只需几个步骤即可完成Posix / Linux版本。
  • 调用fork()创建一个新进程-仍在运行相同的程序-因此,两个进程现在将从调用fork()的同一点继续运行同一程序。通过检查fork()的返回值(进程ID)来确定是父进程还是子进程。
  • dup pipe返回的文件描述符,使用int dup2(int oldfd, int newfd);替换新过程的stdinstdout
  • 使用exec*函数之一在新进程中执行程序。
    // create pipes here

    if(pid_t pid = fork(); pid == -1) {
    // fork failed

    } else if(pid == 0) { // child process goes here (with a new process id)
    // dup2(...)
    // exec*()

    } else { // parent process goes here
    // do parenting stuff
    }


  • 例:
    #include <unistd.h>
    #include <sys/types.h>

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <stdexcept>

    struct Pipe {
    Pipe() {
    if(pipe(io)) throw std::runtime_error("pipe failure");
    }
    ~Pipe() {
    close_rd();
    close_wr();
    }
    void close_rd() { closer(io[0]); }
    void close_wr() { closer(io[1]); }
    int rd() { return io[0]; }
    int wr() { return io[1]; }

    private:
    void closer(int& fd) {
    if(fd != -1) {
    close(fd);
    fd = -1;
    }
    }
    int io[2];
    };

    int main() {
    Pipe parent_write, parent_read;

    if(pid_t pid = fork(); pid == -1) {
    // fork failed
    return 1;

    } else if(pid == 0) { // child process goes here (with a new process id)
    // close file descriptors we don't need:
    parent_write.close_wr();
    parent_read.close_rd();

    // duplicate into the place where stdin/stdout was
    dup2(parent_write.rd(), fileno(stdin));
    dup2(parent_read.wr(), fileno(stdout));

    // execute a program
    execl("/bin/ls", "/bin/ls", nullptr);
    // exec* functions never returns if successful, so if we get here, it failed:
    std::exit(1);

    } else { // parent process goes here
    std::cout << "child process " << pid << " started\n";
    }

    // close file descriptors we don't need:
    parent_write.close_rd();
    parent_read.close_wr();

    // read data from child process using the file descriptor in parent_read.rd()
    char buf[1024];
    ssize_t rv;
    while((rv = read(parent_read.rd(), buf, 1024))) {
    write(fileno(stdout), buf, static_cast<size_t>(rv));
    }

    // use write(parent_write.wr(), ...) to write to the child.
    }

    关于c++ - 在Linux中这里有 “CreatePipe”和 “CreateProcessW”函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282917/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com