2016-03-17 33 views
2

我有一个线程功能,我想通过它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. 
} 
+0

你需要同时通过'argc'和'argv'成'pthread_create',但你只有一个参数,你可以在解决方案通过:包俱进的结构,并通过那的地址结构体。 – AJNeufeld

+1

@AJNeufeld:你并不真的需要'argc'作为'argv'数组总是以一个NULL poiinter终止... –

+0

@ChrisDodd:哦,亲爱的,我的年龄是露出来了!对规范的愚蠢改进,使得程序的行为更具可预测性... http://c0x.coding-guidelines.com/5.1.2.2.1.html ...我将在下面更新我的答案,然后挥舞我的手杖,“离开我的草坪!” – AJNeufeld

回答

2

刚才看了你想要什么。

或者更简单地说

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

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

由于argv是一个指针,你可以将其转换为void*并再次转换成原始类型得到相同的值,原来的。

+0

OP应该如何处理未知大小的数组? – SergeyA

+1

@SergeyA:通过查找标记数组末尾的NULL指针。 –

+0

将argv [i]返回传递的第i个命令行参数?或* argv [i]? – Ani

1

有两个部分到命令行参数:

  • 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); 
    ... 
相关问题