一.获取ID:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
获取本进程ID
pid_t getppid(void);
获取父进程ID
例:
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
printf("PID = %d\n",getpid());
printf("PPID = %d\n",getppid());
return 0;
}
二.进程创建
#include <unistd.h>
pid_t fork(void);
创建子进程
fork被调用一次返回两次,他可能有三种不同的返回值:
1.在父进程中fork返回新创建的子进程的PID。
2.在子进程中,fork返回0.
3. 如果出现错误,fork返回一个负值
例:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("error in fork!\n");
}
else if (pid == 0)
{
printf("I am the child process,ID is %s\n",getpid());
}
else
{
printf("I am the parent process,ID is %d\n",getpid());
}
return 0;
}
考虑以下代码的运行结果:
#include <stdio.h>
int main(void)
{
pid_t pid;
int count = 0;
pid = fork();
count++;
printf("count = %d\n",count);
return 0;
}
它会打印两次count,但是两次值都是1.现在能看出使用fork的情况了吧。
pid_t vfork(void);
创建子进程
区别:
1·vfork:子进程与父进程共享数据段。
fork: 子进程拷贝父进程的数据段。
2·fork: 父,子进程的执行次序不确定。
vfork: 子进程先运行,父进程在运行
现在把上面的思考中的fork换成vfork后,在想想会是什么结果。
三.exec函数族
exec用被执行的程序替换调用它的程序
区别:
fork创建一个新的进程,产生一个新的PID。
exec启动一个新的程序,替换原有的进程,PID不变。(好像这个做坏事的时候可以用,(*^__^*) 嘻嘻……)
1. #include <unistd.h>
int execl (const char *path,const char *arg1,········,argn);
path:被执行的程序名(包含完整路径)
arg1-argn:被执行程序所需要的命令,含参数含程序名,以空指针(NULL)结束 。
例:
int main(void)
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
return 0;
}
2.
int execlp(const char *path,const char *arg1.······argn);
path:被执行的程序名(不包含路径,将从Path环境变量中直接找该程序)
arg1-argn:被执行的程序所需的命令行参数,含程序名,以空指针(NULL)结束
例:
int main(void)
{
execlp("ls","ls","-al","/etc/passwd",(char*)0);
return 0;
}
3.
int execv(const char *path,char * const argv[]);
path:被执行的程序名(含完整路径)
argv[]:被执行程序所需要的命令行参数数组
例:
int main(void)
{
char *argv[]={"ls","-al","/etc/passwd",(char*)0};
execv("/bin/ls",argv);
return 0;
}
4.
int system(const char * string);
调用fork产生一个子进程,由子进程来调用/bin/ls来执行参数,string代表的命令。
例:
int main(void)
{
system("ls -al /etc/passwd");
return 0;
}
四.进程等待
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
阻塞该进程,直到某个子进程退出。
例:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pc,pr;
pc = fork();
if (pc == 0) //如果是子进程
{
printf("This is child process with pid of %d\n",getpid());
sleep(10); //睡眠10秒
}
else if (pc > 0) //如果是父进程
{
pr = wait(NULL);//等待
printf("I catched a child process with pid of %d\n",pr);
}
exit(0);
return 0;
}