c语言进程创建、等待和退出
- 创建进程
fork()函数:函数返回值类型为pid_t
若程序运行在父进程中,函数返回的PID为子进程今年称号;
弱运行在子进程中返回PID为0.
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(void)
{
pid_t pid;
pid = fork();//创建新进程
if(pid == 0)//子进程
{
for(int i = 0;i < 50;i++)
cout << i << endl;
}
else if(pid > 0)
{
for(int i = 50;i < 100;i++)
cout << "*Father Process*" << endl;
}
else
{
cout << "ERRO" << endl;
exit(1);
}
exit(0);
}
vfork():与fork()函数的区别是,在创建线程时fork()函数会复制父进程的所有资源
vfork()不复制资源,而是与父进程共享地址,此时,修改子进程的量就会修改父进程
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int g_var = 10;
int main(void)
{
int l_var = 10;
pid_t pid;
pid = vfork();//创建新进程
if(pid == 0)//子进程
{
g_var ++;
l_var++;
cout << "var in child process:" << endl;
cout << "g_var = " << g_var << endl;
cout << "l_var = " << l_var << endl;
}
else if(pid > 0)
{
cout << "var in parent process:" << endl;
cout << "g_var = " << g_var << endl;
cout << "l_var = " << l_var << endl;
}
else
{
cout << "ERRO" << endl;
exit(1);
}
exit(0);
}
- 修改进程
exec()函数族:
函数名字中的字符含义:
p
⇒
\Rightarrow
⇒ path,只需写出文件名,函数自动搜索系统path路径
l
⇒
\Rightarrow
⇒ list,表示将每个命令行参数都传给他,参数个数可变,最后输入NULL表示结束
v
⇒
\Rightarrow
⇒ vector,该类函数只支持使用参数数组,数组最后一个指针也要输入NULL,类似于argv[]
e
⇒
\Rightarrow
⇒ environment,表示将一份新的环境变量表传给他
#include <unistd.h>
#include <sys/types.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
函数名字中的字符含义:
p
⇒
\Rightarrow
⇒ path,只需写出文件名,函数自动搜索系统path路径
l
⇒
\Rightarrow
⇒ list,表示将每个命令行参数都传给他,参数个数可变,最后输入NULL表示结束
v
⇒
\Rightarrow
⇒ vector,该类函数只支持使用参数数组,数组最后一个指针也要输入NULL,类似于argv[]
e
⇒
\Rightarrow
⇒ environment,表示将一份新的环境变量表传给他
/*execve.c文件*/
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
using namespace std;
extern char **environ
int main()
{
//execve 创建一个子进程,在子进程里执行文件
execve("new2",argv,environ);
cout << "正常情况不输出" << endl;
return 0;
}
/*new2.c文件*/
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
puts("this is new2");
return 0;
}
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
//vi 的等效用法
if(argc < 2)
{
cout << "vi 的等效用法" << endl;
cout << "filename" << argv[0] << endl;
return -1;
}
execlp("/bin/vi","vi",argv[1],(char*)NULL);
return 0;
}
- 等待进程
wait():函数首先判断进程是否存在,不存在直接退出并且提示错误;
进程存在则将父进程挂起,直到子进程结束。
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
int status;
pid_t pid;
pid = fork();
if(pid < 0)
{
cout << "ERRO" << endl;
exit(0);
}
else id(pid == 0)
{
cout << "*******" << endl;
exit(2);
}
//调用wait等待子进程结束
if(wait(&status) != pid)
{
cout << "parent process" << endl;
exit(0);
}
}
- 进程结束
exit() 和 _exit() 都没有返回值
fork()
⇒
\Rightarrow
⇒ exit()
vfork()
⇒
\Rightarrow
⇒ _exit()
文中代码和知识点来自《Linux C从入门到精通》