【问题标题】:Pid from fork not 0 or less than 0 (minix)来自 fork 的 Pid 不为 0 或小于 0(minix)
【发布时间】:2014-12-26 19:13:03
【问题描述】:

我正在编写一个 C 程序,我需要在代码中间复制一些目录。所以我写了这个函数,我尝试使用fork然后execvp。但是这段代码似乎没有输入pid==0,并且也不小于0。有什么问题?如果这很重要,我正在使用 minix

    void execCopy() {
    printf("I'm in execCopy\n");
    printf("ERROR 0: %s\n",strerror(errno));


    int pid = fork();

    if(pid < 0) {
        printf ("fork failed with error code= %d\n", pid);
        fprintf(stderr,"FORK error\n");
    }

    printf("ERROR 1: %s\n",strerror(errno));

    char *execArgs[] = { "cpdir", "-R", copy_path,paste_path, NULL };

    printf("Copy from %s to %s\n",copy_path,paste_path);

    if(pid == 0) {

        printf("I'm gonna exec\n");
        execvp("cpdir", execArgs);
        printf("I should never get here \n");

    }

    else {
        printf("I'm the father, going to return\n");
        printf("ERROR 2: %s\n",strerror(errno));

        return;
    }
}

输出

Dec 26 20:34:11 192 kernel: I'm in execCopy
Dec 26 20:34:11 192 kernel: ERROR 0: Not a directory
Dec 26 20:34:11 192 kernel: ERROR 1: Not a directory
Dec 26 20:34:11 192 kernel: Copy from /./home to /./home/lcom
Dec 26 20:34:11 192 kernel: I'm the father, going to return
Dec 26 20:34:11 192 kernel: ERROR 2: Not a directory

【问题讨论】:

  • 为什么你调用 strerror(errno) 却不改变 errno 的值
  • 当您进入时,errno 已经设置为 ENOTDIR,这从一开始就不是好兆头。
  • 你试过printf("PID: %d\n", pid);吗?特别注意\n 的使用,它输出刚刚组装的行。因此将导致更好的可读输出在没有fflush()的情况下输出。
  • @WhozCraig 我知道,但老实说我不知道​​这是从哪里来的。但是它可能与这个问题特别有关吗?感谢您的帮助
  • @glglgl 嗨,pid 是 756,我再一次看不到孩子的任何输出。感谢您的帮助

标签: c move execvp minix


【解决方案1】:

输出缓冲可能会吞噬子进程的输出。在执行之前尝试fflush(stdout)

编辑:在 fork 之后,您应该看到两个 ERROR 1 和两个 Copy from 行。您没有看到任何子进程输出。

【讨论】:

  • 我试图在 "printf("I'm going exec\n");" 之前刷新正如你所解释的,但我仍然没有看到任何输出......我误解了在哪里写那行吗?还有什么方法可以验证 exec 是否正确执行?因为没有复制任何东西。感谢您的努力
  • 在每次打印结束时也使用 \n 应该可以完成这项工作,不需要冲洗,对吗?我在每个 printf 的末尾添加了 \n 并且在 fork 之后仍然只有 1 个进程
  • 在“复制自”printf 之后(如果在 pid == 0 之前)尝试 fflush。是的,stdout 传统上是行缓冲的,但 minix 可能会有所不同。要检查分叉本身是否有效,请在分叉后插入write(1, "forked\n", 7)。它应该打印两次(父+子)。
猜你喜欢
  • 2017-02-14
  • 2023-04-02
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多