0

system()SunOS で (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;
}
4

3 に答える 3

0

出力をドロップする簡単な方法の 1 つを次に示します。

strcpy (buf, "sh -c 'unknowncommand -c foo.c' > /dev/null 2>&1");
i = system (buf);
于 2013-09-25T08:16:37.953 に答える
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

最初に見つかったファイルで停止します。必要に応じてメッセージを抑制するようにコードを修正します。

于 2013-09-25T03:04:38.207 に答える
0

system() の代わりに popen() を使用して、プロセスの出力を明示的にキャプチャできます。

于 2013-09-25T02:05:58.257 に答える