UNIX环境高级编程(屏幕打印和inet_ntoa输出异常问题)

12 篇文章 0 订阅
9 篇文章 1 订阅

一、来回在屏幕和文件之间打印

在网上没找到在屏幕和文件来回打印的方法,翻了下UNIX环境高级编,里面有个freopen用于在一个指定的流上打开一个指定的文件,如果要将标准输出打印到文件,需要调用该函数,将指定的文件打开为预定义的流。

FILE *freopen(const char * pathname, const char *type, FILE, *fp);

对于屏幕标准输出,可以通过ttyname获取终端名称,在要恢复时,调用freopen再次打开即可。

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>	
#include <unistd.h>

char *g_tty_name;
#define LOG_FILE_PATH "/home/test"

int main(int argc, char* argv[])
{
	
	if (isatty(STDOUT_FILENO))
	{
		g_tty_name = ttyname(STDOUT_FILENO);
	}
	
	printf("step 1\n");
	set_stdout(LOG_FILE_PATH);
	printf("step 2\n");
	recover_stdout();
	printf("step 3\n");
	set_stdout(LOG_FILE_PATH);
	printf("step 4\n");
	
	exit(0);
}

void set_stdout(char *filepath)
{

	freopen(filepath,"ab",stdout);	
}

void recover_stdout(void)
{
	freopen(g_tty_name,"ab",stdout);
	
}

二、inet_ntoa和inet_ntop报段错误


64位linux下inet_ntoa()返回值竟然为int,printf报段错误_Yerasel的专栏-CSDN博客

在执行《UNIX环境高级编程》图16-18用例时获取IP地址失败,参考上述文档,对于64位Linux如果没有添加#include <arpa/inet.h>库,则printf("addr inet_ntop %s", abuf);正常,后面两个异常。如果添加了#include <arpa/inet.h>库,则三个printf均执行正常。

printf("addr inet_ntop %s", abuf);

printf("addr inet_ntop %s", addr);
printf("addr inet_ntoa %s", inet_ntoa(sinp->sin_addr));

struct sockaddr_in *sinp;
char abuf[INET_ADDRSTRLEN] = {0};
char *addr;

addr = inet_ntop(AF_INET, &sinp->sin_addr, abuf, INET_ADDRSTRLEN);
printf("addr inet_ntop %s", abuf);
printf("addr inet_ntop %s", addr);
printf("addr inet_ntoa %s", inet_ntoa(sinp->sin_addr));

三、守护进程core文件不保存

在执行《UNIX环境高级编程》图16-18用例时,把服务器进程设置为守护进程,执行(二)中printf("addr inet_ntop %s", addr);没有产生core文件,查看/var/log/messages里面的系统日志如下,提示程序不属于任何软件包,并且ProcessUnpackaged设置为'no。

Jan 24 16:34:14 localhost kernel: prog16.18[95237]: segfault at ffffffff96541b10 ip 00007fc457a57f1b sp 00007fff96541420 error 5 in libc-2.17.so[7fc457a0f000+1b6000]
Jan 24 16:34:14 localhost abrt-hook-ccpp: Saved core dump of pid 95237 (/home/c_test/linux_c/prog16.18) to /var/tmp/abrt/ccpp-2022-01-25-08:34:14-95237 (880640 bytes)
Jan 24 16:34:14 localhost abrt-server: Can't load public GPG key /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
Jan 24 16:34:14 localhost abrt-server: Executable '/home/c_test/linux_c/prog16.18' doesn't belong to any package and ProcessUnpackaged is set to 'no'
Jan 24 16:34:14 localhost abrt-server: 'post-create' on '/var/tmp/abrt/ccpp-2022-01-25-08:34:14-95237' exited with 1
Jan 24 16:34:14 localhost abrt-server: Deleting problem directory '/var/tmp/abrt/ccpp-2022-01-25-08:34:14-95237'

abrtd:Executable ‘some execution‘ doesn‘t belong to any package and ProcessUnpackaged is set to ‘no‘_RToax-CSDN博客

根据上面文档,将/etc/abrt/abrt-action-save-package-data.conf里面的ProcessUnpackaged设置为 yes,再次执行则syslog提示如下。进入/var/tmp/abrt/ccpp-2022-01-25-08:38:25-95386目录,可以看到里面产生了coredump文件。

Jan 24 16:38:24 localhost kernel: prog16.18[95386]: segfault at 25ce12c0 ip 00007fe0873abf1b sp 00007fff25ce0bd0 error 4 in libc-2.17.so[7fe087363000+1b6000]
Jan 24 16:38:25 localhost abrt-hook-ccpp: Saved core dump of pid 95386 (/home/c_test/linux_c/prog16.18) to /var/tmp/abrt/ccpp-2022-01-25-08:38:25-95386 (880640 bytes)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值