我有一个线程函数,我试图传递它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 :(得分: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);
...