• 工作总结(一):Linux C


    这三个月以来一直忙着赶进度,没有停下来记录一些东西,很多很好的东西往往只能零零散散地记在草稿本上, 这样偶尔想起来自己都找不到,所以现在抽空总结下来。

    这些天做了三件事,其一是在Linux下开发了对接service的IPTV client lib on PC,之所以是on PC,因为我写的这段程序只是为了以后移植到一个运行RTOS的机顶盒上面;其二是基于PayPal做的支付系统,其三是一个监控服务器和用户状态的简单后台管理页面,这两个都是用cakephp + bootstrap做的,并没有涉及到数据库,与数据库交互是使用了已经写好的API。这篇记录C的内容。

    一、打印指针值:

    int a = 0;
    int *p = &a;
    printf("%p", p);

    二、

    PHPStorm: PHP IDE

    PyCharm: PYTHON IDE

    Brackets : 强大免费的开源跨平台Web前端开发工具IDE

    coolshell.com : 酷壳网

    三、

    问题:VMWare Workstation虚拟机出现故障,非正常关机时,无法再次打开。

    解决:删除虚拟磁盘目录下的*.lck文件(可能需要重启)。

    四、字符串的正确使用:

    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    
    
    int main(int argc, char *argv[])
    
    {
    
        char str1[27] = "abcdefghijklmnopqrstuvwxyz";//编译器将在末尾自动添加“”,但是需要保证,字符数组中有空余的位置
    
        char *str2 = NULL;
    
        str2 = (char *)malloc(26 + 1);
    
        memset(str2, 0, 26 + 1);
    
        memcpy(str2, str1, 26);
    
    
    
        printf("str1 length is %ld, size is %ld
    ", strlen(str1), sizeof(str1));
    
        printf("str2 length is %ld, size is %ld
    ", strlen(str2), sizeof(str2));
    
        int i = 0;
    
        for(i = 0; i < 30; i++)
    
            printf("%02x ", str1[i]);
    
        printf("
    ");
    
        for(i = 0; i < 30; i++)
    
            printf(" %c ", str1[i]);
    
    
    
        printf("
    ");
    
        if(NULL != str2) free(str2);
    
        return 0;
    
    }

     输出:

    hubery@hubery-VirtualBox:~/CP/HW$ ./shellInput 
    str1 length is 26, size is 27
    str2 length is 26, size is 8
    61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 00 00 00 00 
     a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

     尽量不要使用strlen、strcpy、strcat这些需要通过结束符“”来判断字符串长度的函数,因为一旦字符串没有正常的结束符,你将得到意想不到的结果。

    五、在子函数中malloc变量(声明时字符串大小不可知):

    #include <stdlib.h>
    #include <stdio.h>
    
    int malloc_inner(char **p)
    {
    *p = (char *)malloc(10);
    return 0;
    }
    
    int main()
    {
    char *str = null;
    malloc_inner(&str);
    free(str);
    return 0;
    }

     六、命令行参数:

    //shellInput.c
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        printf("argc = %d, argv[0] = %s, argv[1] = %s
    ", argc, argv[0], argv[1]);
        return 0;
    }
    
    //output
    #./shellInput hello
    argc = 2, argv[0] = ./shellInput, argv[1] = hello

    七、使用CGDB调试一个程序:

    objdump,cgdb,dmesg -c.

    编译参数: -g -rdynamic

    调试: cgdb ./a.out

    加断点: b func_name

    步进: n

    步入: s

    打印: p

    GDB/CGDB 调试时打印完整内容:set print element 0

    查看dumped的位置: bt/where

    使down一个程序: kill -s SIGSEGV pid

    八、C读写文件:

    snprintf(filename, sizeof(filename), "%s.sig", arv[2]);
    //write
    if((f = fopen(filename, "wb+")) == NULL)
    {
    ret = 1;
    printf("...");
    //...
    }
    if(fwrite(buf, 1, olen ,f) != olen)
    {
    printf("...");
    //...
    }
    fclose(f);
    
    //read
    f = fopen(filename,"rb");
    i = fread(buf, 1, sizeof(buf), f);
    fclose(f);

     九、结构体

    typedef struct {
        slist_node node;
        VdsChannel channel;
        CHAR *type;
        CHAR *video_id;
        CHAR *url;//需要url时,先查询链表,若没有再作请求
    }VdsChanInfo;
    
    struct timerr
    {
        time_t time_begin;
        unsigned int time_long;
        unsigned int time_refresh;
        char user_id[50];
        char token[32];
    };
    struct timerr timer ;//用法1
    
    //结构体数组
    struct
    {
        UINT32 isValid;//1 for true, 0 for false
        UINT32 decode_type;//0 for all, 1 for sha1+rsa, 2 for aes+rsa
        CHAR *request_encrypt_key;
        CHAR *response_encrypt_key;
    
    }keyPairs[KEY_PAIR_SUM];
    
    //构造枚举类型
    typedef enum {
        VDS_READY,
        VDS_AUTH_OK,
        VDS_GET_KEY_OK,
        VDS_GET_CHAN_INIT_OK,
        VDS_GET_CHAN_URL_OK
    }VdsStatus;
    
    typedef struct {
    
        BOOL running;
        BOOL exit;
        VdsStatus status;
    
        VdsIptvParam param;
        pthread_t thread_id;
        pthread_mutex_t lock;
        pthread_mutex_t debug_lock;
        UINT32 chan_num;
        slist channel_list;
    
    }VdsIptvMgr;
    
    VdsIptvMgr * get_mgr(void);//用法2

     十、链表使用

      1 //singly_linked_list.h
      2 #ifndef __SINGLY_LINKED_LIST_H__
      3 #define __SINGLY_LINKED_LIST_H__
      4 #include "porting.h"
      5 
      6 #ifdef  __cplusplus
      7 extern "C" {
      8 #endif
      9 
     10 typedef struct _slist_node {
     11     struct _slist_node *next;
     12 } slist_node;
     13 
     14 typedef struct {
     15     UINT32            count;
     16     slist_node       *head;
     17     slist_node       *tail;
     18 } slist;
     19 
     20 static __inline__ void slist_add_head(slist *list, slist_node *node) {
     21     if (list->count == 0) {
     22         list->head = node;
     23         list->tail = node;
     24     }
     25     else {
     26         node->next = list->head;
     27         list->head = node;
     28     }
     29     list->count++;
     30 }
     31 
     32 static __inline__ void slist_add_tail(slist *list, slist_node *node)
     33 {
     34     if (list->count == 0) {
     35         list->head = node;
     36         list->tail = node;
     37     }
     38     else {
     39         list->tail->next = node;
     40         list->tail = node;
     41     }
     42     list->count++;
     43 }
     44 
     45 static __inline__ slist_node * slist_del_head(slist *list)
     46 {
     47     slist_node *node = NULL;
     48     if (list->count > 0) {
     49         node = list->head;
     50         list->head = node->next;
     51         node->next = NULL;
     52         if (--list->count == 0) {
     53             list->tail = NULL;
     54         }
     55     }
     56     return node;
     57 }
     58 
     59 static __inline__ slist_node * slist_del_tail(slist *list) {
     60     slist_node *node = NULL;
     61     if (list->count > 1) {
     62         slist_node *ptr = list->head;
     63         while (ptr) {
     64             if (ptr->next == list->tail) {
     65                 node = list->tail;
     66                 ptr->next = NULL;
     67                 list->tail = ptr;
     68                 list->count--;
     69                 break;
     70             }
     71             ptr = ptr->next;
     72         }
     73     }
     74     else if (list->count == 1) {
     75         node = list->tail;
     76         list->head = list->tail = NULL;
     77         list->count--;
     78     }
     79 
     80     return node;
     81 }
     82 
     83 static __inline__ slist_node * slist_del_node(slist *list,  slist_node *node)
     84 {
     85     slist_node *curr = NULL;
     86     slist_node *temp = NULL;
     87 
     88     if(list->head == node)
     89         return slist_del_head(list);
     90 
     91     if(list->tail == node)
     92         return slist_del_tail(list);
     93 
     94     //if(list->count <= 2)
     95     //{
     96         //ASSERT(0);
     97     //}
     98 
     99     curr = list->head;
    100     if(curr == NULL)
    101         return NULL;
    102 
    103     while(curr->next != NULL)
    104     {
    105         if(curr->next == node)
    106         {
    107             temp = curr->next;
    108             curr->next = temp->next;
    109             list->count--;
    110 
    111 
    112             temp->next = NULL;
    113 
    114 /*
    115             if(list->count >= 1)
    116             {
    117                 if(list->head == NULL || list->tail == NULL)
    118                 {
    119                     SDBBP();
    120                 }
    121 
    122                 if(list->count == 1 && list->head != list->tail)
    123                 {
    124                     SDBBP();
    125                 }
    126 
    127                 if(list->count == 2 && list->head->next != list->tail)
    128                 {
    129                     SDBBP();
    130                 }
    131 
    132                 if(list->tail->next != NULL)
    133                 {
    134                     SDBBP();
    135                 }
    136             }
    137 */
    138 
    139             return temp;
    140         }
    141         else
    142             curr = curr->next;
    143     }
    144 
    145 /*
    146     if(list->count > 0)
    147     {
    148         if(list->tail->next != NULL)
    149         {
    150             SDBBP();
    151         }
    152     }
    153 */
    154     return NULL;
    155 }
    156 
    157 static __inline__ void  slist_free(slist *list)
    158 {
    159     slist_node *node = NULL;
    160     if(NULL == list)
    161         return;
    162     while(list->count > 0)
    163     {
    164         node = slist_del_head(list);
    165         FREE(node);
    166     }
    167 }
    168 
    169 #define SLIST_COUNT(slist)    ((slist)->count)
    170 
    171 /**
    172  * SLIST_ENTRY - get the struct for this entry
    173  * @ptr:    the struct slist_node pointer.
    174  * @type:    the type of the struct @ptr embedded in.
    175  * @member:    the name of the slist_node within the struct.
    176  */
    177 #define SLIST_ENTRY(ptr, type, member) 
    178     ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
    179 
    180 
    181 #ifdef __cplusplus
    182 }
    183 #endif      /* __cplusplus */
    184 
    185 #endif
    singly_linked_list.h

    下面展示如何使用以上链表操作。

    //
    typedef struct {
        UINT32 idx;
        CHAR *name;
        CHAR *img_h;
        CHAR *img_s;
    }VdsChannel;
    
    typedef struct {
        slist_node node;
        VdsChannel channel;
        CHAR *type;
        CHAR *video_id;
        CHAR *url;//需要url时,先查询链表,若没有再作请求
    }VdsChanInfo;
    
    
    //declare
    vds_list = (slist *)malloc(sizeof(slist));
    vds_list->count = 0;
    vds_list->head = NULL;
    vds_list->tail = NULL;
    
    //add
    VdsChanInfo *channels = (VdsChanInfo *)malloc(sizeof(VdsChanInfo));
    channels->type = ( CHAR * )malloc( strlen( value ) + 1 );
    channels->video_id = ( CHAR * )malloc( strlen( value ) + 1 );
    channels->channel.name = ( CHAR * )malloc( strlen( value ) + 1 );
    channels->channel.img_h = ( CHAR * )malloc( strlen( value ) + 1 );
    channels->channel.img_s = ( CHAR * )malloc( strlen( value ) + 1 );
    strcpy( channels->type , value );
    strcpy( channels->video_id, value );
    strcpy( channels->channel.name, value );
    strcpy( channels->channel.img_h, value );
    strcpy( channels->channel.img_s, value );
    channels->channel.idx = i;
    channels->url = NULL;
    channels->node.next = NULL;
    slist_add_tail(list, &(channels->node));
    
    //search
    slist_node *node;
    VdsChanInfo *vds;
    VdsChannel *channel_info = (VdsChannel *)malloc(sizeof(VdsChannel));;
    for(node = vds_list->head; node != NULL; node = node->next)
    {
        vds = SLIST_ENTRY(node, VdsChanInfo, node);
        if(idx == vds->channel.idx)
        {
            channel_info->idx = vds->channel.idx;
            channel_info->img_h = vds->channel.img_h;
            channel_info->img_s = vds->channel.img_s;
            channel_info->name = vds->channel.name;
            VDS_DBG(VDS_D_SYS, " . Got channel info.");
            return channel_info;
        }
    }
    
    //free and destory
    void vds_free(slist *list)
    {
        slist_node *node;
        VdsChanInfo *vds;
        for(node = list->head; node != NULL; node = node->next)
        {
            vds = SLIST_ENTRY(node, VdsChanInfo, node);
            if(NULL != vds->type)
            {
                free(vds->type);
                vds->type = NULL;
            }
            if(NULL != vds->video_id)
            {
                free(vds->video_id);
                vds->video_id = NULL;
            }
            if(NULL != vds->url)
            {
                free(vds->url);
                vds->url = NULL;
            }
            if(NULL != vds->channel.name)
            {
                free(vds->channel.name);
                vds->channel.name = NULL;
            }
            if(NULL != vds->channel.img_h)
            {
                free(vds->channel.img_h);
                vds->channel.img_h = NULL;
            }
            if(NULL != vds->channel.img_s)
            {
                free(vds->channel.img_s);
                vds->channel.img_s = NULL;
            }
        }
    
    //    slist_free(vds_list);
    }
    vds_free(vds_list);
    slist_free(vds_list);
  • 相关阅读:
    扩展欧几里得算法
    单源最短路径—Dijkstra算法
    欧拉定理,费马小定理
    欧拉函数
    Trie 字典树
    平衡树——Treap,Splay
    NOI2009 开关
    银河英雄传说
    线段树与延迟标记
    c++常见变量的极值
  • 原文地址:https://www.cnblogs.com/hubery/p/4716573.html
Copyright © 2020-2023  润新知