-1

我必须修改这个脚本,它将“PATH”中的每个路径与脚本的每个参数结合起来,并为每个参数执行“ls -l”命令......这就是我想象的方式,但我有一些问题,不要'不知道到底是什么问题....我得到“分段错误(核心转储)”,如果没有,那么无论我给出多少个参数,输出都是相同的,所以我认为它只为其中一个执行命令但我不确定......谁能帮助我?...对不起,如果我的英语很粗糙或代码中的外语...

#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

In Addition to what Olaf said:

You need to call the execl function with a separate string for each option you want to pass and terminate with the arguments with NULL like so:

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

See man execl for further reference.

于 2012-10-22T12:28:03.150 回答
1

您必须测试 的返回值strtok()。当您的 , 中没有更多标记时PATHstrtok()返回NULLstrlen(NULL)给出您的分段错误。

请阅读man strtok

我建议您不要以这种方式嵌套函数调用,因为您总有可能获得意外的返回值。

于 2012-10-22T12:26:34.990 回答