1、进程标识
#include <unistd.h>
pid_t getpid(void); //返回值:调用进程的进程ID
pid_t getppid(void); //返回值:调用进程的父进程ID
2、进程等待
#include <sys/wait.h>
pid_t wait(int *staloc);
功能:阻塞该进程,直到某个子进程退出
3、进程创建
#include <uinstd.h>
pid_t fork(void);
功能:创建子进程
fork被调用一次,返回两次,有如下三种不同的返回值。
在父进程中:fork返回新创建的子进程的PID;
在子进程中:fork返回0;
若出错,fork返回-1.
子进程和父进程继续执行fork调用以后的指令。子进程是父进程的读本。例如,子进程获得父进程的的数据空间、堆和栈的副本。注意,这是子进程自己本身所拥有的副本。父进程和子进程并不同享这些存储空间部分。父进程和子进程共享正文段。
#include <unistd.h>
pid_t vfork(void);
功能:创建子进程
demo:
#include <apue.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if (pid < 0){
err_sys("fork error!");
exit(1);
}
else if (pid == 0){
printf("child process ID = %d\n", getpid());
}
else {
wait(NULL);//等待子进退出
printf("parent process ID = %d\n", getppid());
}
return 0;
fork 和 vfork 的区别:
(1)、fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
(2)、fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
展示二者区别的demo:
#include <apue.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
int counter = 0;
fork();
counter++;
printf("counter = %d\n", counter);
return 0;
}
输出结果:
counter = 1
counter = 1
#include <unistd.h>
int main(int argc, const char *argv[])
{
int counter = 0;
vfork();
counter++;
printf("counter = %d\n", counter);
return 0;
}
输出结果:
counter = 1
counter = 2
4、exec函数族
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... ,const char *argn, (char *)0);
int execv(const char *pathbame, char *const argv[]);
int execlp(const char *filename, const char *arg0, ... ,const char *argn, (char *)0);
int execvp(const char *filename, char *const argv[]);
demo
#include <apue.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *)0);
return 0;
}
#include <apue.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *arg[] = {"ls", "-al", "/etc/passwd", (char *)0};
execv("/bin/ls", arg);
return 0;
}