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