SIO包是什么

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);
}

posted @ 2022-07-02 13:18  李兆龙的博客  阅读(118)  评论(0编辑  收藏  举报