学习之前必须了解基本的概念:
进程,线程,进程3种状态,进程调度以及4种算法,进程同步,死锁,记不清的找度娘。
获取ID
#include<sys/types.h>
#include<unistd.h>
获取本进程ID:
pid_t getpid(void)
获取父进程ID:
pid_t getppid(void)
举例:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(void)
{
printf("PID=%d\n",getpid());
printf("PID=%d\n",getppid());
return 0;
}
进程创建:
#include<unistd.h>
pid_t fork(void)
创建子进程;被调用一次,返回两次,可能3种取值;
1.父进程中,返回子进程PID;
2.子进程中,返回0;
3.错误返回一个负值;
子进程的数据空间,堆栈空间都会从父进程一个copy,而不是共享。
-vfork
pid_t vfork(void)
区别:vfork子进程与父进程共享数据段。
vfork子进程先执行,父进程后执行。
fork次序不确定;
exec函数族:
被执行的程序替换调用它的程序:
区别:
fork创建一个新进程,产生一个新PID;
exec启动一个新程序,替换原有进程,PID不变。
#include<unistd.h>
int execl(const char*path,const char*arg1,...);
path:被执行的程序名
argn:命令行参数,含参数名,以空指针(NULL)结束
举例:
#include<unistd.h>
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
}
#include<unistd.h>
int execp(const char*path,const char*arg1,...);
path:被执行的程序名(不含路径,从path环境变量中查找)。
exmple:
execp("ls","ls","-al","/etc/passwd",(char*)0);
#include<unistd.h>
int execv(const char*path, char*const argv[]);
example:
#include<unistd.h>
main
{
char *argvl[]={"ls","-al","/etc/passwd",(char*)0};
execv("/bin/ls",argv);
}
#include<stdlib.h>
int system(const char*sring);
调用fork产生子进程,由子进程调用/bin/sh -c string来执行参数string所代表的命令。
e:
system("ls -al /etc/passwd");
进程等待:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status)
阻塞该进程,直到某个进程退出。