簡體   English   中英

調用execvp()內部的重定向無法正常工作

[英]Redirection inside call to execvp() not working

我一直在實現一個使用execvp()執行給定命令的小程序。 不使用重定向時它工作正常,但是當我運行如下命令時:

cat file1.txt > redirected.txt

cat輸出以下錯誤消息並失敗:

cat: >: No such file or directory
cat: redirected.txt: No such file or directory

我已經做了一些挖掘,我開始認為也許execvp()不允許進行重定向,因為它不在shell中運行。 這是否意味着我必須在重定向發生時手動選擇並在fork / exec代碼中使用管道來解決這個限制? 有沒有比使用execvp()更好的方法?

謝謝!

您的“執行給定命令的小程序”本質上是一個shell。 由於您正在編寫shell,因此您可以使用所需的任何語法實現重定向。 >重定向運算符不是內核的一個特性,它是一個shell特性。

要實現sh樣式重定向,必須解析命令,找到重定向運算符,打開文件並將它們分配給輸入/輸出描述符。 這必須調用execvp 之前完成。 查找dup2系統調用。

如果您真的想使用那種語法,可以使用system()。 正如您所指出的,重定向和通配符擴展以及一大堆其他內容由類Unix系統上的shell處理。

使用fork執行此操作的方法如下所示:

int kidpid;
int fd = open("redirected.txt", O_WRONLY|O_TRUNC|O_CREAT, 0644);
if (fd < 0) { perror("open"); abort(); }
switch (kidpid = fork()) {
  case -1: perror("fork"); abort();
  case 0:
    if (dup2(fd, 1) < 0) { perror("dup2"); abort(); }
    close(fd);
    execvp(cmd, args); perror("execvp"); abort();
  default:
    close(fd);
    /* do whatever the parent wants to do. */
}

看起來最簡單的事情是:

execlp( "/bin/sh", "/bin/sh", "-c", "cat file1.txt > redirected.txt", (char *)NULL );

你可以用execvp做同樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM