Linux shell脚本错误

时间:2012-10-22 12:21:11

标签: c linux shell

我必须使用这个脚本,它将“PATH”中的每个路径与脚本的每个参数组合在一起并为每个参数执行“ls -l”命令...这是我想象的但我有一些问题它并且不知道究竟是什么问题....我得到“Segmentation Faul(core dumped)”如果没有那么无论我给出多少个参数输出是相同的所以我认为它只执行命令其中一个,但我不确定......任何人都可以帮助我吗? ...对不起,如果我的英语很粗糙或代码中的外语......

#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);
        }
    }   

}

}

2 个答案:

答案 0 :(得分:1)

您必须测试strtok()的返回值。如果PATH中没有其他令牌,则strtok()会返回NULLstrlen(NULL)则会出现您的细分错误。

请阅读man strtok

我建议你不要以这种方式嵌套函数调用,因为总会有机会获得意想不到的返回值。

答案 1 :(得分:1)

除了奥拉夫所说的:

您需要为要传递的每个选项使用单独的字符串调用execl函数,并使用NULL的参数终止,如下所示:

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

有关详细信息,请参阅man execl