我有一个线程功能,我想通过它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.
}
我有一个线程功能,我想通过它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.
}
有两个部分到命令行参数:
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);
...
你需要同时通过'argc'和'argv'成'pthread_create',但你只有一个参数,你可以在解决方案通过:包俱进的结构,并通过那的地址结构体。 – AJNeufeld
@AJNeufeld:你并不真的需要'argc'作为'argv'数组总是以一个NULL poiinter终止... –
@ChrisDodd:哦,亲爱的,我的年龄是露出来了!对规范的愚蠢改进,使得程序的行为更具可预测性... http://c0x.coding-guidelines.com/5.1.2.2.1.html ...我将在下面更新我的答案,然后挥舞我的手杖,“离开我的草坪!” – AJNeufeld