嵌入式学习 Linux进程控制 实践篇

  • 嵌入式学习 Linux进程控制 实践篇
    • 获取进程ID
    • 创建子进程
      • fork
      • vfork
      • exec函数族
        • execl
        • execlp
        • execv
        • system.c
    • 进程等待

嵌入式学习 Linux进程控制 实践篇

获取进程ID

/*
* #include 
* #include 
*/
pid_t getpid(); // 获取本进程ID, 查询详细信息 man getpid
pid_t getppid(); // 获取父进程ID

创建子进程

fork

关键API:fork。fork的核心是调用一次返回两次。一次是父进程返回的,一次是子进程返回的。父进程中,fork返回
创建的子进程PID。在子进程中,fork返回0。如果出现错误,fork返回一个负值。

#include 
#include 

int main(){
    pid_t pid;
    int count = 0;
    pid = fork();
    count++;
    printf("count %d\r\n", count);
    return 0;
}

输出两次,count两次count都是1。原因是堆栈内容被拷贝了。

vfork

区别

  • fork子进程拷贝父进程的数据段
  • vfork子进程共享父进程数据段
  • fork父子进程执行次序不确定
  • vfork子进程先运行,父进程后运行

exec函数族

exec启动一个新的程序,替换原有的进程,此进程PID不会变。

execl

/*
* #include 
* arg1~argn:被执行程序需要的命令行参数,包含程序名。以空指针NULL结束
*/
int execl(const char * path, const char * arg1, ...);

eg

#include 

int main(){
    execl("/bin/ls", "ls", "-al", "/etc/passwd", NULL);
}

execlp

/*
* #include 
* path:不包含路径,将从path环境变量中查找该程序
* arg1~argn:被执行程序需要的命令行参数,包含程序名。以空指针NULL结束
*/
int execlp(const char * path, const char * arg1, ...);

execv

/*
* #include 
* path:完整路径 
* arg1~argn:被执行程序需要的命令行参数,包含程序名。以空指针NULL结束
*/
int execv(const char * path, const char * arg1[]);

system.c

#include 
void main(){
    system("ls -al /etc/passwd"); // 开启子进程运行, ls
}

进程等待

/*
* #include 
* #include 
* 祖师当前进程,直到子进程退出
*/
pid_t wait(int * status); 

你可能感兴趣的:(kali,linux)