随笔分类 -  Linux

上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页
摘要:由于Linux对线程实现的一些特殊性,所以会给我们理解线程及其相关的一些函数带来疑惑,这里做个解答: 1、关于sleep 很多书籍上都说sleep这个系统调用会使整个进程sleep,而不单是sleep一个线程。这样说没错,但我们要是在Linux下写一个多线程 的程序,在一个线程中调用sleep,你会发现其他线程照样运行,这是怎么回事呢?这就是由于Linux下的线程,其实线程的注册、销毁等工作是在 pthread库里面,而在内核中,线程其实就是一个进程。Linux对线程的实现是通过__clone调用实现的,这个调用会new多个进程出来,只不 过的是, Linux会设置这些进程的共享内存空间、文件 阅读全文
posted @ 2011-04-05 10:15 super119 阅读(2153) 评论(0) 推荐(0) 编辑
摘要:union和struct的区别在于: 1、对于一个union类型的变量,所有成员变量共享一块内存,该内存的大小有这些成员变量中长度最大的一个来决定 2、union分配的内存是连续的,这一点非常重要。 更具体的看这里,还有测试代码呢(附件1): 那为什么要发明union呢?这是由于union的特性决定的,特别是上述的第二点,因为struct中成员变量虽然内存都是独立的,但是struct不能保证分配的内存是连续的。 举个例子:CPU的ax寄存器分为ah和al两部分,我们现在要给其赋值,就可以采用union: union _ax_register { int i; // 4Bytes, union将 阅读全文
posted @ 2011-04-05 10:13 super119 阅读(2218) 评论(0) 推荐(0) 编辑
摘要:使用popen库函数的版本: #include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<limits.h>#defineBUFSZPIPE_BUFvoiderr_quit(char*msg);intmain(intargc,char*argv[]){FILE*fp;//FILEstreamforpopenchar*cmdstring="ps-aux|greproot";charbuf[BUFSZ];//createt 阅读全文
posted @ 2011-04-05 10:11 super119 阅读(345) 评论(0) 推荐(0) 编辑
摘要:本文参考了VIM中文用户手册的附录三-“用VIM进行C/C++编程介绍”和第29、30章 一、ctags(有了ctags,可以实现很多强大的编程辅助功能,如下) 可以写入.vimrc文件中的命令有set autowrite 1、ctags,使用了ctags.sourceforge.net上的ctags软件,也是VIM推荐的ctags版本 2、这个ctags用起来很简单,直接ctags -R /usr/include/* 就能生成一个包含所有linux下.h文件的tags文件;使用ctags -R <my develop directory>就能生成自己应用的一个tags文件。一般来 阅读全文
posted @ 2011-04-05 10:11 super119 阅读(1288) 评论(0) 推荐(0) 编辑
摘要:#include<stdio.h>#include<pthread.h>#include<sys/types.h>#include<unistd.h>#include<signal.h>#include<sys/param.h>#include<sys/sysinfo.h>voidcommand_thread(void*arg);voidsetup_daemon();voidmessage_log(char*text);voidcommand_thread(void*arg){charstr_command[1 阅读全文
posted @ 2011-04-05 10:10 super119 阅读(573) 评论(0) 推荐(0) 编辑
摘要:近期做EasyCluster,需要创建用户,要求在Linux上能创建一个用户帐号,很自然想到了后台程序调用useradd命令行来完成,但众所周 知,密码是个麻烦事。查看了 useradd的手册,有个-p password 选项可以在创建的时候就指定密码,但要求这里的密码是已经加过密的,这就要求用crypt函数进行加密,然后再放入命令行。故测试了一下,写了一段测试代 码,用来生成密码: Code: Select all#define _XOPEN_SOURCE#include <stdio.h>#include <string.h>#include <unistd. 阅读全文
posted @ 2011-04-05 10:05 super119 阅读(478) 评论(0) 推荐(0) 编辑
摘要:exec函数组有六个函数,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg , ..., char * const envp[]); int execv(const char *path, char *const argv[]); int exe 阅读全文
posted @ 2011-04-05 10:04 super119 阅读(633) 评论(0) 推荐(0) 编辑
摘要:本文介绍了如何用信号来调试一个程序。众所周知,在Linux编程中,经常会遇到程序segment fault或其他类似的错误,这些错误比较难调试,本文就介绍了用信号来调试这种错误的方法。 当一个程序访问一个未分配内存的地址时或其他情况时,会产生segment fault错误,此时程序会产生一个SIGSEGV的信号,所以,我们的程序可以捕获这个信号,并打印出是哪条指令导致了该错误,及产生该错误时CPU各寄存器的值,从而定位出问题所在。 本文举了两个很好的例子,一个是对SIGILL信号的处理,比如,当一个应用程序执行了一个不被允许的操作(比如用汇编执行保存/恢复CPU特权 寄存器的指令),这种操作在 阅读全文
posted @ 2011-04-05 10:03 super119 阅读(301) 评论(0) 推荐(0) 编辑
摘要:Mesa is a 3-D graphics library with an API which is very similar to that of OpenGL. To the extent that Mesa utilizes the OpenGL command syntax or state machine, it is being used with authorization from SGI. While Mesa is not a licensed OpenGL implementation, it is currently being tested with the Ope 阅读全文
posted @ 2011-04-05 10:02 super119 阅读(1734) 评论(0) 推荐(0) 编辑
摘要:1. 首先在VTK的网站:http://www.vtk.org 上可以下载到VTK的源码(VTK不提供Precompiled binary版本,所以,VTK的安装都必须要手动自己编译),Down下来之后解开。VTK的网站上还有VTK Data下载,这是VTK Example程序运行时所需要的数据文件,如果我们想在安装完VTK后做一些演示和测试,那么就需要下载这个包。我的意见是不用下载了,VTK安装完成 后,我们用VTK网站上提供的两个Example Code,自己编译运行一下,就可以知道VTK有没有安装成功了。 2. 解开包,看到根目录下有一个README.html文件,这就是安装文档,基本上 阅读全文
posted @ 2011-04-05 10:01 super119 阅读(2277) 评论(0) 推荐(0) 编辑
摘要:众所周知,通过使用条件编译,可以让我们的C代码支持不同的平台。但是在代码中大量运用#ifdef, #endif这样的预处理指令显然是不妥的,因为这些代码分散在所有的代码中,非常难维护。将来如果要再添加一个平台的支持,要在所有代码中search 这些预处理指令。所以,很容易想到的一种改良方法是专门做一个.h文件来做这个事情,比如platform_specific.h: #ifdef WIN32 inline function1() { ...... } inline function2() { ...... } #endif #ifdef LINUX inline function1() { . 阅读全文
posted @ 2011-04-05 09:59 super119 阅读(449) 评论(0) 推荐(0) 编辑
摘要:我们都知道,可以用atexit来注册一个我们自己写的函数作为exit函数,也就是说,在程序退出的时候,会调用到我们的这个自定义exit函数。问题是: 在Linux下终结一个C程序,最普遍的有两种做法: 1、在main函数中调用return 2、在任何地方调用 "exit" system call 试验证明,这两种方法都会触发我们自定义的exit函数,写的测试程序如下: Code: Select all#include "apue.h"static void my_exit(void);int main(void){ if (atexit(my_exit) 阅读全文
posted @ 2011-04-05 09:57 super119 阅读(589) 评论(0) 推荐(0) 编辑
摘要:Using GNU C __attribute__ reading notes 1. 本文讲述GNU编译器的一个特性-__attribute__,这个宏是一个编译器指令,我们在代码中通过定义这个东西,可以inform编译器我们代码 的一些逻辑,从而在编译器避免一些错误,在运行期提高性能。__attribute__在很多代码中都有应用,非常实用。包括我们在看一些老外写的比较成 熟的代码的时候,都能看到这个东西。 2. __attribute__ format ,这个东西能告知编译器,我们的代码在处理printf,scanf这样变参数的函数的时候,哪个参数是format string,哪个参数是参 阅读全文
posted @ 2011-04-05 09:56 super119 阅读(1108) 评论(0) 推荐(0) 编辑
摘要:crypt函数用来加密,目前Linux平台上加密的方法大致有MD5, DES, 3 DES 在RedHat平台上MD5和DES用的多一些。crypt函数的原形是: char *crypt(const char *key, const char *salt); key就是我们要传入的明文,salt是我们指定用来加密的密钥,返回值就是加密后的密文。 关键就是这个密钥salt,这里通过我们的实验,发现: (1)salt这个字符串如果以$1$开头,以$结尾,那么这表示让crypt用MD5的方式加密,加密后出来的密文格式就是 $1$...$<密文正文> ,夹在$1$和$之间的字符串就是我们指 阅读全文
posted @ 2011-04-05 09:55 super119 阅读(4752) 评论(0) 推荐(0) 编辑
摘要:据说每个人都回错一回的声明。 参考C++ Primer 4th pdf版的164页。typedef、指针、const这些东西揉在一起是非常复杂的,值得推敲。 cstr的类型应该是:string *const -- 指向string的一个const指针 阅读全文
posted @ 2011-04-05 09:54 super119 阅读(328) 评论(0) 推荐(0) 编辑
摘要:写了一个小程序,测试了一下vector是如何分配内存的: Code: Select all#include <iostream>#include <vector>#include <string>using namespace std;int main(){ vector<string> vec1; cout << "Vector size is: " << vec1.size() << ", capacity is: " << vec1.capacity() 阅读全文
posted @ 2011-03-26 10:26 super119 阅读(256) 评论(0) 推荐(0) 编辑
摘要:第八章有个例子,非常简单,就是读入用户输入,赋给一个int,这里面有一个判断,就是如果用户输入的不是int,那么,cin就会变成invalid,里面就有condition state,于是我们可以catch这个state并clear,然后继续读入。 但是书上给的例子有个错误,原来的程序是这样的: Code: Select all#include <iostream>#include <stdexcept>using namespace std;int main(int argc, char **argv){ int ival; // cout << &quo 阅读全文
posted @ 2011-03-26 10:26 super119 阅读(279) 评论(0) 推荐(0) 编辑
摘要:区别很简单,看这两个函数的man手册就能看的出来。简单来说,memmove是把一堆byte从src移到dst,memcpy是把一堆byte从 src拷贝到dst,最大不同的是:memmove是先把一堆byte拷贝到一个临时的array中,然后再把这个临时的array写到dst中去;而 memcpy没有这个逻辑,直接就是从src一个一个字节的读,同时往dst一个一个字节的写。这样就导致了一个最根本的不同: memcpy不适合或者说不能处理src和dst两块内存有重叠(overlap)的情况。因为memcpy是直接从src拷贝,然后往dst中写,这样,如果src和dst两块内存有重叠,这样就会导致 阅读全文
posted @ 2011-03-26 10:25 super119 阅读(628) 评论(1) 推荐(0) 编辑
摘要:在看lftp的源代码的时候,看到了程序的一开头有这样几句代码: setlocale (LC_ALL, ""); setlocale (LC_NUMERIC, "C"); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); 注:PACKAGE, LOCALEDIR都是宏,在autoconf的时候自动生成,PACKAGE宏就是lftp, LOCALEDIR就是/usr/share/locale 不明白有什么用,于是查了一下资料,写了一个测试程序,搞明白了。 setlocale是用来设置程序的l 阅读全文
posted @ 2011-03-26 10:25 super119 阅读(1106) 评论(0) 推荐(0) 编辑
摘要:在看lftp的源代码的时候,发现这么一行: operator bool() const { return ... } 一下子没想起来,这是什么语法,是operator overload么?不像阿,怎么不以函数的返回值打头呢?后来一查C++ Primer,明白了,这是convert operator,也就是将这个类如果要转化成bool值的话,就会调用到这个函数。convert operator以operator关键字打头,紧跟类型,然后是两个括号(括号中不能带有参数)。更具体的看C++ Primer和上面的注释。 不过看明白了之后有个问题: operator int() const { .... 阅读全文
posted @ 2011-03-26 10:24 super119 阅读(409) 评论(0) 推荐(0) 编辑

上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 22 下一页