一、进程 与 线程:
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

 

 

 

 

 

 
posted on 2014-03-12 11:03  yaozhaoyz  阅读(213)  评论(0编辑  收藏  举报