读码随记(1)

来源:互联网 发布:印度农民知乎 编辑:程序博客网 时间:2024/04/30 05:56

阅读通信设备监控程序的一些杂记,不舍得扔,记录下来!


_exit()与exit的区别:
头文件:
exit:#include<stdlib.h>
_exit:#include<unistd.h>
_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
exit()函数与_exit()函数最大的区别就在于 exit()函数在调用_exit() 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
exit(0)表示进程正常退出,不为0表示异常退出。

strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
int *p;sizof(p)的值是4.

setbuf(stdout,NULL);禁止标准输出的缓冲

#include <iostream>#include<fstream>int main(int argc, char* argv[]){    char* outbuf =  new char [100];    setbuf(stdout,outbuf);//将输出流绑定到outbuf上    puts("helloworld\n");//内容输入到outbuf内    //setbuf(stdout,NULL);//如果启用这行代码,输出流恢复原来的状态,puts输出到控制台    delete[] outbuf;    system("pause");    return 0;}

softdog分析
softdog.c-->int main( int argc, char *argv[] )-->All_Init();
-->获取模块配置文件名称(依赖模块的ID获得资源的名称)
GetResNameByModuleID( RID_FILE_MODULE_CONF, MID_SOFT_DOG,
        FileName, sizeof( FileName ) ) ) != RST_SUCCESS )
int GetResName( const int AResID, char *ABuff, const int ABuffLen )获得资源(配置文件)的名字
int GetProgramAbsolutePath( char *AAbsPath, const int AAbsPathLen )获得程序的绝对路径在/src/common/commutils/filenamingintf.c
中定义。
|
|
-->获取日志配置 这一过程建立在上一步获取的配置文件的名称filename
ReadLogConfig( FileName, &logConfig )从配置文件中读取日志配置到logconfig结构体变量中。
#define LOG_CONFIG_SECTION  "LogConfig"     // 日志配置的段名

-->打开日志(读取配置, 创建输出队列和输出线程,输出线程是负责将日志信息输出到控制台和文件,实现:
void *OutputThread(void *argument))
OpenLog( MODULE_NAME_SOFT_DOG, &logConfig )


pthread_mutex_init(&s_ExitMutex, NULL);
pthread_mutex_lock(&s_ExitMutex);
pthread_mutex_unlock(&s_ExitMutex);有关线程锁的操作,用于线程之间访问共享文件时的互斥操作。

RegThread( pthread_self(), THREAD_NAME_MAIN_THREAD ) //将线程(这里是主线程)的名称ID号信息记录在一个结构体数组中。
不是系统调用。

总结1,在All_Init();完成的工作如下:
1,获取各个模块的配置文件名称和文件路径;
2,获取模块配置文件中的有关日志配置的信息,存放在logconfig结构体变量中。
3,打开日志,读取logconfig日志配置, 创建输出队列和输出线程,输出线程是负责将日志信息输出到控制台和文件。
4,注册线程信息,获取应用程序的路径。


sed -i '/^0x0102=/r log.ini' Desktop/Release/app/config/dev/A09B4000/repparamsconf.ini
这个命令可以直接在原来的文件下面添加一行


① char *strcpy(s,ct)//将字符串包括\0复制到字符串s中,并返回s。
② void *memset(void*s,int ch ,size_t n)//将s中的前n个字节用ch代替并返回s。作用:将一段内存块中填充某个给定的值
        ,常用于对较大的结构体和数组进行清零操作。如:    memset(keyValue, 0, sizeof(keyValue));//将数组清零。
③fork()
④execl(ProgramFile, ProgramFile, "", NULL)
fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child
Process)。在Shell下输入命令可以运行一个程序,是因为Shell进程在读取用户输入的命令之后会调用fork复制出一个新的
Shell进程,然后新的Shell进程调用exec执行新的程序。

⑤exit(EXIT_FAILURE);
⑥sprintf( ABuff, "%s/%s%s", s_Path, MODULE_NAME_SOFT_DOG, FILE_POSTFIX_CONFIG );
⑦pthread_t pthread_self(void);
函数作用:获得线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则将产生神奇的结果
⑧    // 创建消息队列
    s_ctrlQueueId = msgget(s_ctrlQueueKey, IPC_CREAT | 0666);

1 0
原创粉丝点击