为何execlp()函数调用中需要连续传入两次argv[1]?
关于execlp()函数两次传入argv[1]的疑问解答
问题场景
执行程序/a.out echo first hello cool时,原代码中execlp(argv[1], argv[1], argv[i], NULL)能正常输出first、hello、cool;但修改为只传入一次argv[1]后,看不到echo的输出,仅能确认程序被执行了三次。
核心原因:execlp的参数规则
execlp的参数分为两部分:
- 第一个参数:要启动的程序名称/路径,execlp会通过PATH环境变量查找该程序的可执行文件。
- 从第二个参数开始:传递给新程序的命令行参数列表,其中第一个参数(execlp的第二个参数)对应新程序的
argv[0],后续参数对应argv[1]、argv[2]...,必须以NULL结尾。
Unix/Linux程序的通用惯例是:argv[0]代表程序自身的名称(比如echo的argv[0]通常是"echo"),程序的功能参数从argv[1]开始。
结合你的代码分析
原代码中的
execlp(argv[1], argv[1], argv[i], NULL):- 第一个
argv[1]:告诉execlp要启动的程序是echo - 第二个
argv[1]:作为echo的argv[0],符合程序惯例 argv[i]:作为echo的argv[1],也就是echo要输出的内容
因此每次执行echo都会正确输出对应的字符串。
- 第一个
修改为只传一次
argv[1]的情况:
假设你改成execlp(argv[1], NULL),传递给echo的参数列表为空——echo执行时会认为没有需要输出的内容,自然不会产生输出;如果改成execlp(argv[1], argv[i], NULL),则echo的argv[0]变成了first/hello/cool,而它的功能参数argv[1]不存在,同样不会输出任何内容。
但echo进程确实正常启动并退出了,父进程通过wait捕获到退出状态并打印,所以你能看到程序执行了三次,却看不到输出。
你的原代码
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include<unistd.h> int main(int argc, char**argv){ for (int i=2; i<argc; i+=1){ pid_t p = fork(); if (p== -1){ perror ("fork"); exit(EXIT_FAILURE); } if (p==0){ execlp(argv[1], argv[1], argv[i], NULL); //why argv[1] twice perror("exec"); exit(EXIT_FAILURE); } else{ int stat; pid_t x = wait(&stat); if (x==-1){ perror("wait"); continue; } if(WIFEXITED(stat)){ printf("%d\n", WEXITSTATUS(stat)); } } } }
内容的提问来源于stack exchange,提问作者plantpot
相关产品推荐
相关产品推荐

