所以代码就是这个:
int main ()
{
int pid, fd[2], i, j;
char comanda[1000], comm[100][100], *var, *var2, vect[100][100], text[1000], check[10000];
if(pipe(fd)<0)
{
perror("pipe error");
exit(1);
}
if((pid = fork()) < 0 )
{
perror("fork error");
exit(1);
}
j = 0;
if(pid){
do {
if( j > 0) fgets (check , 1000 , stdin); //just in case there's still something in the buffer
printf("enter command: \n");
scanf("%[^\t\n]", comanda);
if(var = strtok(comanda, " "))
{
i=0;
while(var != NULL)
{
strcpy(vect[i], var);
var = strtok(NULL, " ");
i++;
}
}
else
strcpy(vect[0], comanda);
if(strcmp(vect[0], "login") == 0)
{
write(fd[1], "login ", 6);
write(fd[1], vect[1], strlen(vect[1]));
printf("I got login");
}
else if(strcmp(vect[0], "quit") == 0)
{
exit(1);
}
else
printf("I got the command %s \n", vect[0]);
j++;
} while(1);
close(fd[0]);
close(fd[1]);
wait(NULL);
}
else
{
close(fd[1]);
printf("copil? \n");
int i=0;
read(fd[0], text, sizeof(text));
var2 = strtok(text, " ");
j=0;
while(var2 != NULL)
{
strcpy(comm[j], var2);
var2 = strtok(NULL, " ");
j++;
}
if( strcmp(comm[0], "login") == 0)
{
//comanda e login, deci verificam username-ul.
if(login(comm[1]))
{
printf("OK, Logged IN! \n");
}
else
{
printf("Username not in /etc/passwd \n");
}
}
close(fd[0]);
exit(0);
}
return 0;
}
我想要的是从控制台行读取命令,每次我获得一个已知命令,转到孩子并执行它。现在它读取命令很好,登录工作正常但只有一次。在那之后,它仍然获得登录,它打印“我登录”,但它不会发送给孩子并检查它是否正常。
答案 0 :(得分:2)
我可以看到三个主要问题:
答案 1 :(得分:1)
这是因为您的子进程刚刚退出。似乎首先“读取(fd [0],text,sizeof(text));”阻止它将从父进程接收一些数据。然后它执行数据并退出。
BTW最好调用waitpid函数来避免僵尸进程,这可能是你的应用程序的一些问题。你还应该“关闭(fd [0]);”在父进程的开头不在和'close(fd [1]);“答案 2 :(得分:1)
我遇到了同样的问题。我的想法是通过管道来控制另一个进程,就像它从键盘/ stdin获得输入一样。这是与应用程序进行进程间通信的经典需求,而不是为此而设计的。
问题是,所有示例代码在开始时只运行一次以向子进程stdin发送内容。在我看来,管道必须在父母一侧关闭,以便孩子方接收数据。关闭后,我无法“重新打开”它发送另一个命令。
我今天节省了什么: http://rachid.koucha.free.fr/tech_corner/pty_pdip.html
http://en.wikipedia.org/wiki/Pseudo_terminal
我不知道为什么花了将近两天的时间来弄明白,毕竟听起来真的很明显。我在这里张贴这个,因为我落在这一边,答案并没有真正解决我的问题。
诚恳, 罗伯特