我正在尝试实现类似应用程序的telnet,用户可以远程连接到其他人的计算机。我有服务器和客户端代码,但我觉得我的客户端代码是我错的地方。当用户键入“退出”时,我希望我的客户端退出并返回到我的工作目录,但事实并非如此。它无限期地挂起。所以我只发布一些代码而不是发布整个事情,而且我已经删除了一些错误检查,仅仅是为了提问。
pid_t pid = fork();
switch(pid)
{
case -1:
error("Client: Error in forking.\n");
break;
case 0: // We are in the child process
{
char buffer[BUFFER_SIZE];
int nread;
// Read from the terminal/stdin and write to the socket
while((nread = read(STDIN_FILENO, buffer, BUFFER_SIZE)) > 0)
{
int result = write(sockfd, buffer, nread);
if(result == -1)
{
error("Error while writing to socket\n");
}
} // end while
} // end child
} // end switch
// Parent Read from the socket and write to the terminal/stdout
int nRead;
char buffer[BUFFER_SIZE];
while((nRead = read(sockfd, buffer, 512)) > 0)
{
int result = write(STDOUT_FILENO, buffer, nRead);
if(result == -1)
{
error("Client: Error while writing to stdout from socket.\n");
}
} // end while
kill(pid, SIGKILL);
close(sockfd);
// Wait for child to end before the parent
wait(NULL);
所以基本上是在分叉之后,
我的子进程将执行此操作:从terminal / stdin读取并写入套接字。
我的父母会这样做:从套接字读取并写入终端或标准输出。
问题是当我输入exit时,我希望子进程死掉,因为没有其他东西要写入套接字(因为我想关闭与服务器的连接),但是kill语句永远不会被执行。我之前放了一个printf来检查一下。我觉得kill语句之前的while循环是无限的,如果有的话,该怎么做才能阻止它。