C 读取系统调用
我正在尝试用C语言编写unix套接字程序。但在阅读时,我得到的错误号为4。我无法找到此错误代码的描述。有人知道吗?如果您从查看Unix错误代码名称的最终来源(C 读取系统调用,c,sockets,unix,C,Sockets,Unix,我正在尝试用C语言编写unix套接字程序。但在阅读时,我得到的错误号为4。我无法找到此错误代码的描述。有人知道吗?如果您从查看Unix错误代码名称的最终来源(/usr/include/errno.h)开始,您将得到包含错误代码的文件 #define EINTR 4 /* Interrupted system call */ (作为练习,此文件留给您查找;)如果您想从查看Unix错误代码名称的最终来源开始(/usr/include/errno.h),您将得到包含错
/usr/include/errno.h
)开始,您将得到包含错误代码的文件
#define EINTR 4 /* Interrupted system call */
(作为练习,此文件留给您查找;)如果您想从查看Unix错误代码名称的最终来源开始(
/usr/include/errno.h
),您将得到包含错误代码的文件,如下所示:
#define EINTR 4 /* Interrupted system call */
(作为练习,此文件留给您查找;)对于不同的系统(甚至不同的类Unix系统),
errno
值可能不同,因此应在代码中使用符号常量
perror
函数将(向stderr)打印最后一个errno
值的描述性字符串以及您提供的字符串
man 3 perror
strerror
函数只需将const char*
返回到peror
打印的字符串
如果4在您的系统上是EINTR
,则您在呼叫read时收到一个信号。有一些方法可以防止此操作中断系统调用,但通常您只需要:
while (1) {
ssize_t x = read(file, buf, len);
if (x < 0) {
if (errno == EINTR) {
errno = 0;
continue;
} else {
// it's a real error
while(1){
ssize_t x=读取(文件、buf、len);
if(x<0){
如果(errno==EINTR){
errno=0;
继续;
}否则{
//这是一个真正的错误
对于不同的系统(甚至不同的类Unix系统),errno
值可能不同,因此应在代码中使用符号常量
perror
函数将(向stderr)打印最后一个errno
值的描述性字符串以及您提供的字符串
man 3 perror
strerror
函数只需将const char*
返回到peror
打印的字符串
如果4在您的系统上是EINTR
,则您在呼叫读取时会收到一个信号。有几种方法可以防止它中断您的系统调用,但通常您只需要:
while (1) {
ssize_t x = read(file, buf, len);
if (x < 0) {
if (errno == EINTR) {
errno = 0;
continue;
} else {
// it's a real error
while(1){
ssize_t x=读取(文件、buf、len);
if(x<0){
如果(errno==EINTR){
errno=0;
继续;
}否则{
//这是一个真正的错误
如果您获得的是EINTR
,这可能意味着您安装的信号处理程序不正确。当您只需调用signal
时,好的unices将默认为可重新启动的系统调用,但为了安全起见,您应该使用bsd_signal
功能(如果可用),或者在重新启动时调用sigaction
ble标志为避免EINTR
带来的麻烦,如果您获得EINTR
,可能意味着您安装的信号处理程序不正确。当您只需调用signal
时,好的Unice将默认重新启动系统调用,但为了安全起见,您应该使用bsd\U signal
功能(如果可用)e、 或者使用可重启标志调用sigaction
,以避免EINTR
带来的麻烦