Io-Redirection

如何在 C 程序中將 STDOUT 重定向到 STDIN

  • January 7, 2021

假設我想編寫一個執行相同命令的 C 程序: ls -l | wc -l

以下是一種嘗試:

int main(){
   int fd;
   char *buffer[] = {"ls", "-l", (char *) NULL};
   char *buffer1[] = {"wc", "-l",(char *) NULL};
   if(fork() == 0){
       // I make the STDOUT_FILENO and fd equivalent
       if((fd = dup(STDOUT_FILENO)) == -1){
           perror("error");
           exit(EXIT_FAILURE);
       }
       close(fd);
       if(fork() == 0)
           execvp(buffer[0], buffer);
       // then I make fd and STDIN_FILENO equivalent in order to put the output of the previous command
       // as the input of the second command
       if(dup2(fd, STDIN_FILENO) == -1){
           perror("error");
           exit(EXIT_FAILURE);
       }
       execvp(buffer1[0], buffer1);
   }

   exit(EXIT_SUCCESS);
}

但它只是執行ls -l而不將其輸出提供給wc -l

您必須在兩個程序之間創建一個管道。(這也是|在命令行上使用時會發生的情況。)

有很多例子可以做到這一點,例如這裡

基本上,您通過呼叫來創建管道pipe(),然後每個程序關閉管道的一端。

引用自:https://unix.stackexchange.com/questions/628024