首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C内部运行csh

从C内部运行csh
EN

Stack Overflow用户
提问于 2011-04-15 18:26:50
回答 3查看 554关注 0票数 0

我想从我的C程序运行一个csh命令。我使用以下代码完成了此操作:

代码语言:javascript
复制
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中的数组没有终止。"也是不必要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-15 18:32:37

第一个错误我看到了

指针数组必须以空指针结束。

尝试:

代码语言:javascript
复制
char *csh_command[4];
csh_command[3] = 0;

length_command值是多少?至少应该是strlen(full_command)+1

更新:

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

代码语言:javascript
复制
char *str = (char *)malloc(strlen("blabla")+1);
str[0] = '\0';
strcat(str, "blabla");

或者使用strdup代替malloc+strcat

票数 3
EN

Stack Overflow用户

发布于 2011-04-15 18:41:44

有几个问题使您的代码比必须的更复杂和更不正确:

  • malloc() + strcat() = strdup()
  • Unless --您计划有一个通用的cshcmd()函数什么的,为什么要复制字符串文本而不是直接使用它们呢?
  • -- execvp()参数数组必须以NULL.
  • Array初始化器结尾--在这种情况下,匿名数组是一种祝福--您很可能不会忽略它们结尾的NULL。当然,除非您必须使用完全动态的structures...
  • You,否则命令参数中不应该有额外的双引号。当您使用命令行时,这些代码将用于正在运行的shell,并在调用exec()时被删除。换句话说,csh应该看到ls -1 | wc -l,而不是ls -1 | wc -l,而exec()中的参数数组的第一个元素总是argv[0]。这可能是一些类似于csh的东西,而不是一种选择。

编辑:

  • 还有一件事:在使用strcat()之前,您是否清除了malloc()分配的内存?strcat()将很高兴地溢出缓冲区,这取决于它已经具有的任意内容.
票数 2
EN

Stack Overflow用户

发布于 2011-04-15 18:31:31

第一个问题是您的malloc中有一个非零的错误-没有终止null的空间(‘\0’)

代码语言:javascript
复制
length_command + strlen("\"\"") + 1

第二个问题是execvp

指针数组必须以空指针结束。

此外,execvp()使用shell并在路径中搜索给定的命令。当前有"csh"的第一个参数是要运行的可执行文件。您将讨论想要运行wc;这将是第一个论点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5680848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档