[linux专题]linux进程启动方法

目录

1.编写一个测试进程

2.使用system 方式调用

 3.使用exec 方式调用

4.使用fock方式调用

5.说明


1.编写一个测试进程

#include 
#include 

int main(void)
{
    printf("this is pid test \n");
    return 0;
}

编译

gcc pid_test.c -o pid_test

得到pid_test 测试程序

2.使用system 方式调用

int system(const char *string);

编写system调用代码

#include 
#include 
 
int main()
{
    system("/home/agm/project/agm_test/pid_test/pid_test");
    printf("system done\n");
    exit(0);
}

编译

gcc pid_system.c -o pid_system

得到pid_system 程序

调用结果为

 

 3.使用exec 方式调用

int execl(const char *path,const char *arg0,...,(char*)0);
int execlp(const char *file,const char *arg0,...,(char*)0);
int execle(const char *path,const char *arg0,...,(char*)0,char *const envp[]);

int execv(cosnt char *path,char *const argv[]);
int execvp(cosnt char *file,char *const argv[]);
int execve(cosnt char *path,char *const argv[],char *const envp[]);
  • path/file:进程命令路径/进程命令名
  • argc:命令参数列表
  • envp:新进程的环境变量
#include 
#include 
 
int main()
{
    execlp("/home/agm/project/agm_test/pid_test/pid_test","",(char*)0);
    printf("exec Done \n");
    exit(0);
}

编译执行,得到结果如下,这里调用后替换了,不会打印 done 

4.使用fock方式调用

#include
#include
#include

int main()
{
    int stat = 0;
    pid_t pid = fork();
    switch(pid)
    {
        case -1:/*fork error*/
            perror("fork failed");
            exit(1);
            break;
        case 0:/*fork test*/
            printf("\n");
            execlp("/home/agm/project/agm_test/pid_test/pid_test","",(char*)0);
            break;
        default:/*parent*/
            pid = wait(&stat);
            printf("fork parent,test thread is done\n");
            break;
    }
    exit(0);
}

编译执行得到结果如下

5.说明

  • system函数最简单,启动shell进程,并在shell进程中执行新的进程。效率不高,system函数必须等待子进程返回才能接着执行。
  • exec系列函数用新进程替换掉原进程,但不会返回到原进程,除非调用失败。该函数继承了许多原进程的特性,效率也较高。
  • fork函数,复制一个子进程,和父进程一模一样,但是拥有自己的内存空间。父子进程执行互不影响。需要注意僵尸子进程的问题。

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