获取ID
#include<sys/types.h>
#include<unsstd.h>
。pid_t getpid(void)
获取本进程ID
。pid_t gettppid(void)
获取父进程ID
eg:
#include<stdio.h>
#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返回一个负值
创建进程-fork
eg:
#include<sys/types.h>
#include<unistd.h>
int main (void)
{
pid_t pid;
pid = fork();
if(pid<0)
printf("error in fork!%d\n",fork);
else
if(pid==0)
printf("i am the child process,id=%d\n",getpid());
else
printf("i am the parent process,id is %d\n",getppid());
}
在pid=fork()之前,只有一个程序在执行,但在执行了这句话之后,就变成了两个进程在执行了,这两个进程共享代码段,将要执行的吓一跳语句都是if(pid==0).两个进程中,原来就存在的那个进程就被称为父进程,出现新的那个被称为子进程,父子进程区别于进程标志符(PID)不同。
eg:
#include<stdio.h>
#include(unistd.h)
int main(void)
{
pid_t pid;
int count=0;
pid = fork();
count++;
printf("count=%d\n",count);
return
0;
}
运行结果:count =
1
count =
1
子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享,在子进程中对count进行+1操作,并没有影响父进程的count值,父进程的count值仍未0.
创建vfork
#include <sys/tppes.h>
#include<unistd.h>
pid_t vfork(void)
功能:创建子进程。
区别:
1、fork:子进程拷贝父进程的数据段。
vfork:子进程与父进程共享数据段
2、fork:父、子进程执行次序不确定
vfork:子进程先运行,父进程后运行
exec函数族
exec用被执行的程序替换调用它的程序。
区别:
fork创建一个新的进程,产生新的PID。
exec启动一个新程序,替换原有的进程,因此进程PID不会改变。
#include<unistd.h>
int execl(const
char *path,const
char * arg1,...)
参数:
path:被执行程序名(含完整路径)
arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束
eg:
#include<inistd.h>
int main(void)
{
execl("/bin/ls","ls","-al","/etc/passwd",(char
*)0");
}
执行效果和 ls -al /etc/passwd
一样
int execlp(const
char*path,const cahr * arg1,...)
参数:
arg1-argn:被执行程序所需的命令行参数,含程序名,以空指针NULL结束
path:被执行程序名(不含路径,将从path环境变量中查找改程序
int execv(const
char * path,char *const argv[])
参数;
path:被执行程序名(含路径)
argv[]:所需命令行参数组。
#include <stdlib.h>
int system(const
char*string)
功能:调用fork产生子进程,由子进程调用/bin/sh -c string
来执行string所代表的命令。
eg:system.c
#include<stdlib.h>
int main(void)
{
system("ls -al /etc/pawwsd");
}
进程等待
#include<sys/types.h>
#include<sys/wait.h>
pid_ wait(int status)
功能:阻塞该进程,直到其某个子进程退出。
eg:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
/*
*
* */
int main(void)
{
pid_t child;
/* 创建子进程*/
if((child=fork())==-1)
{
printf("Fork Error : %s\n", strerror(errno));
exit(1);
}
else
{
if(child==0)
// 子进程
{
printf("the child process is run\n");
sleep(1);
//子进程睡眠一秒,但并没有去运行父进程
printf("I am the child: %d\n", getpid());
exit(0);
}
else
//父进程
{
wait(NULL);
//等到子进程退出,父进程才会运行
printf("the father process is run\n");
printf("I am the father:%d\n",getpid());
return
0;
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。