所以基本上我的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