我正在编写一个导出类似于send和的接口的模块recv.
由于这些函数应该分别返回发送和接收字节的数量,因此我无法正常进行错误管理(即使用枚举和返回助记符值).
在这样的情况下,我应该设置errno为标准库吗?如果是这样,因为errno是特定于线程的,是否有特定的写入方式,或者我可以简单地为其赋值?
编辑:试验它我发现errno通过作业进行设置是有效的.仍然:这对任何系统都是安全和便携的吗?
如果您正在编写一个使用系统/库调用的多线程应用程序,它使用errno来指示错误类型,那么使用errno是否有安全的方法?如果没有,是否有其他方法来指示发生的错误类型而不仅仅是发生了错误?
我无法理解c ++中的errno库是为了什么?在其中设置了哪些类型的错误,如何知道哪个数字代表哪个错误?
它会影响程序执行吗?
通常你有一个函数,对于给定的参数,它不能生成有效的结果,或者它不能执行某些任务.除了在C/C++世界中不常用的例外之外,基本上有两个学校报告无效结果.
第一种方法将有效返回与不属于函数的codomain的值(通常为-1)混合并指示错误
int foo(int arg) {
if (everything fine)
return some_value;
return -1; //on failure
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是返回函数状态并将结果传递给引用
bool foo(int arg, int & result) {
if (everything fine) {
result = some_value;
return true;
}
return false; //on failure
}
Run Code Online (Sandbox Code Playgroud)
您更喜欢哪种方式?为什么?第二种方法中的附加参数是否会带来显着的性能开销?
我是否需要在编译期间添加_REENTRANT宏以使我的errno线程安全?
如果不是,所有版本的gcc/linux/solaris都是这种情况,还是某些旧版本需要它?
我最近测试了一段没有使用_REENTRANT的代码,并发现errno在多线程环境中的未定义fahsion中运行?但是,在添加_REENTRANT后,一切正常.环境是Solaris.
但是,这里的讨论似乎并没有说必须添加_REENTRANT.我有点困惑.
另外,除了_REENTRANT之外,我应该添加任何其他选项或库以确保我的应用程序具有线程安全错误吗?
我一直在尝试将char数组正确转换为long strtol,检查是否存在溢出或下溢,然后对long进行int转换.一路上,我注意到很多代码看起来像这样
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
为什么你不能只说
if(errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果发生下溢或溢出,则在两种情况下都将errno设置为ERANGE.前者真的有必要吗?可以单独检查ERANGE是否有问题?
这就是我的代码现在的样子
char *endPtr;
errno = 0;
long result = strtol(str, &endPtr, 10);
if(errno == ERANGE)
{
// Handle Error
}
else if(result > INT_MAX || result < INT_MIN)
{
// Handle Error
}
else if(endPtr == str || *endPtr != '\0')
{
// Handle Error
}
num = …Run Code Online (Sandbox Code Playgroud) 我知道如何将字符串转换为int,float ...永远不是一个新问题.经过一些文章后,我被建议使用strtol,strtoll,strtod,所以我仔细研究了这些功能.
虽然strtol在其手册页中声称线程安全,但它会修改errno,所以它真的线程安全吗?
如果没有,那么用C++(而不是C++ 11)转换作业并保持线程安全的正确方法是什么?
作为一名 C 程序员,我对异常没有太多经验。我更习惯于errno作为跨多个函数调用传达错误的一种方式。话虽如此,我没有看到异常的显着特征,所以......
异常和使用之间的根本区别是什么errno?
errno在调用函数之前我们需要重置为零吗?见下面的代码.现在场景是a_dest_path现有目录.但是当我执行代码时,它总是尝试mkdir但返回错误表示无法创建目录,因为它存在.在GDB中,我errn在调用之前检查o opendir()并且errno是2.并且errno在调用期间似乎没有设置为零opendir().所以我需要errno在呼叫前重置为零opendir()吗?
errno可以在system()通话中更改,然后在我的else if分支中我检查结果system()但不是opendir().那么之后opendir(),我需要分配errno一个变量然后在if..elseif..else分支中检查这个变量吗?
DIR *dp = opendir(a_dest_path.c_str());
if (errno == ENOENT) {
string mkdir_comman = "mkdir " + a_dest_path;
system(mkdir_command.c_str());
} else if (errno == ENOTDIR) {
printf("Destination %s exists but is not directory\n", a_dest_path.c_str());
return k_error_not_directory;
} else if (errno == 0) {
closedir(dp);
}
Run Code Online (Sandbox Code Playgroud) 作为家庭作业,我必须编写一个仅使用malloc和free函数更改数组大小的函数。
我知道如何使用它realloc,但是我不知道如何使用它malloc。
typedef struct{
int *tab;
int size;
}arr;
Run Code Online (Sandbox Code Playgroud)
我需要编写以下函数:
void changeSizeDyn(arr *Dyn_arr, int size){
//
}
Run Code Online (Sandbox Code Playgroud)
如作业中所述:它只需要重新分配一次,并且只需要释放一个内存,并且只需要复制旧数组中的元素的一个副本即可。我搜索了很多,但仅使用找到了结果realloc。
不使用它甚至可以做到realloc吗?