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

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

获取进程ID

/*
* #include <sys/types.h>
* #include <unistd.h>
*/
pid_t getpid(); // 获取本进程ID, 查询详细信息 man getpid
pid_t getppid(); // 获取父进程ID

创建子进程

fork

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

#include <unistd.h>
#include <stdio.h>

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 <unistd.h>
* arg1~argn:被执行程序需要的命令行参数,包含程序名。以空指针NULL结束
*/
int execl(const char * path, const char * arg1, ...);

eg

#include <unistd.h>

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

execlp

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

execv

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

system.c

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

进程等待

/*
* #include <sys/types.h>
* #include <unistd.h>
* 祖师当前进程,直到子进程退出
*/
pid_t wait(int * status); 

猜你喜欢

转载自blog.csdn.net/qonsnow/article/details/81542813