2011-04-15 56 views
0

我想从我的C程序运行一个csh命令。我这样做是使用下面的代码:从内部运行csh c

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中终止。并且"是不必要的。

+0

请不要写关于不投射“malloc”的结果。我意识到这一点,仍然选择这样做。 – SIMEL 2011-04-15 18:28:05

+1

我想传递给execvp的参数数组必须以'NULL'指针结束? – 2011-04-15 18:30:37

+1

'csh_command'是否包含您期望拥有的字符串? 'sizeof(char)'是1,所以不需要在'malloc'中乘它? – Mahesh 2011-04-15 18:31:11

回答

3

首先错误我看到认为

指针的阵列必须被 由NULL指针终止。

尝试:

char *csh_command[4]; 
csh_command[3] = 0; 

,什么是length_command价值?它应该是至少strlen(full_command)+1

UPDATE:

另一个问题可能的,因为使用的是未初始化字符串,它们可以包含一些垃圾可能与strcat。至少做到以下几点:

char *str = (char *)malloc(strlen("blabla")+1); 
str[0] = '\0'; 
strcat(str, "blabla"); 

或者只是使用strdup,而不是malloc + strcat

1

第一个问题是你在你的malloc有差一错误 - 没有余地终止空('\ 0' )

length_command + strlen("\"\"") + 1 

第二个问题是与execvp

指针数组必须以NULL指针终止。

此外,execvp()使用shell并搜索给定命令的路径。您目前有"csh"的第一个参数是要运行的可执行文件。你说要运行wc;那将是第一个参数。

2

,使你的代码更加复杂和不正确的比它是几个问题:

  • malloc() + strcat() = strdup()

  • 除非你正在计划有一个通用的cshcmd()函数或什么的,你为什么要复制字符串文字而不是直接使用它们?

  • execvp()参数数组必须以NULL结尾。

  • 在这种情况下,数组初始值设定项和匿名数组是一种幸运 - 你可能不会错过最后的NULL值。当然,除非你必须使用完全动态的结构......

  • 你不应该在命令参数中有那些额外的双引号。这些用于在使用命令行时运行的shell,并在调用exec()时被剥离。换句话说,csh应该看到ls -1 | wc -l,而不是"ls -1 | wc -l"

  • 哦,并且exec()中的参数数组的第一个元素始终为argv[0]。这可能应该是沿线csh,而不是一个选项。

编辑:

  • 一两件事:你清除使用strcat()之前malloc()分配的内存? strcat()会高兴地溢出你的缓冲区,这取决于它已经有的任何随机内容...