【问题标题】:execl and wget command in a loop循环中的 execl 和 wget 命令
【发布时间】:2014-03-02 09:03:32
【问题描述】:

我已经编辑了我之前的问题。

由于我遇到了问题并更改了代码,现在我遇到了不同的问题。如果我使用 execle 命令,它只使用 wget 命令下载一个图像,否则如果 wget 命令不执行,它会在屏幕上打印所有图像名称。不明白什么时候有while循环,为什么只打印一张图片。

#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<limits.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>

void main(int argc, char*argv[])
{
int iFlag;
char cline[100];
FILE*fil = fopen("index.html","rt");
if(fil==NULL)
{
    printf("Error in opening file");
}
char*tmpLine;
char*tok;
const char check[10] = "<img";
const char check2[10] = "src=";
char images[50];
strcpy(images,argv[1]);
while(fgets(cline,100,fil)!=NULL)
{
    if(strstr(cline,check)!=NULL)
    {
        tmpLine=strstr(cline,check);
        if(strstr(cline,check2)!=NULL)
        {
            tmpLine=strstr(cline,check2);
            tok = strtok(tmpLine,"\"");
            while(tok!=NULL)
            {
                tok = strtok(NULL,"\"");
                if(tok[0]!='/')
                {
                    strcat(images,"/");
                    strcat(images,tok);
                    printf("\nimage: %s\n",images);
                    iFlag = execle("/usr/bin/wget","wget","-o","logfile",images,NULL);
                    if(iFlag<0)
                      perror("EXECLE ERROR");
                    break;
                }
                else
                    break;
            }
            memset(&images[0], 50, sizeof(images));
            strcpy(images,argv[1]);
        }
    }

}

}

【问题讨论】:

  • 您应该使用调试器。由于缓冲,printf 不能可靠地发现段错误的位置。
  • 你检查fil不为NULL吗?
  • 如果你想写出调试的东西,请使用fprintf(stderr, ....),它没有缓冲并且更有可能被看到。

标签: c linux segmentation-fault


【解决方案1】:

fil 可能为 NULL。为什么?

FILE*fil = fopen("index.hmtl","rt");

因为你打错了文件名。这就是为什么检查错误是个好主意。

【讨论】:

  • Nice catch ... ;-) 和另一个很好的例子,为什么人们应该总是检查系统调用的结果。人为错误是不可预测的......
  • 看来我在指定文件名时犯了一个错误,因此它返回 NULL。
【解决方案2】:

这一行

        printf("%s\n",tok[0]);

没有意义,因为你传递了一个 char,其中应该是 char *

随便

        printf("%s\n", tok);

        printf("%c\n", tok[0]);

还有这一行

  char*images = (char*)malloc(100);

造成内存泄漏,因为在离开上下文images 时,分配给images 的内存的引用丢失了,而free() 未对其进行声明。


还有^2:

In C there is no need to cast the result of malloc/calloc/realloc, nor is it recommended.

所以上面的行最好是:

char * images = malloc(100);

另外^3:始终检查系统调用的结果,至少如果代码依赖于返回的值。此处:检查fopen() 是否失败,如返回错误NULL,如果用作有效的文件指针,这将使程序阻塞。


作为有关如何查找错误的一般建议:使用符号编译有问题的代码(gcc 的选项-g),然后使用调试器作为 gcc 逐步执行“运行”代码。

【讨论】:

  • 虽然正确,但这不是 OP 对这个问题有问题的地方(可能下一个问题是关于那个......)
  • 您对以下用法有何建议:charimages = (char)malloc(100);因为我需要一个 char 数组,我可以在其中放置网页的 url,然后连接从文件中获取的图像名称并从该链接下载图像。每次我只需要网页的主url,这样我就可以连接图片名称了。
  • @user2507775:这在很大程度上取决于您要如何处理images 的内容。
  • @alk:之后我需要下载这些图像。这些图像将通过管道发送到子进程,子进程将它们下载到指定目录。
【解决方案3】:
  1. 你应该检查fopen()的返回值,正如其他人已经指出的那样。

  2. printf("%s\n",tok[0]); 应该是 printf("%s\n",tok);,如果你想打印一个字符串。

  3. 更严重,

        while(tok!=NULL)
        {
            strcat(images,tok);
        }
        tok = strtok(NULL,quote);
    

    这个tok = strtok(...);应该放在那个while循环里面,否则那个tok永远不会改变,你的程序最终会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2013-04-07
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多