中,原型如下:
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
例如:
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev; /* device information */
//已知inode->i_cdev是struct scull_dev中成员cdev的地址,可得到inode->i_cdev所在的scull_dev类型变量的地址。
dev =container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
/* now trim to 0 the length of the device if open was write-only
*/
if ( (filp->f_flags & O_ACCMODE) == O_WRONLY)
{
scull_trim(dev); /* ignore errors */
}
return 0; /* success */
}
2、strace 工具:用来跟踪进程执行时的系统调用和所接收的信号
[chenyun@pon platform]$ strace ls
execve("/bin/ls", ["ls"], [/* 30 vars */]) = 0
brk(0) = 0x9099000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=62697, ...}) = 0
mmap2(NULL, 62697, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f0a000
close(3) = 0
open("/lib/librt.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\350\270\0004\0\0\0"..., 512) = 512
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f09000
fstat64(3, {st_mode=S_IFREG|0755, st_size=48156, ...}) = 0
mmap2(0xb8d000, 33324, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb8d000
mmap2(0xb94000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7) = 0xb94000
close(3) = 0
open("/lib/libacl.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\222\267\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=25660, ...}) = 0
mmap2(0xb78000, 27008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb78000
mmap2(0xb7e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7e000
close(3) = 0
open("/lib/libselinux.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\265\271\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=93508, ...}) = 0
mmap2(0xb98000, 97120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb98000
mmap2(0xbae000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15) = 0xbae000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0\20\236\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1710436, ...}) = 0
mmap2(0x9cb000, 1426884, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x9cb000
mmap2(0xb22000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x157) = 0xb22000
mmap2(0xb25000, 9668, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb25000
close(3) = 0
open("/lib/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\10\266\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=137944, ...}) = 0
mmap2(0xb5c000, 102884, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb5c000
mmap2(0xb72000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15) = 0xb72000
mmap2(0xb74000, 4580, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb74000
close(3) = 0
open("/lib/libattr.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200+\24\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0775, st_size=15780, ...}) = 0
mmap2(0x142000, 17056, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x142000
mmap2(0x146000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0x146000
close(3) = 0
open("/lib/libdl.so.2", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\252\262\0004\0\0\0"..., 512) = 512
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f08000
fstat64(3, {st_mode=S_IFREG|0755, st_size=20668, ...}) = 0
mmap2(0xb2a000, 16504, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb2a000
mmap2(0xb2d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0xb2d000
close(3) = 0
open("/lib/libsepol.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@O\273\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=245376, ...}) = 0
mmap2(0xbb2000, 285024, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xbb2000
mmap2(0xbed000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3b) = 0xbed000
mmap2(0xbee000, 39264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xbee000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f07000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f078e0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb94000, 4096, PROT_READ) = 0
mprotect(0xb22000, 8192, PROT_READ) = 0
mprotect(0xb72000, 4096, PROT_READ) = 0
mprotect(0x9c7000, 4096, PROT_READ) = 0
mprotect(0xb2d000, 4096, PROT_READ) = 0
munmap(0xb7f0a000, 62697) = 0
set_tid_address(0xb7f07928) = 9780
set_robust_list(0xb7f07930, 0xc) = 0
futex(0xbf879bb4, FUTEX_WAKE_PRIVATE, 1) = 0
rt_sigaction(SIGRTMIN, {0xb60400, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0xb60300, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM_INFINITY}) = 0
uname({sys="Linux", node="pon.twsh.com", ...}) = 0
access("/etc/selinux/", F_OK) = 0
brk(0) = 0x9099000
brk(0x90ba000) = 0x90ba000
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=511, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f19000
read(3, "# This file controls the state o"..., 4096) = 511
read(3, "", 4096) = 0
close(3) = 0
munmap(0xb7f19000, 4096) = 0
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f19000
read(3, "rootfs / rootfs rw 0 0\n/dev/root"..., 1024) = 677
read(3, "", 1024) = 0
close(3) = 0
munmap(0xb7f19000, 4096) = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=56426176, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7d07000
close(3) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=61, ws_col=132, ws_xpixel=0, ws_ypixel=0}) = 0
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 9 entries */, 32768) = 240
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 44), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f19000
write(1, "build docs make Makefile src"..., 40build docs make Makefile src tools
) = 40
close(1) = 0
munmap(0xb7f19000, 4096) = 0
exit_group(0) = ?
[chenyun@pon platform]$
[chenyun@pon platform]$
更详细的说明见如下链接:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html
3、awk命令:简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
语法:
awk '{pattern + action}' {filenames} awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, $0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
[chenyun@pon platform]$ ll
total 28
drwxr-xr-x 3 chenyun chenyun 4096 Nov 24 11:17 build
drwxr-xr-x 7 chenyun chenyun 4096 Nov 4 11:21 docs
drwxr-xr-x 3 chenyun chenyun 4096 Nov 4 11:19 make
-rwxr-xr-x 1 chenyun chenyun 6961 Nov 4 11:21 Makefile
drwxr-xr-x 10 chenyun chenyun 4096 Nov 4 11:20 src
drwxr-xr-x 8 chenyun chenyun 4096 Nov 4 11:19 tools
[chenyun@pon platform]$
[chenyun@pon platform]$
[chenyun@pon platform]$
[chenyun@pon platform]$ ll |awk '{print $1"\t"$9}'
total
drwxr-xr-x build
drwxr-xr-x docs
drwxr-xr-x make
-rwxr-xr-x Makefile
drwxr-xr-x src
drwxr-xr-x tools
[chenyun@pon platform]$
例子:读取proc/device中scull的设备号
#!/bin/sh
module="scull"
major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices)
更详细的参考见:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html