gpt4 book ai didi

c - SunOS 上的 stderr 上没有消息的 "system()"如何处理

转载 作者:行者123 更新时间:2023-11-30 17:47:15 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 SunOS 上执行 system() 函数调用(用 C 语言),并且没有将任何内容打印到 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;
}

最佳答案

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

它会在找到的第一个文件处停止。修改代码以根据您认为合适的方式抑制消息。

关于c - SunOS 上的 stderr 上没有消息的 "system()"如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18994989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com