此篇文不会阐述具体的原理,而是只记录实际应用如何避免一些问题
- 在《C语言程序设计-现代方法》第9.5章节中有这样一段说明,
return
语句和exit
函数之间的差异是:不管哪个函数调用exit
函数都会导致程序终止,return
语句仅当由main函数调用时才会导致程序终止。
- 更为抽象的解释,
exit
函数是程序退出,无论在什么函数中调用都会退出,程序退出时,对相应的资源如文件描述符,缓冲区等进行回收,假如main
函数调用了一个函数get_number()
,在get_numbe
中使用了return
语句,则程序从get_number
中返回到main
中继续执行,但是如果在get_number
中调用exit
,则程序会终止退出。所以在main
中使用exit
和return
,由于只有一层函数调用。看上去的效果是一样的
- 有这样一个错误处理函数,如果其他函数中要求成功返回0,错误返回-1,此时调用该函数后将会退出程序
/**
* error_handling - 错误处理,直接将错误信息发送到stderr
* @message: 错误提示信息
*/
void error_handling(const char *message)
{
if (errno) {
perror(message);
} else {
printf("ERROR: %s
", message);
}
exit(EXIT_FAILURE);
}
- 调用
/**
* ftp_serve_start_data_conn - 创建到客户机的一条数据连接
* @sock_control: 接收端套接字描述符
*
* Return: 成功返回数据连接的套接字,失败返回 -1
*/
int ftp_serve_start_data_conn(int sock_control)
{
char buf[1024];
int wait, sock_data;
/* 接收数据 */
if (0 > recv(sock_control, &wait, sizeof(wait), 0))
{
error_handling("Error while waiting");
}
/* .... ... */
- 正确的处理方式
if (0 > recv(sock_control, &wait, sizeof(wait), 0))
{
perror("Error while waiting");
return -1
}