交个朋友 点这里
#lsof usage Show port listen
#show port 80 lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 14052 root 6u IPv4 303704 0t0 TCP *:http (LISTEN) nginx 14053 nobody 6u IPv4 303704 0t0 TCP *:http (LISTEN) #add sudo update-alternatives --install /usr/bin/phpize phpize /home/jason/php/5.4.11/bin/phpize 1 #config sudo update-alternatives --config phpize #remove sudo update-alternatives --remove phpize /usr/local/php/5.4.11/bin/php-phpizehttps://github.com/torvalds/linux/blob/master/mm/mmap.c#L286
#include <stdio.h> #include <unistd.h> int main() { int *base = sbrk(0); brk(base + 1);//expand 4bytes(sizeof int) memory printf("base.addr=%p\n", base); printf("base+1.addr=%p\n", base + 1); printf("After, brk(), current.addr=%p\n", sbrk(0)); *base = 1; #comment out brk, It will seg here. *(base + 1) = 1;#Why It won't seg me here. return 0; }#include <stdio.h> #include <unistd.h> int main() { int *base = sbrk(0); int pagesize = getpagesize(); brk(base + 1);//Here are page aligned!!!!!!!! printf("pagesize=%d\n", pagesize); printf("base.addr=%p\n", base); printf("base+1.addr=%p\n", base + 1); printf("After, brk(), current.addr=%p\n", sbrk(0)); *base = 1; *(base + pagesize/sizeof(int) - 1) = 1; printf("Next, please seg me!\n"); *(base + pagesize/sizeof(int)) = 1; //sleep(10000); sleep a long time, I need to get //the virtual address range of the heap of this program //sudo cat /proc/PID/maps |grep heap return 0; }sudo cat /proc/PID/maps |grep heap #This command could get the virtual address of heap, result are the same #with output of above progrma #通过这个命令拿到堆的地址,和上面程序打印出来的地址完全一模一样> dpkg -S /bin/ls coreutils: /bin/ls #So coreutils is the package that contains command ls.Then goto this page Ubuntu – Ubuntu Packages Search, search it by using that keyword
然后到这个页面Ubuntu – Ubuntu Packages Search里用得到的关键字搜索
top's package download page: http://packages.ubuntu.com/trusty/procps ,On the right side!
top所在包的下载页面 http://packages.ubuntu.com/trusty/procps 右边有一个souce下载。是他是他就是他!
Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 0 kB Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB Both Shared and Clean has two part of Clean and Dirty. But what does that respent? see stackexchange
Dirty 表示页是脏的, 即与磁盘后备文件的内容不一致, 需要(或正在)写回后备设备 Clean 表示页的内容和后备是一致的.
See fs/proc/task_mmu.c#show_smap See /mm/pagewalk.c#walk_page_range
For both difference of private and shared, dirty and clean : See private_dirty_modify
When talking about private and shared, that is simple, as code shows,
if (page_mapcount(page)>=2) { //shared } else { //private } ref: How much memory are applications really using? pagemap - The Linux Kernel Archives
fcntl(fd, F_SETFD, FD_CLOEXEC)
It sets the close-on-exec flag for the file descriptor, which causes the file descriptor to be automatically (and atomically) closed when any of the exec-family functions succeed.stackoverflow
#include <stdio.h> #include <unistd.h> int main() { int pid = -1; char buf[10] = {0}; pid = fork(); if (pid == -1) { perror("fork"); } if (pid == 0) {//child printf("[child]sleeping\n"); sleep(2);//sleep to wait parent exit; write(1, "[child]nihao\n", 13); if (read(0, buf, 1) == -1) { printf("[child]ops, read error\n"); } _exit(0); } else { printf("[parent]exit\n"); //if (waitpid(pid, NULL, 0) < 0) { // perror("waitpid error\n"); //} _exit(0); } }sunan at Sunan-ubuntu in ~/c/more ○ ./fd-on-close [parent]exit [child]sleeping sunan at Sunan-ubuntu in ~/c/more ○ [child]nihao [child]ops, read error See ? You can still write, but can't read.
This graph show, async request has no big benefit compare with normal request So, I take a took of libcurl and run another example: https://raw.githubusercontent.com/bagder/curl/master/docs/examples/multi-app.c This guy was the author of libcurl :[https://github.com/bagder/]
I think htop won't see the thread was it create and destory too fast. since debug could see every thread by it.
By the way, HTOP are a really good program!
See this Makefile
CC=gcc all : multi-app httpcustomheader 10-at-a-time multi-app: multi-app.c ${CC} -g multi-app.c -lcurl -o multi-app httpcustomheader: httpcustomheader.c ${CC} -g httpcustomheader.c -lcurl -o httpcustomheader 10-at-a-time: 10-at-a-time.c ${CC} -g 10-at-a-time.c -L/usr/local/curl/lib -I/usr/local/include -lcurl -o 10-at-a-timeNote that -I means include path. -L means library path. -l seems indicates we need that library! Also, We can use this LD_PRELOAD=/usr/local/curl/lib/libcurl.so strace -eclone ./multi-app to force our multi-app use libcurl.so as it's library. You can use LD_PRELOAD=/usr/local/curl/lib/libcurl.so strace -eopen ./multi-app to comfirm that. export LD_LIBRARY_PATH=/usr/local/curl/lib seems another good choose, But be aware of this:
open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3 open("/lib/lib/x86_64-linux-gnu/liblsp.so", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/tls/x86_64/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/local/curl/lib/tls/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/local/curl/lib/x86_64/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/local/curl/lib/libcurl.so.4", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/libidn.so.11", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/lib/x86_64-linux-gnu/libidn.so.11", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/librtmp.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/lib/x86_64-linux-gnu/librtmp.so.0", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libssl.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/libcrypto.so.1.0.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libcrypto.so.1.0.0", O_RDONLY|O_CLOEXEC) = 3 open("/usr/local/curl/lib/liblber-2.4.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) It will load all the shared library from this path. So, I don't think this is a good ieda.
See here
Inside ./a.out, bash create execute clone() and then setpgid(0, PID) then execve(a.out...)
当你执行./a.out的时候,系统一次执行clone()然后,setpgid(0, PID) 然后 execve(a.out...)
//newgroup.c #include <stdlib.h> #include <stdio.h> int main() { printf("This is a marker\n"); sleep(1000); return 0; }Let's compile this file to newgroup and then use strace to trace our zsh,
In my test, the PID of zsh is 9421, so simply open a new terminal and execute this:
sudo strace -esetpgid,execve,write,clone -p 9421 -f -vAnd then execute our newgroup:
./newgroupOutputs looks like this:
Process 9421 attached write(1, "\33[?1l\33>", 7) = 7 write(10, "\r\n", 2) = 2 write(3, ": 1446459559:0;./newgroup \n", 27) = 27 write(1, "\33]2;./newgroup\7", 15) = 15 write(1, "\33]1;./newgroup\7", 15) = 15 clone(Process 17943 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4de73aba10) = 17943 [pid 17943] setpgid(0, 17943) = 0 [pid 17943] execve("./newgroup", ["./newgroup"], ["SESSION_MANAGER=local/Sunan-ubun"..., "XDG_SESSION_ID=c2", "LC_IDENTIFICATION=en_US.UTF-8", "XDG_SEAT=seat0", "DISPLAY=:0", "JOB=dbus", "COLORTERM=gnome-terminal", "GNOME_KEYRING_CONTROL=/run/user/"..., "GNOME_DESKTOP_SESSION_ID=this-is"..., "DEFAULTS_PATH=/usr/share/gconf/u"..., "QT_QPA_PLATFORMTHEME=appmenu-qt5", "LOGNAME=sunan", "TEXTDOMAIN=im-config", "INSTANCE=", "LC_TIME=en_US.UTF-8", "SHELL=/bin/zsh", "PATH=/home/sunan/google-cloud-sd"..., "LC_NUMERIC=en_US.UTF-8", "LC_PAPER=en_US.UTF-8", "IM_CONFIG_PHASE=1", "TEXTDOMAINDIR=/usr/share/locale/", "CLUTTER_IM_MODULE=xim", "QT4_IM_MODULE=fcitx", "XDG_SESSION_PATH=/org/freedeskto"..., "SESSION=ubuntu", "SSH_AUTH_SOCK=/run/user/1000/key"..., "XDG_MENU_PREFIX=gnome-", "XAUTHORITY=/home/sunan/.Xauthori"..., "QT_IM_MODULE=xim", "GDMSESSION=ubuntu", "XMODIFIERS=@im=fcitx", "LC_MEASUREMENT=en_US.UTF-8", "LC_ADDRESS=en_US.UTF-8", "XDG_CONFIG_DIRS=/etc/xdg/xdg-ubu"..., "MANDATORY_PATH=/usr/share/gconf/"..., "UPSTART_SESSION=unix:abstract=/c"..., "XDG_RUNTIME_DIR=/run/user/1000", "DESKTOP_SESSION=ubuntu", "GTK_IM_MODULE=fcitx", "GTK_MODULES=overlay-scrollbar:un"..., "USER=sunan", "PWD=/home/sunan/c/more", "VTE_VERSION=3409", "LC_MONETARY=en_US.UTF-8", "HOME=/home/sunan", "XDG_SEAT_PATH=/org/freedesktop/D"..., "XDG_DATA_DIRS=/usr/share/ubuntu:"..., "LANGUAGE=fr_FR:en", "SELINUX_INIT=YES", "COMPIZ_CONFIG_PROFILE=ubuntu", "XDG_GREETER_DATA_DIR=/var/lib/li"..., "COMPIZ_BIN_PATH=/usr/bin/", "LC_NAME=en_US.UTF-8", "LANG=en_US.UTF-8", "GPG_AGENT_INFO=/run/user/1000/ke"..., "SHLVL=1", "WINDOWID=75497483", "XDG_VTNR=7", "GDM_LANG=fr_FR", "SESSIONTYPE=gnome-session", "DBUS_SESSION_BUS_ADDRESS=unix:ab"..., "XDG_CURRENT_DESKTOP=Unity", "TERM=xterm", "GNOME_KEYRING_PID=2567", "LC_TELEPHONE=en_US.UTF-8", "OLDPWD=/home/sunan/c", "ZSH=/home/sunan/.oh-my-zsh", "GOPATH=/home/sunan/golang", "GOROOT=/home/sunan/go/src/go1.5", "PAGER=less", "LESS=-R", "LC_CTYPE=fr_FR.UTF-8", "LSCOLORS=Gxfxcxdxbxegedabagacad", "_=/home/sunan/c/more/./newgroup"]) = 0 [pid 17943] write(1, "This is a marker\n", 17) = 17 How to free cached mem in Linux
http://stackoverflow.com/questions/10516201/updating-file-permissions-only-in-git