APUE课老师留了个作业,其中涉及到派生子进程,再调用execvp函数。这里主要写写,execvp这个函数的参数传递方式,以及fork的子函数和execvp执行后由一个全新的程序替换当前正文、数据、堆和栈段,对上述两点的一些使用心得。 首先说参数传递。之所以选择execvp这个函数是因为该函数可以传递变长参数,也就是说,虽然参数列表中只是两个指针变量,但由于第二个指针变量是变长指针数组,第二个参数传入参数个数实际是该数组的长度,可以通过控制指针数组的长度来控制传入的参数数量。控制变长指针数组的方法是指定变长指针数组中第一个为NULL的位置,也就是说在将你所传入的参数指针的下一个位置置NULL。这里要说说,我在第一次使用时,以为只要变长数组指针所指向的空间均为'\0',即可控制传入的参数,后来发现会出现未知参数,用gdb调试时,发现指向的全'\0'空间也被传递给了execvp函数,导致了函数调用的失败。从本质上来讲,这里是由于对变长指针数组控制方式的不明确造成的。后来将指针数组的参数传递位的下一个指针值置空即满足了条件。 再说对于对原函数的正文、数据、堆和栈段的替换问题的理解。(未完待续)
阅读(5577) | 评论(0) | 转发(0) |