c++ fork execl 执行 重定向

这段C代码展示了如何在子进程中使用fork()创建子进程,关闭标准IO流,重定向ls命令的输出到output.txt文件。父进程等待子进程结束后返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <unistd.h>
 
int main() {
    pid_t childPid = fork(); // 创建子进程
    
    if (childPid == 0) {
        // 子进程
        
        // 关闭标准输入、输出和错误流
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        
        // 打开要写入的文件
        int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
        
        // 设置新的标准输出为指定文件
        dup2(fd, STDOUT_FILENO);
        
        // 执行需要重定向的命令
        execlp("/bin/ls", "ls", "-la", NULL);
        
        // 若上面的execlp调用失败,则会返回-1,可以根据需求处理该情况
    } else if (childPid > 0) {
        // 父进程等待子进程完成
        waitpid(childPid, nullptr, 0);
    } else {
        // fork失败时的处理
        perror("fork");
        return 1;
    }
    
    return 0;
}

这段代码首先创建了一个子进程,然后在子进程中关闭了标准输入、输出和错误流,接着打开了名为output.txt的文件,并将其作为新的标准输出(stdout)。最后,通过execlp函数执行了"/bin/ls -la"命令,并将结果重定向到output.txt文件中。

### C++ 中 `fork` 函数的使用方法 #### 创建子进程并等待其结束 当在 Linux 或类 Unix 系统下编写多进程程序时,可以利用 `fork()` 来创建新进程。下面展示了一个简单的例子,其中父进程会等待子进程完成: ```cpp #include <iostream> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid; // 调用 fork 创建子进程 pid = fork(); if (pid > 0) { // 如果是正数,则表示当前为父进程 std::cout << "Parent process\n"; // 父进程调用 wait 阻塞直到子进程终止 wait(nullptr); return 0; } // 子进程中执行此段代码 std::cout << "Child process\n"; return 0; } ``` 上述代码展示了如何在一个简单场景中应用 `fork()` 和 `wait()` 函数[^1]。 #### 关于 `fork` 的工作原理 每当调用了 `fork()` 后,操作系统就会复制现有进程(称为父进程),从而形成一个新的独立副本(称为子进程)。两个进程几乎完全相同,除了它们各自的 PID 不同之外;另外,`fork()` 返回给这两个进程的结果也不一样:对于父进程来说返回的是新的子进程 ID,而对于子进程则总是返回零[^3]。 #### 进程间的内存分配与栈管理 值得注意的是,尽管子进程看起来像是原进程的一个精确拷贝,但实际上两者拥有各自独立的地址空间。这意味着即使某些数据结构看似一致,实际上每个进程都有自己的一份私有副本。特别是关于函数调用期间使用的堆栈,每次发生函数调用时都会在其对应的进程中压入相应的栈帧,而不会影响另一个进程的状态[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值