如何将命令行参数传递给线程函数

时间:2016-03-17 03:00:09

标签: c multithreading casting

我有一个线程函数,我试图传递它argv,但我没有成功。有什么帮助吗?

int main(int argc, char** argv){
    pthread_create(&p, NULL, fn, (void *)&argv);
}

void* fn(void *param){
    // How to cast here, so I will be able to use it as param[0], param[1] etc.
}

2 个答案:

答案 0 :(得分:2)

请阅读您想要的内容。

$ sed -n '/Servlet.service() for servlet default threw exception/s/^[^:]*:\([^,]*\).*$/\1/p' log.file
17:44:59

或更简单

void* fn(void *param){
    char** argv = *(char***)param;
}

由于int main(int argc, char** argv){ pthread_create(&p, NULL, fn, argv); } void* fn(void *param){ char **argv = param; } 是指针,因此您可以将其转换为argv并再次转换为原始类型,从而获得与原始值相同的值。

答案 1 :(得分:2)

命令行参数有两个部分:

  • argc - 参数数量和
  • argv - 包含实际参数的数组。

由于您只能传递一个"用户数据" pthread_create的参数,您需要将两个值打包到一个结构中,然后将结构的地址作为用户数据传递。

typedef struct ArgCV {
    int argc;
    char **argv;
};

int main(int argc, char **argv) {
    ArgCV args;
    args.argc = argc;
    args.argv = argv;
    pthread_create(&p, NULL, fn, &args);
    ...

void* fn(void* param) {
    ArgCV *args = (ArgCV*) param;

    for(int i=0; i<args->argc; i++) 
       printf("%s\n", args->argv[i]);
    ...

然而,正如@ChrisDodd指出的那样,argv[]数组被保证被NULL终止;你实际上不需要传递argc,线程可以只计算数组中非空值的数量,以确定参数的数量,如果需要的话。

int main(int argc, char **argv) {
    pthread_create(&p, NULL, fn, argv);
    ...

void* fn(void* param) {
    char **argv = (char**) param;

    int argc = 0;
    while(argv[argc] != NULL) {
        printf("argv[%d] = %s\n", argc, argv[argc]);
        argc++;
    }
    printf("There are %d arguments\n", argc);
    ...