1、获取进程ID
pid_t getpid(void); //获取子进程
pid_t getppid(void); //获取父进程
实例:直接获取进程ID并打印
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("PID is %d\n",getpid());
printf("PPID is %d\n",getppid());
return 0;
}
运行结果
2、创建进程
pid_t fork(void); //创建进程 ,子进程具有数据结构、堆栈副本
实例:中途创建子进程,判断返回进程号不同执行不同程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork(); //创建子进程
if(pid<0) //创建失败
{
printf("error\n");
}
else if(pid==0) //子进程
{
printf("PID is %d\n",getpid());
}
else //父进程
{
printf("PPID is %d\n",getpid());
}
return 0;
}
运行结果
fork在子进程中返回0,在父进程中返回子进程ID号,失败返回-1
pid_t vfork(void)
实例:vfork创建子进程后,共同执行count,并将其打印
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
int count=0;
//
pid = vfork();
count++;
printf("count is :%d\n",count);
exit(0);
}
运行结果
vfork创建后,父子进程共享数据结构、堆栈。
并由父进程先运行剩下的程序,结束后子进程再运行
3、进程中调用现成脚本
1.exec家族一共有六个函数,分别是:
(1)int execl(const char *path, const char *arg, ......);
(2)int execle(const char *path, const char *arg, ...... , char * const envp[]);
(3)int execv(const char *path, char *const argv[]);
(4)int execve(const char *filename, char *const argv[], char *const envp[]);
(5)int execvp(const char *file, char * const argv[]);
(6)int execlp(const char *file, const char *arg, ......);
execl实例:子进程中调用"ls -all"命令(对象是本目录)
父进程中调用"ls -all"命令(对象是 /mnt )
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid =fork();
if(pid<0)
{
printf("error");
}
else if(pid == 0) //子进程
{
execl("/bin/ls","ls","-all",(char *)0);
printf("PID");
}
else //父进程
{
execl("/bin/ls","ls","-all","/mnt",(char *)0);
printf("PPID");
}
printf("hello,i am here");
exit(0);
}
运行结果
注意:execl调用后,程序不返回,故剩下的printf不执行
execlp实例
#include <unistd.h>
int main(void)
{
execlp("ls","ls","-all",(char *)0);
return 0;
}
运行结果
execv实例
#include <unistd.h>
int main(void)
{
char *argv[]={"ls","-all","/mnt",(char *)0};
execv("/bin/ls",argv);
return 0;
}
运行结果
system实例
#include <stdlib.h>
int main(void)
{
system("ls -all /mnt");
}
运行结果
wait实例:子进程sleep,且父进程等待子进程结束,子进程sleep执行完后,接着父进程执行
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid,pr;
//
pid = fork();
if(pid<0)
{
printf("error\n");
}
else if(pid==0)
{
printf("PID is %d\n",getpid());
sleep(10);
}
else
{
pr = wait(NULL);
printf("PPID is %d\n",pr);
}
return 0;
}
运行结果
十秒之后: