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