【Linux】ping程序解析

大佬资料:ping源码分析 (超级详细 带背景分析)

一、int getopt(argc, argv, “v”)

参考资料:Linux下getopt()函数的简单使用

extern char* optarg;//保存选项的参数的

//optind初始值为1,越过了程序路径的参数
/* 通过argv[optind]或optarg来获得参数 */
extern int optind;//记录下一个检索位置

//opterr初始值为一
extern int opterr;//是否将错误信息输出到stderr
extern int optopt;//不在选项字符串optstring中的选项

二、 signal(SIGALRM, sig_alrm)

参考资料:Linux信号(signal)机制
参考资料:Linux程序之alarm()函式——闹钟讯号传送

  • signal()函数用于信号的安装(绑定)。在这里插入图片描述
  • alarm()用于调用进程指定时间后发出SIGALARM信号。
    在这里插入图片描述
  • alarm()函式测试
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sig_alrm(int signo){printf("hello\n");}

int main(){
	int i;
	//绑定。如果检测到SIGALRM信号,则调用sig_alrm()函数。
	//函数名称可自定义,函数需要自己进行实现。
	signal(SIGALRM, sig_alrm);
	//5s后产生SIGALRM信号
	alarm(5);
	for(i = 1; i < 7; i++) {
		printf("sleep %d ...\n", i);
   		sleep(1);
   	}
}

在这里插入图片描述
深入学习:signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析

signal绑定的函数将会获得一个参数signo,signo是信号名,代表收到的是哪个信号,与下表对应
在这里插入图片描述
在这里插入图片描述
测试成功,参数值为14,代表收到的是SIGALRM信号

三、getaddrinfo(host, serv, &hints, &res)

★★参考资料:getaddrinfo的用法详解
参考资料:地址查询函数gethostbyname()和getaddrinfo()
访问DNS服务器,通过域名获取IP地址等主机信息

四、bind()、connect()、recvfrom()、sendto()

socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的IP地址和端口绑定起来,只有这样,流经该IP地址和端口的数据才能交给套接字处理;而客户端要用 connect() 函数建立连接
参考资料:使用bind()和connect()函数
参考资料:C语言sendto()函数:经socket传送数据
参考资料:UDP协议 sendto 和 recvfrom 浅析与示例

五、socket()与setsockopt()

函数int socket(int domain, int type, int protocol);用于创建一个新的socket。返回值为套接字描述符

使用int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);函数来对socket选项进行设置。通过socket()函数获得的套接字描述(一个int值)来操作建立的socket。
在这里插入图片描述

六、IP地址详解(广播地址、组播地址)

计算机网络基本知识2

七、setuid()与getuid()

参考资料:C语言setuid()函数:设置真实的用户识别码
参考资料:C语言getuid()函数:取得真实的用户识别码

   7.1 setuid()

相关函数:getuid, setreuid, seteuid, setfsuid
头文件:#include <unistd.h
定义函数:int setuid(uid_t uid);
函数说明:
setuid()用来重新设置执行目前进程的用户识别码. 不过, 要让此函数有作用, 其有效的用户识别码必须为0(root). 在Linux 下, 当root 使用setuid()来变换成其他用户识别码时, root 权限会被抛弃, 完全转换成该用户身份, 也就是说, 该进程往后将不再具有可setuid()的权利, 如果只是向暂时抛弃root 权限, 稍后想重新取回权限, 则必须使用seteuid().
返回值:执行成功则返回0, 失败则返回-1, 错误代码存于errno.
附加说明:一般在编写具 setuid root 的程序时, 为减少此类程序带来的系统安全风险, 在使用完root 权限后建议马上执行setuid(getuid());来抛弃root 权限.此外, 进程uid 和euid 不一致时Linux 系统将不会产生core dump.

   7.2 getuid()

相关函数:geteuid, setreuid, setuid
头文件:#include <unistd.h> #include <sys/types.h>
定义函数:uid_t getuid(void);
函数说明:getuid()用来取得执行目前进程的用户识别码。
返回值:用户识别码
范例:
#include <unistd.h>
#include <sys/types.h>
main()
{ printf(“uid is %d\n”, getuid());}
执行:
uid is 0 //当使用root 身份执行范例程序时>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值