c语言进程创建、等待和退出

c语言进程创建、等待和退出

  1. 创建进程

fork()函数:函数返回值类型为pid_t
若程序运行在父进程中,函数返回的PID为子进程今年称号;
弱运行在子进程中返回PID为0.

#include 
#include 
#include 

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 
#include 
#include 

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);
}
  1. 修改进程

exec()函数族:
函数名字中的字符含义:
p ⇒ \Rightarrow path,只需写出文件名,函数自动搜索系统path路径
l ⇒ \Rightarrow list,表示将每个命令行参数都传给他,参数个数可变,最后输入NULL表示结束
v ⇒ \Rightarrow vector,该类函数只支持使用参数数组,数组最后一个指针也要输入NULL,类似于argv[]
e ⇒ \Rightarrow environment,表示将一份新的环境变量表传给他

#include 
#include 
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 
#include 
#include 

using namespace std;

extern char **environ

int main()
{
    //execve 创建一个子进程,在子进程里执行文件
    execve("new2",argv,environ);
    cout << "正常情况不输出" << endl;
    return 0;
}


/*new2.c文件*/
#include 
#include 
#include 

using namespace std;

int main()
{
    puts("this is new2");
    return 0;
}
#include 
#include 
#include 

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;
}
  1. 等待进程

wait():函数首先判断进程是否存在,不存在直接退出并且提示错误;
进程存在则将父进程挂起,直到子进程结束。

#include 
#include 
#include 
#include 

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);
    }
}
  1. 进程结束

exit() 和 _exit() 都没有返回值
fork() ⇒ \Rightarrow exit()
vfork() ⇒ \Rightarrow _exit()

文中代码和知识点来自《Linux C从入门到精通》

你可能感兴趣的:(c语言进程)