","1.txt",(char *)NULL);-6ren">
gpt4 book ai didi

c - 如何将 execlp() 与重定向输出一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:07 25 4
gpt4 key购买 nike

我尝试在 Unix 环境下使用 execlp 函数编写 c 程序。

命令是:

 execlp("tsort","tsort","text.txt",">","1.txt",(char *)NULL);
syserr("execlp");

我总是得到同样的错误。错误是:

tsort: extra operand `>'

我做错了什么?

最佳答案

'>' 不是参数,它通常由 shell 解释。如果要在 C 代码中实现相同的效果,则必须执行 shell 通常执行的相同操作:

  1. 打开一个文件(1.txt)进行写入
  2. fork()一个新进程
  3. [in child] 使用 dup2()
  4. 将新进程的标准输出替换为文件的描述符
  5. [in child] 执行命令

POSIX 的简化示例代码:

#define _POSIX_C_SOURCE 200101L
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
int outfd = open("1.txt", O_CREAT|O_WRONLY|O_TRUNC, 0644);
if (!outfd)
{
perror("open");
return EXIT_FAILURE;
}
pid_t pid = fork();
if (pid < 0)
{
close(outfd);
perror("fork");
return EXIT_FAILURE;
}

if (pid)
{
// child code
dup2(outfd, 1); // replace stdout
close(outfd);

// just a "useless cat" for simplicity:
execlp("cat", "cat", "redir.c", 0);
}
else
{
// parent code
close(outfd);
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) return WEXITSTATUS(status);
else return EXIT_FAILURE;
}
}

根据评论:如果你不介意用被调用的程序替换你的进程,你甚至不需要 fork 并且程序变得很短:

#define _POSIX_C_SOURCE 200101L
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
int outfd = open("1.txt", O_CREAT|O_WRONLY|O_TRUNC, 0644);
if (!outfd)
{
perror("open");
return EXIT_FAILURE;
}
dup2(outfd, 1); // replace stdout
close(outfd);
execlp("cat", "cat", "redir.c", 0);
}

这当然不是交互式 shell 所做的。

关于c - 如何将 execlp() 与重定向输出一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44221222/

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