Linux System Programming
pid_t fork();
// fork是UNIX或类UNIX中的分叉函数,
// fork函数将运行着的程序分成2个(几乎)完全一样的进程,
// 每个进程都启动一个从代码的同一位置开始执行的线程。
// 这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
fork()的返回值
父进程返回的是子进程的pid,这个值大于0
子进程返回0;
父子进程执行逻辑
父进程执行pid>0的逻辑,子进程执行pid==0的逻辑
before fork打印一次 after fork 打印两次
man
man 是使用linux编程手册的命令
execl函数族
如果想在一个进程内部执行系统命令或者是应用程序,可以如下方式:先fork(),然后在子进程里面执行execl拉起可执行程序或者命令
pid =forl();
if (pid==0){execl(...);}
sample1执行系统命令
if(pid==0){
execl("/bin/ls",'"ls","-l",NULL);
}
sample2执行自己写的可执行程序
test.c内容
if(pid==0){
execl("./test",'"test","hello","world",NULL);
}
execvp()的基本语法
int execvp(const char* command, char* argv[]);
我们将commend称为PATH
环境变量一部分的任何二进制可执行文件。 因此,如果要运行自定义程序,请确保将其添加到PATH
变量中!
第二个参数( argv
)表示command
的参数列表。 这是一个char*
字符串数组。
命令由于某种原因失败,则execvp()
将返回-1。
waitpid()
原型
pid_t waitpid(pid_t pid,int* status,in options)
pid=-1等待任意子进程
pid>0等待进程id与pid相等的子进程
pid=0 … pid<-1…
status:子进程的退出状态–传出参数
options:设置位WNOFANG,函数非阻塞,设置为0,函数阻塞。
函数返回值
大于0返回回收掉的子进程id 等于-1无子进程 等于0 options==WNOFANG子进程正在进行
clock_gettime()
原型int clock_gettime(clockid_t clk_id, struct timespec *tp);
clockid_t clk_id 用于指定计时时钟的类型,有以下4种
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变。
LOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间 CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
struct timespect用来存储时间的结构,可以精确到纳秒,纳秒为一秒的十亿分之一。
struct timespec
//精确到纳秒
{
time_t tv_sec; //秒
long tv_nsec;//纳秒
}
样例获取某段程序执行时间
int main(){
struct timespec begin;
struct timespec end;
clock_gettime(CLOCK_MONOTONIC, &begin);
{
执行的程序
}
clock_gettime(CLOCK_MONOTONIC, &end);
double time_ = end.tv_sec - begin.tv_sec + ((end.tv_nsec - begin.tv_nsec)/1000000000.0);
return 0;
}
ttime(CLOCK_MONOTONIC, &end);
double time_ = end.tv_sec - begin.tv_sec + ((end.tv_nsec - begin.tv_nsec)/1000000000.0);
return 0;
}