0

c でシェルを実装しているときにこれを作成しましたが、パイプを実装しているときに、このエラー ls:write error :Bad file descriptor が発生しました。このエラーが発生する理由がわかりません。助けてください。

#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>
void  execute(char **argv)
{
  pid_t  pid;
  int    status;
  //fflush(0); 
  pid_t id  ;
  int out=0,in=0,pip=0;
  int fds[2];

  if ((pid = fork()) < 0) {     /* fork a child process           */
      printf("*** ERROR: forking child process failed\n");
      exit(1);
  }
  if (pid==0) {
    close(1);       /* close normal stdout */
    dup2(fds[1],1);   /* make stdout same as pfds[1] */
    close(fds[0]); /* we don't need this */
    execlp(argv[0],argv[0],argv[1],NULL);
   } 
  else {
     close(0);       /* close normal stdin */
     dup2(fds[0],0);   /* make stdin same as pfds[0] */
     close(fds[1]); /* we don't need this */
     execlp(argv[3],argv[3],argv[4], NULL);
    }


  }
4

1 に答える 1

0

に電話するpipe(fds);前に、への電話がないようfork()です。close()また、いくつかの呼び出しが欠落しています。パイプの一方の端(dup()またはを使用)を標準入力または標準出力に複製する場合は、からの元の記述子を両方dup2()とも閉じる必要があります。pipe()

システムコールからの戻り値を確認する必要があるという強い議論もあります。次のような関数を使用できます。

#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

extern void err_exit(const char *fmt, ...);

void err_exit(const char *fmt, ...)
{
    int errnum = errno;
    va_list args;
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    if (errnum != 0)
        fprintf(stderr, " (%d: %s)", errnum, strerror(errnum));
    fputc('\n', stderr);
    exit(1);
}

次のように使用できます。

if (dup2(fds[2], 1) != 0)
    err_exit("dup2(%d, %d) failed", fds[2], 1);
于 2012-11-17T06:26:42.827 に答える