Дочерняя проблема Fork с выводом printf и execv - PullRequest
0 голосов
/ 06 сентября 2018

Так что в основном мой форк-код действительно работает. Я уверен, что проблема в чем-то простом, я просто не вижу этого. По какой-то причине мой 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

...