execv调用未执行凯撒解密程序,请求排查解决
问题与解决方案
我编写了一个简单的C程序,按照execv()第二个参数的要求构建参数数组,调用一个用于计算并输出凯撒密码解密结果的程序。但调用execv()的文件似乎忽略了该调用,直接执行后续代码,请问该如何解决?
代码
execv-test-arg.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (void) { char *argv[3]; argv[0] = "caesar-cipher"; argv[1] = "SDQGD"; argv[2] = "\0"; execv("caesar-cipher",argv); printf("Returned from execv call.\n"); // 此语句被打印 return 0; }
caesar-cipher.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (int argc, char *argv[]) { int i, j; for (i=1; i<argc; i++) { j=0; while (argv[i][j] != '\0') { if ((argv[i][j] >= 'A') && (argv[i][j] <= 'Z')) { printf ("%c", 'A'+(argv[i][j]-'A'+23)%26); // 预期输出内容 } else if ((argv[i][j] >= 'a') && (argv[i][j] <= 'z')) { printf ("%c", 'A'+(argv[i][j]-'a'+23)%26); } else if ((argv[i][j] >= '0') && (argv[i][j] <= '9')) { printf ("%c", '0'+(argv[i][j]-'0'+7)%10); } else printf ("Invalid input.\n"); j++; } printf(" "); } printf("\n"); return 0; }
预期输出
PANDA
当前输出
Returned from execv call.
解决方法
execv()只有在调用失败时才会返回,后续代码执行说明调用未成功,问题出在以下两点:
参数数组结尾错误
execv要求argv数组必须以NULL指针结尾,而非指向空字符串的"\0"。你写的argv[2] = "\0";是指向空字符串的指针,不符合规范,应改为argv[2] = NULL;。程序路径未指定正确
execv不会搜索环境变量PATH,必须指定程序的相对路径或完整路径。如果caesar-cipher在当前工作目录,要写成./caesar-cipher,而非仅写程序名。添加错误排查(可选但实用)
在execv调用后添加错误信息打印,方便定位问题,比如使用perror。
修改后的execv-test-arg.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> int main (void) { char *argv[3]; argv[0] = "caesar-cipher"; argv[1] = "SDQGD"; argv[2] = NULL; // 修正为NULL指针 execv("./caesar-cipher", argv); // 指定当前目录下的程序路径 perror("execv failed"); // 打印具体错误原因 printf("Returned from execv call.\n"); return EXIT_FAILURE; // 调用失败返回非0状态码 }
另外需确保caesar-cipher已正确编译并拥有执行权限:
gcc caesar-cipher.c -o caesar-cipher chmod +x caesar-cipher # 若权限不足则执行此命令
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

