环境:Vmware Workstation;CentOS-6.4-x86_64
说明:
1、execve函数执行的本质是:在程序1中执行execve函数调用程序2,那么程序2就会完全霸占程序1的内存空间,从而实现一个程序调用另一个程序。
2、通过execve调用的程序,两个进程的PID是完全一样的。
图解说明:
程序说明:验证通过execve调用的程序的进程PID相同。
步骤:
1、编写makefile文件:
.SUFFIXES:.c .o
CC=gcc
SRCS1=main.c
OBJS1=$(SRCS1:.c=.o)
EXEC1=main
SRCS2=other.c
OBJS2=$(SRCS2:.c=.o)
EXEC2=other
start: $(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo "-----------------------------OK-----------------------"
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm -rf $(EXEC1) $(OBJS1)
rm -rf $(EXEC2) $(OBJS2)
2、编写源文件other.c:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int arg, char *args[])
{
int id = getpid();
printf("other PID = %d\n", id);
return 0;
}
3、编写源文件main.c:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
// 得到进程的PID
printf("main PID = %d\n", getpid());
// 定义字符数组,保存程序执行的参数
char *args[] = { "/home/negivup/mycode/other", NULL };
// 调用execve执行程序
execve("/home/negivup/mycode/other", args, NULL);
return 0;
}
4、编译并执行程序:[negivup@negivup mycode]$ make
gcc -Wall -o main.o -c main.c
gcc -Wall -o other.o -c other.c
gcc -o main main.o
gcc -o other other.o
-----------------------------OK-----------------------
[negivup@negivup mycode]$ main
main PID = 8179
other PID = 8179
从程序的执行效果中可以看出,进程main和进程other的PID是相同的。
PS:根据传智播客视频学习整理得出。