一、进程 与 线程:
1. strace命令: 跟踪进程系统调用的情况。
strace -o output.txt -T -tt -e trace=all -p 28979
strace -T 记录每个系统调用所花费的时间
strace -t (或者 -tt)记录每个系统调用发生时的时间(时分秒的格式)
strace -s 1024 显示系统调用参数时,对于字符串显示的长度, 默认是32,如果字符串参数很长,很多信息显示不出来, 则可以使用strace -s 1024
strace -e trace=nanosleep 只记录相关的系统调用信息。
-e trace=network // 只记录和网络api相关的系统调用
-e trace=file // 只记录涉及到文件名的系统调用
-e trace=desc // 只记录涉及到文件句柄的系统调用
还有其他的包括process,ipc,signal等。
如:使用strace命令跟踪top命令的行为。
另外:ltrace命令可以跟踪进程调用库函数的情况。
2. fork创建进程
1 //forkonly.cpp: 2 #include <sys/types.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 6 int main() 7 { 8 pid_t pid; 9 pid=fork();// pid==0表示子进程, pid>0表示父进程。 10 return 1; 11 }
编译: g++ forkonly.cpp -o forkonly.exe
查看系统调用: strace ./forkonly.exe
发现fork会用以下方式调用clone函数:
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f010b406780) = 4490
3. pthread_create创建线程
函数声明:
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
若成功则返回0,否则返回出错编号
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
1 #include <pthread.h> 2 #include <stdlib.h> 3 #include <iostream> 4 5 void *func( void * in) 6 { 7 std::cout<<*(char *) in<<std::endl; 8 } 9 10 int main() 11 { 12 pthread_t ntid; 13 char c = 'x'; 14 pthread_create(&ntid, NULL, func, (void *)&c); 15 sleep(10); //防止主线程过早退出 16 return 1; 17 }
用strace查看pthread_create调用clone函数的形式:
clone(child_stack=0x408c3240, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x408c39d0, tls=0x408c3940, child_tidptr=0x408c39d0) = 20449