【问题标题】:Will EXECVP system call supports IO redirectionsEXECVP系统调用是否支持IO重定向
【发布时间】:2021-11-05 11:56:53
【问题描述】:

EXECVP系统调用是否支持IO重定向

这意味着这是给期望的输出

char *args[]={"cat","A.txt","B.txt",">","C.txt",NULL};
execvp(args[0],args);

我的意思是A.txt和B.txt中的数据会转到C.txt

如果没有,为什么?

UPD:我在评论中提出了两个疑问,请澄清

【问题讨论】:

  • 没有。因为重定向是 SHELL 的一个特性; execvp 只是启动一个PROCESS。
  • 您可以调用 shell 进行重定向:char *args[] = {"/bin/sh", "-c", "cat A.txt B.txt > C.txt", NULL }; execv(args[0], args);
  • @paulsm4,minor nitpick:execvp 不会启动新进程,而是替换当前进程映像。否则,是的,你是对的。
  • execvp 将使用参数cat、A.txt、B.txt、> 和C.txt。 > 不会被视为重定向。但是 execvp 将支持重定向,因为进程保留其打开的文件描述符(除非它们在 exec 上被标记为关闭),因此您可以随意重定向它们并且重定向将被保留。
  • @HAL9000:我只是想向用户解释一下“exec()”和朋友们有 NOTHING 直接与“I/O 重定向”有关,而没有得到太多“过于复杂”。我实际上用谷歌搜索了一个教程,但没有找到我喜欢的任何东西。您在下面的回答是优秀。

标签: c execvp


【解决方案1】:

从技术上讲,这不是您问题的答案,已在 cmets 中回答。但是解释如何使用execvp进行重定向

当使用execvp 启动一个新程序时,它将继承当前的文件描述符。因此,如果您设置文件描述符 1(用于标准输出) 在调用execvp 之前重定向到“C.txt”,新程序将 写入“C.txt”:

// Open "C.txt" for writing, creating it if it doesn't exist, or
// clearing its content if it does exist.
// `mode` should be set as appropriate 
//
int fd = creat("C.txt", mode);
if (fd == -1)
{
   // Swap out error handling to suit your needs
   perror("open failed");
   exit(EXIT_FAILURE);
}

// We want new process to have "C.txt" on file descriptor 1
if (dup2(fd, 1) == -1)
{
   perror("dup failed");
   exit(EXIT_FAILURE);
}


// "C.txt" is now writable on file descriptor 1, so we don't need the
// old one. Actually, the old one could confuse the new executable.
close(fd);


// We can now execute new program. It will inherit current open 
// file descriptors and it will see "C.txt" on file descriptor 1
char *args[]={"cat","A.txt","B.txt",NULL};
execvp(args[0],args);

// If we reach this point, `execvp` failed.
perror("execvp failed");
exit(EXIT_FAILURE);

【讨论】:

  • @sanath kumar:如果您觉得有帮助,请“点赞”和“接受”此回复。如果您还有其他问题,请回复。
  • 我在上面的例子中遗漏了fork 部分。通常在使用exec 系列函数时,会涉及到fork。可以在fork 之前调用creat(或open)以更好地处理错误。 dup2 在子进程中自然必须在fork 之后,否则我们会在父进程中重定向stdout。
  • 没有必要进入fork(),它启用了“并发”。重要的部分是dup2() 和close()。哪些是用于实际实现 I/O 重定向的标准 C 库调用(例如“>”)。当用户键入“>”时,shell(例如/bin/sh、/bin/bash等)执行“dup2()”和“close()”来实现重定向。再次 - 干得好!我希望它对 OP 有所帮助。
  • @HAL9000 : 如果执行成功,execvp 会退出吗?我的意思是我没有得到这条线://如果我们到达这一点,execvp 失败。
  • @sanathkumar, execvp 不会自行“退出”,但新程序可能会。当(成功)调用execvp 时会发生什么,当前进程中的程序被新程序“替换”。新程序从旧程序中接管了很多东西,包括文件描述符、进程 ID 和权限,但不包括程序代码和数据。旧程序从内存中“删除”。它不会“退出”,这意味着将值返回给等待进程。任何等待旧程序退出的进程,都会一直等待新程序退出,不知道有什么区别
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2012-05-24
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多