-1

「PATH」からのすべてのパスをスクリプトのすべての引数と組み合わせて、それぞれに対して「ls -l」コマンドを実行するこのスクリプトを作成する必要があります...これは私が想像した方法ですが、いくつか問題があり、ドン「何が問題なのか正確にはわかりません....「セグメンテーションフォールト(コアダンプ)」が表示されます。そうでない場合は、引数をいくつ指定しても出力は同じなので、そのうちの1つに対してのみコマンドを実行していると思いますでもよくわかりません...誰か助けてくれませんか?...私の英語が荒い場合やコード内の外国語が含まれている場合は申し訳ありません...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int main (int argc,char* argv[])
{
char* s=(char*)malloc(sizeof(char)*strlen(getenv("PATH")));
s=getenv("PATH");
if (argc==0) {printf("Nem irt be egyetlen parametert sem!");}
else
{
    char* seged=(char*)malloc(sizeof(char)*(strlen(strtok(s,":"))+1));
    seged=strtok(NULL,":");
    strcat(seged,"/");
    int i=1;
    for (i=1;i<=argc;i++);
    {

        char* seged2=(char*)malloc(sizeof(char)*(1000));
        //char* seged2=(char*)malloc(sizeof(char)*(strlen(strtok(NULL,":"))+(strlen(argv[i]))+1));  if i use this line i get Segmentation Fault
        strcat(seged2,seged);
        strcat(seged2,argv[i]);
        int pid=fork();
        if (pid==0)
        {
            execl("/bin/ls","ls -l",seged2);
        }
        free(seged2);
    }
    while (strtok(NULL,":")!=NULL)
    {
        free(seged);            
        char* seged=(char*)malloc(sizeof(char)*(strlen(strtok(NULL,":"))+1));
        seged=strtok(NULL,":");
        strcat(seged,"/");  
        for (i=1;i<argc;i++);
        {               
            char* seged2=(char*)malloc(sizeof(char)*(strlen(strtok(NULL,":"))+strlen(argv[i])+1));
            strcat(seged2,seged);
            strcat(seged2,argv[i]);
            pid_t pid=fork();
            if (pid==0)
            {
                execl("/bin/ls","ls -l",seged2);
            }
            free(seged2);
        }
    }   

}

}

4

2 に答える 2

1

の戻り値をテストする必要がありますstrtok()。にトークンがなくなるとPATHstrtok()が返され、セグメンテーション違反が発生します。NULLstrlen(NULL)

をお読みくださいman strtok

予期しない戻り値を取得する可能性が常にあるため、この方法で関数呼び出しをネストしないことをお勧めします。

于 2012-10-22T12:26:34.990 に答える
1

オラフが言ったことに加えて:

execl渡したいオプションごとに個別の文字列で関数を呼び出し、次のNULLように引数で終了する必要があります。

execl("/bin/ls", "ls", "-l", seged2, 0);

詳細についてman execlは、 を参照してください。

于 2012-10-22T12:28:03.150 に答える