SIO包是什么

首先SIO包并不是一个标准库中的函数集合,这是CSAPP中为了方便样例讲解而创建的一个代码库中的一些函数的集合,我们的linux中默认肯定是没有的 需要我们自己去导入,怎么导入呢,其实很简单,就是把代码拉下来放到/usr/include这个目录当中,然后当我们需要使用时就可以当做一般的函数库来使用了

​这是csapp.h的源码​​​​这是csapp.c的源码​

SIO包中的函数

平时能用的上的函数就是这些

ssize_t Sio_putl(long v);
ssize_t Sio_puts(char s[])
void Sio_error(char s[])

Sio_putl
打印一个数字

Sio_puts
打印一个字符串

Sio_error
打印一条错误消息并终止程序

SIO包中的函数的作用

你一定很奇怪为什么我们有封装好的标准输入输出函数 为什么还需要这样几个奇怪的函数呢 这就牵扯到了另外一个问题
​编写安全的信号处理函数

SIO包的源码

/*************************************************************
* The Sio (Signal-safe I/O) package - simple reentrant output
* functions that are safe for signal handlers.
*************************************************************/

/* Private sio functions */

/* $begin sioprivate */
/* sio_reverse - Reverse a string (from K&R) */
static void sio_reverse(char s[])
{
int c, i, j;

for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}

/* sio_ltoa - Convert long to base b string (from K&R) */
static void sio_ltoa(long v, char s[], int b)
{
int c, i = 0;
int neg = v < 0;

if (neg)
v = -v;

do {
s[i++] = ((c = (v % b)) < 10) ? c + '0' : c - 10 + 'a';
} while ((v /= b) > 0);

if (neg)
s[i++] = '-';

s[i] = '\0';
sio_reverse(s);
}

/* sio_strlen - Return length of string (from K&R) */
static size_t sio_strlen(char s[])
{
int i = 0;

while (s[i] != '\0')
++i;
return i;
}
/* $end sioprivate */

/* Public Sio functions */
/* $begin siopublic */

ssize_t sio_puts(char s[]) /* Put string */
{
return write(STDOUT_FILENO, s, sio_strlen(s)); //line:csapp:siostrlen
}

ssize_t sio_putl(long v) /* Put long */
{
char s[128];

sio_ltoa(v, s, 10); /* Based on K&R itoa() */ //line:csapp:sioltoa
return sio_puts(s);
}

void sio_error(char s[]) /* Put error message and exit */
{
sio_puts(s);
_exit(1); //line:csapp:sioexit
}
/* $end siopublic */

/*******************************
* Wrappers for the SIO routines
******************************/
ssize_t Sio_putl(long v)
{
ssize_t n;

if ((n = sio_putl(v)) < 0)
sio_error("Sio_putl error");
return n;
}

ssize_t Sio_puts(char s[])
{
ssize_t n;

if ((n = sio_puts(s)) < 0)
sio_error("Sio_puts error");
return n;
}

void Sio_error(char s[])
{
sio_error(s);
}