C 函数err_sys()在哪里定义?

C 函数err_sys()在哪里定义?,c,network-programming,C,Network Programming,我收到一个与此代码中的err\u sys()相关的错误: #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd; if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) err_sys("can't create socket"); close(so

我收到一个与此代码中的
err\u sys()
相关的错误:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
    int sockfd;

    if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
        err_sys("can't create socket");

    close(sockfd);
    return 0;
}

函数err_sys()在哪里定义?

您必须指定包含此函数实现的lib文件。
这是编译c代码时常见的问题。

请将此项放在代码顶部:

void err_sys(const char* x) 
{ 
    perror(x); 
    exit(1); 
}
perror在stdio.h中定义

err_sys在Richard Stevens的《UNIX网络编程:套接字网络API》一书中使用。据我所知,这并不常见


编辑:修复了代码错误

这是来自TCP/IP的吗?我记得看到过这一点,附录中给出了定义:

#include <errno.h>
#include <stdarg.h>
/*
 * Print a message and return to caller.
 * Caller specifies "errnoflag".
 */
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
    char    buf[MAXLINE];
    vsnprintf(buf, MAXLINE, fmt, ap);
    if (errnoflag)
        snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
    strerror(error));
    strcat(buf, "\n");
    fflush(stdout);     /* in case stdout and stderr are the same */
    fputs(buf, stderr);
    fflush(NULL);       /* flushes all stdio output streams */
}


/*
 * Fatal error related to a system call.
 * Print a message and terminate.
 */
void
err_sys(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}
#包括
#包括
/*
*打印一条消息并返回给呼叫者。
*调用者指定“errnoflag”。
*/
静态空隙
err_doit(int errnoflag,int error,const char*fmt,va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf、MAXLINE、fmt、ap);
if(errnoflag)
snprintf(buf+strlen(buf),MAXLINE strlen(buf),“:%s”,
strerror(error));
strcat(buf,“\n”);
fflush(stdout);/*如果stdout和stderr相同*/
FPUT(buf、stderr);
fflush(NULL);/*刷新所有stdio输出流*/
}
/*
*与系统调用相关的致命错误。
*打印消息并终止。
*/
无效的
错误系统(常量字符*fmt,…)
{
va_列表ap;
va_启动(ap、fmt);
err_doit(1,errno,fmt,ap);
va_端(ap);
出口(1);
}
err_sys()
是W.Richard Stevens在几本书中使用的函数。此函数用于打印发生的错误类型


该函数用于带有自定义头文件“ourhdr.h”(或其他文件)的文本中的程序。请查看附录中的标题列表或函数定义。

此函数的源代码(来自W.Richard Stevens在UNIX®环境中的高级编程)可以在本书的网站上找到:。

下载本书的源代码文件夹,您可以在:


打开源代码文件夹并选择lib文件夹。接下来打开名为error.c的文件。您将找到其中定义的sys_err()。

正如其他人所说,此代码类似于Stevens的示例:Unix网络编程。如果您有这本书,请在附录D:杂项源代码中查找教科书定义(以及示例中普遍使用的unp.h标题)。这个文件太多了,无法在SO答案中输入,但是在互联网上快速搜索史蒂文斯的“标准错误函数”会返回很多google books的结果和实现。

从来没有听说过
err\u sys
(所以我不知道
getsockopt.cpp
是如何编译的)。改用
perror
strerror
。另外,你真的需要开始接受以前的一些答案。这并不难@托马拉克:它之所以能够编译,可能是因为警告显示得不够高,而且C标准允许您不为函数声明原型。@Oli:ORLY?我不使用C,所以我不知道。太可怕了!(这提醒了我……我当然是指上面的
getsockopt.c
)@Tomalak:的确!形势严峻。例如,请参见此处接受的答案:。当您使用没有实现的函数时,这种情况尤其常见,因为它不存在。为什么不为此使用函数,而不是宏?编写的宏有严重的错误,例如,
if(foo)err_sys(x);否则…
将失败。如果无法编写正确的宏,请使用函数!要将其编写为宏,您需要
#define err_sys(x)do{perror(x);exit(1);}while(0)
。这不会与if(foo)err_sys(x)相冲突;否则…问题。它(
do{…},而(0)
)是一种标准技术。
#include <errno.h>
#include <stdarg.h>
/*
 * Print a message and return to caller.
 * Caller specifies "errnoflag".
 */
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
    char    buf[MAXLINE];
    vsnprintf(buf, MAXLINE, fmt, ap);
    if (errnoflag)
        snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
    strerror(error));
    strcat(buf, "\n");
    fflush(stdout);     /* in case stdout and stderr are the same */
    fputs(buf, stderr);
    fflush(NULL);       /* flushes all stdio output streams */
}


/*
 * Fatal error related to a system call.
 * Print a message and terminate.
 */
void
err_sys(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}