从C内部运行csh

| 我想从我的C程序中运行“ 0”命令。我使用以下代码进行了此操作:
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。问题在于数组未以ѭ6终止。
\"
是不必要的。     
已邀请:
我看到的第一个错误   指针数组必须是   由NULL指针终止。 尝试:
char *csh_command[4];
csh_command[3] = 0;
length_command
的价值是多少?至少应该是
strlen(full_command)+1
更新: 另一个问题可能与ѭ11有关,因为您使用的是未初始化的字符串,并且它们可能包含一些垃圾。至少执行以下操作:
char *str = (char *)malloc(strlen(\"blabla\")+1);
str[0] = \'\\0\';
strcat(str, \"blabla\");
或者只使用
strdup
而不是
malloc
+
strcat
    
一些使您的代码比必须的更为复杂和不正确的问题是:
malloc()
+
strcat()
=
strdup()
除非您打算使用通用的
cshcmd()
函数或其他功能,否则为什么要复制字符串文字而不是直接使用它们呢?
execvp()
参数数组必须以
NULL
结尾。 在这种情况下,数组初始值设定项和匿名数组会很幸运-您可能不会错过最后的NULL。当然,除非您必须使用完全动态的结构... 您不应在命令参数中使用那些多余的双引号。当您使用命令行时,这些命令将用于运行中的shell,并在调用
exec()
时将其删除。换句话说,“ 0”应表示“ 24”,而不是“ 25”。 哦,
exec()
中参数数组的第一个元素始终是
argv[0]
。那可能应该是沿着“ 0”线的东西,而不是一种选择。 编辑: 还有一件事:在使用
strcat()
之前,您是否清除了
malloc()
分配的内存?
strcat()
会很高兴地溢出缓冲区,具体取决于缓冲区中已有的随机内容...     
第一个问题是您的malloc中有一个错误的错误-终止空值('\\ 0 \')没有空间
length_command + strlen(\"\\\"\\\"\") + 1
第二个问题是
execvp
:   指针数组必须以NULL指针终止。 另外,ѭ20使用外壳程序并在路径中搜索给定命令。当前具有
\"csh\"
的第一个参数是要运行的可执行文件。您说的是要run36。那将是第一个论点。     

要回复问题请先登录注册