3

次のスニペットでは、lsコマンドの出力を入力にリダイレクトしていますが、これは完全に機能します。次のコードを使用して、コマンドの出力を「beejoutput.txt」という名前のファイルwc -lにリダイレクトしたいのですが、機能しません。ls助けが必要。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
  int pfds[2];
  pipe(pfds);
  if (!fork())
  {
    dup2(pfds[1],1);
    close(pfds[0]); 
    execlp("ls", "ls",NULL);
  }
  else
  {
    FILE *outputO=fopen ("beejoutput.txt", "w"); //opening file for writing

    dup2(pfds[0],0);
    dup2(fileno(outputO),pfds[0]); 
    close(pfds[1]); 
    execlp("wc", "wc","-l", NULL);
  }

  return 0;
}
4

3 に答える 3

1

このdup関数はファイル記述子を複製します。つまり、古いファイル記述子と新しいファイル記述子の両方が、後で同じ開いているファイルを参照します。これは、単一のファイル記述子が2つの異なるファイルを同時に参照することとは異なります。

同じデータを2つの異なる宛先に送信する場合は、両方のコマンドを別々のプロセスで生成して自分でコピーするか、「tee」コマンドのコピーを生成する必要があります。どちらの場合も、最終的に3つのプロセスになります。 。

于 2011-05-11T10:40:44.183 に答える
1

これは私のために働いた:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int pfds[2];
    pipe(pfds);

    pid_t childpid = fork();

    if (childpid == 0) {
        /* Child */
        dup2(pfds[1],1);
        close(pfds[0]); 

        execlp("ls", "ls",NULL);

    } else {
        /* Parent */

        pid_t retpid;
        int  child_stat;
        while ((retpid = waitpid(childpid, &child_stat, 0)) != childpid && retpid != (pid_t) -1)
            ;

        close(pfds[1]); 

        char buf[100];
        ssize_t bytesread;

        int fd = open("beejoutput.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (fd == -1) {
            fprintf(stderr, "Opening of beejoutput.txt failed!\n");
            exit(1);
        }

        /* This part writes to beejoutput.txt */
        while ((bytesread = read(pfds[0], buf, 100)) > 0) {
            write(fd, buf, bytesread);
        }

        lseek(fd, (off_t) 0, SEEK_SET);
        dup2(fd, 0);
        execlp("wc", "wc", "-l", NULL);
    }

    return 0;
}
于 2011-05-11T11:41:27.807 に答える
0

実行するすべてのシステム コール (dup2 を含む) の結果コードを確認してみてください。これにより、答えが導き出される可能性があります。とにかく、これは良い習慣です。

于 2011-05-11T10:54:04.637 に答える