C语言调用execlp运行文件时报语法错误问题咨询
错误原因
你看到的src2/child.c: 6: Syntax error: "(" unexpected是shell抛出的语法错误,核心原因是你传给execlp的执行目标是C源代码文件src2/child.c,不是编译后的可执行程序:
- 当exec族函数识别到目标文件不是合法的可执行二进制格式时,会自动调用系统默认shell尝试把该文件当作脚本解释运行。shell逐行解析.c源码时,读到函数定义行的
(符号,不符合shell语法规则,就直接抛出了这个语法错误。 - 除此之外你的代码还有3个明确问题:
chmod的操作对象完全错误:你修改的是源代码文件child.c的权限,而非编译生成的可执行文件权限,且S_IRWXU | S_IRWXU是重复冗余的权限位写法,没有实际意义。child.c的入口函数不符合C语言规范:C程序的执行入口是main函数,你写的child函数不会被当作入口识别,就算单独编译这个文件也会因为找不到入口点链接失败,无法生成可执行文件。- exec族函数调用不规范:你没有在参数列表末尾传入
(char*)NULL作为参数终止标记,属于未定义行为,就算路径正确也可能出现参数读取异常。
修复方案
- 修正
src2/child.c的代码,补全必要头文件,将入口函数改为标准main函数:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("%s\n", argv[1]); exit(0); }
- 调整Makefile编译规则,将修正后的child.c编译为
src2目录下的可执行文件(比如命名为child,不要带.c后缀),编译时默认就会给生成的二进制文件加可执行权限,不需要在主程序里额外调用chmod修改权限。 - 修改主程序逻辑,删除无用的chmod源码的代码,修正execl调用指向编译好的可执行文件,补全参数终止标记:
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ pid_t pid = fork(); if (pid == -1) { perror("error in fork"); exit(1); } if (pid == 0) { // 第一个参数是编译好的可执行文件路径,最后必须传NULL标记参数结束 execl("src2/child", "child", "Ciao", (char*)NULL); perror("error in exec"); exit(1); } // 父进程等待子进程执行结束再退出,避免子进程变成孤儿进程 waitpid(pid, NULL, 0); exit(0); }
补充说明:因为你用的是带斜杠的相对路径指定可执行文件位置,不需要依赖PATH环境变量搜索,用
execl比execlp更合适。
内容的提问来源于stack exchange,提问作者Dacqu91
相关产品推荐
相关产品推荐

