叉孩子问题与printf输出和execv

时间:2018-09-05 21:40:53

标签: c unix fork execv

所以基本上我的fork代码运行得很糟糕。我确信问题很简单,我只是看不到。由于某种原因,我的fork()并没有完全完成。就像第一个printf不在打印,而第二个printf在注释一样;如果我取消注释,它将打印第一个和第二个printf,但此后似乎什么也不会为孩子打印。 execv进程似乎也没有运行,即使它在某一时刻正在运行。

#include <stdio.h>
#include<unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[]){
char input[200];
char path[]="/bin/";
char str[80];

do{
printf("dash> ");
fgets(input, 200, stdin);
input[strcspn( input, "\n" )] = '\0';
char* token = strtok(input, " ");
// printf("TEST: %s",token);
strcpy(str, path);
strcat(str, token);
// printf("str1: %s", str);
int rc=fork();
if(rc<0){  // fork failed
 printf("Error");
return 0;
}
   else if(rc==0){//child process
    printf("hello toekn is: %s ",token);
   // printf("\nhello, I am child (pid:%d)\n", (int) getpid());
   // char* arr[] = {"ls", NULL};
   // printf("hello, I am child");
   char *myargs[15];
   myargs[0]=token;
   int counter=0;
   printf(token);
   while(myargs[counter] != NULL){
   counter++;
   myargs[counter]=strtok(input, " ");
   printf(myargs[counter]);
   }
   // myargs[1]=token;
    myargs[counter+1]=NULL;

   execv(str,myargs );
   printf("failed");
  }
   else{ //parent process
     int rc_wait=wait(NULL);
     printf("hello, I am parent of %d (rc_wait:%d) (pid:%d)\n", rc, rc_wait, 
  (int) getpid());

 // printf("\nHello %d", rc_wait);
}

 }while(strcmp(input,"exit")!=0);
 return 0;
}

例如,当未注释子级中的第二个printf时,这是输出:

dash> ls
hello toekn is: ls
hello, I am child (pid:33522)
hello, I am parent of 33522 (rc_wait:33522) (pid:33095)
dash>

评论时:

 dash> ls
 hello, I am parent of 4017 (rc_wait:4017) (pid:3377)
 dash>

由于某种原因,您可以看到,因为第一个printf被注释掉了,第二个也未显示。以及子进程的其余部分。

我觉得问题在于子进程没有及时完成,在父进程中等待。 如果有人可以提供帮助,我将不胜感激。谢谢

使用gcc(GCC)4.8.5

0 个答案:

没有答案