//pseudo code - actual code in c++
Process P1 code:
func handle_close() {
print "close";
}
func sayhello() {
print "hello";
}
func writeonsocketforP2() {
write(fd, somedata, somedata_sz);
}
func WriteToP2() {
count = 0;
while (count++ != 1000000) writeonsocketforP2();
sayhello();
}
考虑以下场景:
- 进程P1(单线程(和P2之间建立的套接字连接
- 循环中的P1从WriteToP2函数向P2的套接字写入大量数据
- P2关闭,而P1仍在写入,并且P1调用了套接字关闭事件和关闭事件处理程序handle_close。。比方说这发生在计数为1000的时候
- 在调用handle_close之后,控制将返回while循环并从计数1001继续while循环吗
- 在WriteToP2中while循环的中间,套接字关闭后会调用sayhello((吗
这就是为什么您需要检查write()
是否返回在套接字上写入的错误代码(假设面向连接的套接字类似于TCP
(。如果在套接字上写入时发生错误(包括闭合的套接字(,则write()
返回-1
。
此外,在您的代码中,直到循环结束,才会调用sayhello()
。通常WriteToP2()
需要另一个线程,除非您可以编写非阻塞代码。