sys_err和perror有什么区别
时间: 2023-12-30 20:05:07 浏览: 38
`sys_errlist` 和 `perror` 都用于处理错误信息,但是它们的用法略有不同。
`sys_errlist` 是一个字符串数组,包含了所有可能的系统错误信息。它的使用方法是,当系统调用返回一个错误码时,可以通过错误码来索引 `sys_errlist` 数组,从而得到对应的错误信息。
例如:
```c
#include <stdio.h>
#include <errno.h>
int main() {
FILE* f = fopen("nonexistentfile.txt", "r");
if (f == NULL) {
printf("Error: %s\n", sys_errlist[errno]);
}
return 0;
}
```
`perror` 则可以将 `errno` 的值和对应的错误信息打印到标准错误流中。使用方法是:
```c
#include <stdio.h>
#include <errno.h>
int main() {
FILE* f = fopen("nonexistentfile.txt", "r");
if (f == NULL) {
perror("Error");
}
return 0;
}
```
这段代码会输出类似于 "Error: No such file or directory" 的错误信息。`perror` 函数会自动在错误信息后面加上一个换行符。
相关问题
怎么确定确定err_sys的定义
"err_sys"是一个自定义的错误处理函数(error handling function),通常用于在程序发生错误时打印错误信息并退出程序。这个函数的定义通常由程序员根据自己的需要来编写。
一般情况下,"err_sys"的定义应该包含以下内容:
1. 打印错误信息(例如使用stderr输出错误信息);
2. 打印系统错误信息(例如使用strerror或perror函数);
3. 退出程序(例如使用exit函数)。
以下是一个简单的示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
void err_sys(const char *msg) {
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(EXIT_FAILURE);
}
```
在这个示例中,err_sys函数接受一个字符串作为参数,该字符串是错误信息的描述。函数使用fprintf将该字符串和系统错误信息输出到stderr流中,并使用exit函数退出程序。注意,strerror函数用于将errno值转换为人可读的错误信息。
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <linux/socket.h> //#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <errno.h> void handle_tcp_client(int connfd); /* struct sockaddr_in { sa_family_t sin_family; // 指定协议族 u_int16_t sin_port; //端口号 struct in_addr sin_addr; //ip地址 char sin_zero[8]; //填充8个字节,为了和其他协议族地址结构体大小一样。 }; struct in_addr { in_addr_t s_addr; }; typedef u_int32_t in_addr_t; */ int create_socket(short port, char *ipstr) { int ret; //1. 创建一个套接字 int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("socket error"); return -1; } // 2. 指定本机的ip地址: ip + port struct sockaddr_in local; local.sin_family = AF_INET; //指定协议族 local.sin_port = htons(port); //指定端口号 local.sin_addr.s_addr = inet_addr(ipstr); //指定ip地址 ret = bind(sock, (struct sockaddr *)&local, sizeof(local)); if (ret == -1) { perror("bind error"); goto err_return; } //3. 进入监听模式: ret = listen(sock, 10); if (ret == -1) { perror("listen error"); goto err_return; } return sock; //返回一个创建的(已经准备好)的监听套接字 err_return: close(sock); return -1; } // tcp_server port ip_str int main(int argc, char *argv[]) { int sock; sock = create_socket( atoi(argv[1]), argv[2]); if (sock == -1) { printf("failed to create_socket\n"); return -1; } while (1) { struct sockaddr_in client; socklen_t len = sizeof(client); int connfd = accept(sock, (struct sockaddr*)&client, &len); if (connfd == -1) { perror("accept error:"); continue; } // 打印一下新连接的客户端的地址信息 //printf("%s port %d new connection established\n", // inet_ntoa(client.sin_addr), ntohs(client.sin_port) ); pid_t pid = fork(); if (pid == 0) { handle_tcp_client(connfd); exit(0); } else if (pid > 0) { close(connfd); } else { close(connfd); perror("fork error"); continue; } } }
这是一个使用C语言编写的TCP服务器程序。它实现了创建套接字、绑定端口、监听连接、接受客户端连接等功能。
在代码中,`create_socket`函数用于创建套接字并进行初始化。它接受一个端口号和一个IP地址字符串作为参数。函数首先调用`socket`函数创建一个套接字,然后使用`bind`函数将套接字和指定的IP地址和端口号绑定在一起。最后,调用`listen`函数使套接字进入监听模式。
`main`函数中,首先调用`create_socket`函数创建套接字。然后使用一个无限循环接受客户端连接。在每次循环中,调用`accept`函数等待客户端连接,并创建一个新的子进程来处理客户端请求。父进程关闭已连接的套接字,并继续等待下一个客户端连接。
子进程调用`handle_tcp_client`函数来处理客户端请求。你可以在该函数中实现你自己的业务逻辑。在示例代码中,子进程简单地关闭已连接的套接字并退出。
请注意,示例代码中使用了一些系统头文件和库函数,例如`<sys/types.h>`、`<sys/socket.h>`、`<netinet/in.h>`等。这些头文件和函数提供了与套接字编程相关的功能。如果你想进一步了解这些头文件和函数的具体用法,请参考相关文档或网络资源。