目录
1.编写一个测试进程
#include <stdio.h>
#include <stdlib.h>
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 <stdlib.h>
#include <stdio.h>
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 <stdlib.h>
#include <stdio.h>
int main()
{
execlp("/home/agm/project/agm_test/pid_test/pid_test","",(char*)0);
printf("exec Done \n");
exit(0);
}
编译执行,得到结果如下,这里调用后替换了,不会打印 done

4.使用fock方式调用
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
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函数,复制一个子进程,和父进程一模一样,但是拥有自己的内存空间。父子进程执行互不影响。需要注意僵尸子进程的问题。
2001

被折叠的 条评论
为什么被折叠?



