我正在试图弄清楚如何在SunOS上执行system()
函数调用(在C中),并且 NOT 将任何内容打印到stderr(或stdout)。目前,以下代码在Linux,OSX,HP-UX和SunOS上编译/运行。在除了SunOS之外的所有内容中,我得到了类似的输出:
i = 32512 (0x7f00); wexitstatus = 127
但是,在SunOS上我得到了:
sh: unknowncommand: not found
i = 256 (0x100); wexitstatus = 1
......额外的“sh:”行令人讨厌:)
(我的目标:安静地编程确定我是否可以执行“cc”和/或“gcc”命令。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main (int argc, char **argv)
{
int i;
char buf [1000];
strcpy (buf, "unknowncommand -c foo.c > /dev/null 2>&1");
i = system (buf);
printf ("i = %d (0x%x); wexitstatus = %d\n", i, i, WEXITSTATUS (i));
return 0;
}
答案 0 :(得分:0)
您可以使用popen()而不是system()并显式捕获进程的输出。
答案 1 :(得分:0)
which命令会找到一个存在于PATH变量中的可执行文件。
which gcc
which cc
您可以在系统调用中使用它。
这是一个穷人的版本:
// performs task similar to which command
// mywhich.c
char **split(char **result, char *w, const char *src, const char *delim)
{
char *p;
w=strdup(src);
int i=0;
for(p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim))
{
result[i++]=p;
result[i]=NULL;
}
return result;
}
char *detect_cc(char *cc, char **argv)
{
char search[PATH_MAX]={0x0};
char resolved[PATH_MAX]={0x0};
char *w=NULL;
int i=0,j=0;
char *result[1024]={NULL}; // set 1024 to appropriate value
char *PATH=getenv("PATH");
*cc=0x0;
split(result, w, PATH, ":");
for(i=0 ; !*cc && result[i]!=NULL; i++)
{
for(j=0; argv[j]!=NULL; j++)
{
sprintf(search,"%s/%s", result[i], argv[j]);
if(realpath(search, resolved)!=NULL)
{
if(access(resolved, X_OK)==0)
strcpy(cc, resolved);
}
}
}
free(w);
return cc;
}
int main(int argc, char **argv)
{
char cc[PATH_MAX]={0x0};
argv++;
detect_cc(cc, argv);
if(*cc)
printf("found: %s\n", cc);
else
printf("Not found in PATH\n");
return 0;
}
用法:
./mywhich gcc cc foo
它在找到的第一个文件上停止。篡改代码以根据需要抑制消息。
答案 2 :(得分:0)
这是删除输出的一种简单方法:
strcpy (buf, "sh -c 'unknowncommand -c foo.c' > /dev/null 2>&1");
i = system (buf);