fprintf()中的stderr解析

首先在test.c中输入如下的代码

 
  1. void main()

  2.  
  3. {

  4.  
  5. fprintf(stderr,"stderr!");

  6.  
  7. fprintf(stdout,"stdout!");

  8.  
  9. printf("printf!");

  10.  
  11. }

启动cmd,进入到当前目录下(目录从c:到d:方法:cd :d)

上面程序编译成.exe文件,使用命令:cl test.c

直接执行.exe输出stderr!stdout!printf!

 

 

若将输入重定向到一个temp.txt文件中,运行:test>temp.txt 结果如下:

stderr!

查看temp.txt文件内容为:

stdout!printf!

 

 

说明:

stdout -- 标准输出设备(printf("..")) 同 stdout。

stderr -- 标准错误输出设备 两者默认向屏幕输出。

但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

 

 

strerr是作为程序运行过程中的错误显示出来的,若想将它重写向到某文件中,需要运行如下命令:

test 2>temp.txt

这样运行结果就为:

stdout!printf!

查看temp.txt文件的内容是:

stderr!

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <nanomsg/nn.h> #include <nanomsg/reqrep.h> #define SERVER_ADDRESS "tcp://127.0.0.1:5555" // 服务器地址 int main() { int sock = nn_socket(AF_SP, NN_REP); // 创建一个REP类型的socket if (sock < 0) { fprintf(stderr, "nn_socket error: %s\n", nn_strerror(nn_errno())); return -1; } if (nn_bind(sock, SERVER_ADDRESS) < 0) { // 绑定服务器地址 fprintf(stderr, "nn_bind error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server started, waiting for client...\n"); while (1) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); // 接收客户端请求消息 if (bytes < 0) { fprintf(stderr, "nn_recv error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server received: %s\n", buf); if (strcmp(buf, "123") == 0) { // 判断客户端请求消息是否为"123" char *response = "abc"; int response_len = strlen(response) + 1; int bytes = nn_send(sock, response, response_len, 0); // 发送回复消息 if (bytes < 0) { fprintf(stderr, "nn_send error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } } else { printf("invalid request\n"); } nn_freemsg(buf); // 释放接收到的消息内存 } nn_close(sock); // 关闭socket return 0; } 以上是一个服务端代码,客户端发送内容“123”服务器回复“abc”,我想要更改一下,服务端接受到一段json信息为{"module":"1","from":"2","time":"","service":"get_dp_version","args":[]}时,回复客户端一个json为{"module":"2","from":"3","time":"","service":"response_dp_version","data":{"dp_version":"v0.1"}},使用libjansson,拼接json和解析json分别单独放在一个函数里。不要都堆在主函数里
06-03
好的,以下是修改后的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <nanomsg/nn.h> #include <nanomsg/reqrep.h> #include <jansson.h> #define SERVER_ADDRESS "tcp://127.0.0.1:5555" // 服务器地址 json_t *create_response_json() { json_t *root = json_object(); json_object_set_new(root, "module", json_string("2")); json_object_set_new(root, "from", json_string("3")); json_object_set_new(root, "time", json_string("")); json_object_set_new(root, "service", json_string("response_dp_version")); json_t *data = json_object(); json_object_set_new(data, "dp_version", json_string("v0.1")); json_object_set_new(root, "data", data); return root; } int handle_request(const char *request_str, char **response_str) { int ret = -1; json_error_t error; json_t *request = json_loads(request_str, 0, &error); if (!request) { fprintf(stderr, "json_loads error: on line %d: %s\n", error.line, error.text); goto error; } const char *module = json_string_value(json_object_get(request, "module")); const char *from = json_string_value(json_object_get(request, "from")); const char *service = json_string_value(json_object_get(request, "service")); if (!module || !from || !service) { fprintf(stderr, "invalid request\n"); goto error; } if (strcmp(service, "get_dp_version") == 0) { json_t *response = create_response_json(); if (!response) { fprintf(stderr, "create_response_json error\n"); goto error; } *response_str = json_dumps(response, 0); if (!*response_str) { fprintf(stderr, "json_dumps error\n"); goto error; } ret = 0; } else { fprintf(stderr, "invalid service: %s\n", service); } error: if (request) { json_decref(request); } return ret; } int main() { int sock = nn_socket(AF_SP, NN_REP); // 创建一个REP类型的socket if (sock < 0) { fprintf(stderr, "nn_socket error: %s\n", nn_strerror(nn_errno())); return -1; } if (nn_bind(sock, SERVER_ADDRESS) < 0) { // 绑定服务器地址 fprintf(stderr, "nn_bind error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server started, waiting for client...\n"); while (1) { char *buf = NULL; int bytes = nn_recv(sock, &buf, NN_MSG, 0); // 接收客户端请求消息 if (bytes < 0) { fprintf(stderr, "nn_recv error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("server received: %s\n", buf); char *response = NULL; if (handle_request(buf, &response) == 0) { int response_len = strlen(response) + 1; int bytes = nn_send(sock, response, response_len, 0); // 发送回复消息 if (bytes < 0) { fprintf(stderr, "nn_send error: %s\n", nn_strerror(nn_errno())); nn_close(sock); free(response); return -1; } free(response); } nn_freemsg(buf); // 释放接收到的消息内存 } nn_close(sock); // 关闭socket return 0; } ``` 其,`handle_request`函数用于处理请求消息,如果请求消息合法并且`service`字段为`get_dp_version`,则调用`create_response_json`函数创建回复消息,否则打印错误信息。`create_response_json`函数用于创建回复消息的JSON对象。在主函数,接收到请求消息后调用`handle_request`函数获取回复消息,并发送回复消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值