来自fork的Pid不为0或小于0(minix) 我正在编写一个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; } }

来自fork的Pid不为0或小于0(minix) 我正在编写一个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; } },c,move,execvp,minix,C,Move,Execvp,Minix,输出缓冲可能会吞噬子进程的输出。在执行之前尝试fflush(stdout) 编辑:在fork之后,您应该看到两个ERROR 1和两个Copy from行。您没有看到任何子进程输出。为什么调用strerror(errno)而不允许更改errno的值errno在您输入时已设置为ENOTDIR,这从一开始就不是好兆头。您是否尝试过printf(“PID:%d\n”,PID)?特别注意\n的使用,它输出刚刚组装好的行。这样就可以产生更好的可读性输出,并且在没有fflush()@WhozCraig的情况下

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


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

为什么调用strerror(errno)而不允许更改errno的值
errno
在您输入时已设置为
ENOTDIR
,这从一开始就不是好兆头。您是否尝试过
printf(“PID:%d\n”,PID)?特别注意
\n
的使用,它输出刚刚组装好的行。这样就可以产生更好的可读性输出,并且在没有
fflush()
@WhozCraig的情况下输出,但我真的不知道这是从哪里来的。但这是否特别与这个问题有关?谢谢你的帮助help@glglgl嗨,pid是756,我再一次看不到孩子的任何输出。谢谢你的帮助,我试着在“printf(“我要执行”\n”);”之前刷新,正如你解释的,但我仍然没有看到任何输出…我是否误解了在哪里写这行?还有什么方法可以验证exec是否正确执行?因为根本没有复制。感谢您的努力。在每次打印结束时使用\n也可以完成工作,无需冲洗,对吗?我在每个printf的末尾添加了\n,但在fork之后仍然只得到1个进程。请在printf的“Copy from”之后尝试fflush(在pid==0 if之前)。是的,stdout传统上是行缓冲的,但是minix可能会有所不同。要检查fork本身是否工作,请在fork后面插入一个
write(1,“forked\n”,7)
。它应该打印两次(父级+子级)。
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