【问题标题】:dup2 causes program to haltdup2 导致程序停止
【发布时间】:2015-02-07 04:51:03
【问题描述】:
int shell (int argc, char *argv[]) {
  char *s = malloc(INPUT_STRING_SIZE+1);            /* user input string */
  tok_t *t;         /* tokens parsed from input */
  int lineNum = 0;
  int fundex = -1;
  pid_t pid = getpid();     /* get current processes PID */
  pid_t ppid = getppid();   /* get parents PID */
  pid_t cpid, tcpid, cpgid;

  init_shell();

  printf("%s running as PID %d under %d\n",argv[0],pid,ppid);

  lineNum=0;

  const int BUF_SIZE = 200;
  char buf[BUF_SIZE];
  getcwd(buf, BUF_SIZE);

  fprintf(stdout, "%d %s: ", lineNum++, buf);
  while ((s = freadln(stdin))){
    char *ptrA, *ptrB;
    ptrA = strstr(s, "<");
    ptrB = strstr(s, ">");
    if (ptrA) {
      *ptrA = '\0';
      ptrA++;
    }
    if (ptrB) {
      *ptrB = '\0';
      ptrB++;
    }
    if (ptrA && ptrB) {

    } else if (ptrA) {

    } else if (ptrB) {
      size_t ln = strlen(ptrB) - 1;
      if (ptrB[ln] == '\n') // get rid of the trailing newline
          ptrB[ln] = '\0';
      int newfd;  /* new file descriptor */
      if ((newfd = open(ptrB, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR|S_IXUSR)) < 0) {
        perror("Can't open outfile file\n");  /* open failed */
        exit(1);
      }
      printf("newfd: %d\n", newfd);
      dup2(newfd, 1);
      printf("Here\n");
    }
    printf("%s\n", s);
    t = getToks(s); /* break the line into tokens */
    fundex = lookup(t[0]); /* Is first token a shell literal */
    if(fundex >= 0) {
      cmd_table[fundex].fun(&t[1]);
    } else {
      char *bin;
      if (get_binary(t[0], &bin) == 0) {
        t[0] = bin;
      }
      pid_t child_pid = fork();
      int exit_code;
      if (child_pid == 0) {
        execv(t[0], &t[0]);
      } else {
        wait(&exit_code);
      }
    }
    getcwd(buf, BUF_SIZE);
    fprintf(stdout, "%d %s: ", lineNum++, buf);
  }
  return 0;
}

我用wc shell.c&gt;test 测试了我的shell,结果是我在终端上得到一个空行,就好像它在等待我的输入一样。当我按 Enter 时,它会出现段错误。如果我注释掉 dup2 行,shell 就可以完美运行(当然,没有重定向)。如果有帮助,我正在使用 Cygwin 的 Windows 上。

【问题讨论】:

  • 你的exec系统调用在哪里?
  • 我相信我把 dup 放在了错误的地方。我将它移到了 execv 调用之前,现在我没有遇到段错误。但输出仍然打印到终端。
  • 没关系。现在可以了。

标签: c shell io


【解决方案1】:

我的 dup 放错地方了。我需要在我分叉之后复制,但在我执行之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多