我想从我的C程序运行一个csh命令。我使用以下代码完成了此操作:
char *csh_command[3];
...
csh_command[2]=(char*)malloc((length_command+strlen("\"\""))*sizeof(char));
csh_command[0]=(char*)malloc((strlen("-f")+1)*sizeof(char));
csh_command[1]=(char*)malloc((strlen("-c")+1)*sizeof(char));
strcat (csh_command[0],"-f");
strcat (csh_command[1],"-c");
strcat (csh_command[2],"\"");
strcat (csh_command[2],full_command);
strcat (csh_command[2],"\"");
pid=fork();
if (pid == 0){
execvp("csh", csh_command);
}我在这里要做的是创建一个数组,其中包含csh的参数:-f,-c,“要运行的命令”
但结果并不像预期的那样。子进程只是在后台运行,什么都不做。
我们尝试使用它运行ls | wc -l。
问题出在哪里?
编辑:
length_command变量已经有一个用于\0的+1。问题在于NULL中的数组没有终止。"也是不必要的。
发布于 2011-04-15 18:32:37
第一个错误我看到了
指针数组必须以空指针结束。
尝试:
char *csh_command[4];
csh_command[3] = 0;length_command值是多少?至少应该是strlen(full_command)+1
更新:
另一个问题可能与strcat有关,因为您使用的是未初始化的字符串,它们可能包含一些垃圾。至少要做到以下几点:
char *str = (char *)malloc(strlen("blabla")+1);
str[0] = '\0';
strcat(str, "blabla");或者使用strdup代替malloc+strcat
发布于 2011-04-15 18:41:44
有几个问题使您的代码比必须的更复杂和更不正确:
malloc() + strcat() = strdup()cshcmd()函数什么的,为什么要复制字符串文本而不是直接使用它们呢?execvp()参数数组必须以NULL.exec()时被删除。换句话说,csh应该看到ls -1 | wc -l,而不是ls -1 | wc -l,而exec()中的参数数组的第一个元素总是argv[0]。这可能是一些类似于csh的东西,而不是一种选择。编辑:
strcat()之前,您是否清除了malloc()分配的内存?strcat()将很高兴地溢出缓冲区,这取决于它已经具有的任意内容.发布于 2011-04-15 18:31:31
第一个问题是您的malloc中有一个非零的错误-没有终止null的空间(‘\0’)
length_command + strlen("\"\"") + 1第二个问题是execvp
指针数组必须以空指针结束。
此外,execvp()使用shell并在路径中搜索给定的命令。当前有"csh"的第一个参数是要运行的可执行文件。您将讨论想要运行wc;这将是第一个论点。
https://stackoverflow.com/questions/5680848
复制相似问题