首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不更改stdin上的缓冲的情况下执行fork-then-execve?

在不更改stdin上的缓冲的情况下执行fork-then-execve的方法是使用文件描述符重定向。具体步骤如下:

  1. 首先,使用pipe()函数创建一个管道,得到两个文件描述符,一个用于读取,一个用于写入。
  2. 然后,使用fork()函数创建一个子进程。
  3. 在子进程中,关闭写入端的文件描述符,并将读取端的文件描述符复制到stdin(文件描述符0)。
  4. 在子进程中,使用execve()函数执行需要的命令。
  5. 在父进程中,关闭读取端的文件描述符,并将需要执行的命令写入写入端的文件描述符。

下面是一个示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    int pipefd[2];
    pid_t pid;

    // 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe");
        return 1;
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    }

    if (pid == 0) {
        // 子进程中
        close(pipefd[1]);  // 关闭写入端的文件描述符
        dup2(pipefd[0], 0);  // 将读取端的文件描述符复制到stdin
        close(pipefd[0]);  // 关闭读取端的文件描述符

        // 执行命令
        char *args[] = {"/bin/sh", "-c", "command", NULL};
        execve(args[0], args, NULL);
        perror("execve");
        return 1;
    } else {
        // 父进程中
        close(pipefd[0]);  // 关闭读取端的文件描述符

        // 写入命令
        char *command = "command\n";
        write(pipefd[1], command, strlen(command));
        close(pipefd[1]);  // 关闭写入端的文件描述符

        // 等待子进程结束
        wait(NULL);
    }

    return 0;
}

这样,就可以在不更改stdin上的缓冲的情况下执行fork-then-execve。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券