将 argc 和 argv 传递给 c 中的线程
Passing argc and argv to a thread in c
我正在尝试使用 C 语言编写带有图形界面的聊天代码。
一方面,我有一个用于聊天的客户端,另一方面,我有一个 GTK 应用程序来显示我的聊天。
要同时 运行 它们,我将使用 pthread(接受其他建议)。
我的问题是我需要 argc 和 argv 才能使我的客户端正常工作。据我所见, pthread_create() 将一个要执行的函数作为参数,并且只有一个参数。我从其他主题中看到我可以使用数据结构来包含它们,但我似乎无法正确转换它们。这是我所拥有的:
typedef struct {
int *argc;
char ** argv;
} args_list;
void * simple_client(void * arg){
int argc = (int) arg->argc;
char * argv[] = (char *) arg->argv;
printf("in thread : %d / %s, %s \n", argc, argv[0], argv[1]);
return 0;
}
int main(int argc, char * argv[])
{
printf("int main : %d / %s, %s \n", argc, argv[0], argv[1]);
args_list * args = malloc(sizeof *args);
args-> argc = &argc;
args-> argv = &argv;
pthread_t thread1;
if (pthread_create(&thread1, NULL, simple_client, args)) {
perror("pthread_create");
return EXIT_FAILURE;
}
if (pthread_join(thread1, NULL)) {
perror("pthread_join");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
从这里,我得到:错误:请求成员'argc'不是来自 int argc = (int) arg->argc 的结构或联合;与来自 char * argv[] = (char *) arg->argv;
的 argv 相同
什么会导致这些错误?您认为这是使用 GTK gui 实现在线聊天的好方法吗?
提前致谢
这样定义 struct
:
typedef struct tARGS
{
int argc;
char **argv;
} ARGS;
然后,在main
:
ARGS args;
args.argc = argc;
args.argv = argv;
从技术上讲,argc
并不是真正需要的,因为以下代码将处理 args
中的每个参数(argv[argc]
是 C 标准保证的空指针):
ARGS args = *(ARGS *)arg;
while(*args.argv)
{
puts(*args.argv);
args.argv++;
}
这里有一些类型问题。
simple_client
需要一个void*
。为了将传入的值用作 arg_list
,您需要将其转换为 1。
void * simple_client(void * argp){
arg_list* arg = (arg_list*) argp;
在 arg_list
中不需要额外的间接级别。它应该包含与 main.
的参数相同的类型
//in main:
args->argc = argc;
args->argv = argv;
//in simple_client:
int argc = arg->argc;
char** argv = arg->argv;
在您的原始代码中,您将 "address of a pointer to a char*" 存储在 "pointer to a char *" 中。
我正在尝试使用 C 语言编写带有图形界面的聊天代码。 一方面,我有一个用于聊天的客户端,另一方面,我有一个 GTK 应用程序来显示我的聊天。 要同时 运行 它们,我将使用 pthread(接受其他建议)。
我的问题是我需要 argc 和 argv 才能使我的客户端正常工作。据我所见, pthread_create() 将一个要执行的函数作为参数,并且只有一个参数。我从其他主题中看到我可以使用数据结构来包含它们,但我似乎无法正确转换它们。这是我所拥有的:
typedef struct {
int *argc;
char ** argv;
} args_list;
void * simple_client(void * arg){
int argc = (int) arg->argc;
char * argv[] = (char *) arg->argv;
printf("in thread : %d / %s, %s \n", argc, argv[0], argv[1]);
return 0;
}
int main(int argc, char * argv[])
{
printf("int main : %d / %s, %s \n", argc, argv[0], argv[1]);
args_list * args = malloc(sizeof *args);
args-> argc = &argc;
args-> argv = &argv;
pthread_t thread1;
if (pthread_create(&thread1, NULL, simple_client, args)) {
perror("pthread_create");
return EXIT_FAILURE;
}
if (pthread_join(thread1, NULL)) {
perror("pthread_join");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
从这里,我得到:错误:请求成员'argc'不是来自 int argc = (int) arg->argc 的结构或联合;与来自 char * argv[] = (char *) arg->argv;
的 argv 相同什么会导致这些错误?您认为这是使用 GTK gui 实现在线聊天的好方法吗?
提前致谢
这样定义 struct
:
typedef struct tARGS
{
int argc;
char **argv;
} ARGS;
然后,在main
:
ARGS args;
args.argc = argc;
args.argv = argv;
从技术上讲,argc
并不是真正需要的,因为以下代码将处理 args
中的每个参数(argv[argc]
是 C 标准保证的空指针):
ARGS args = *(ARGS *)arg;
while(*args.argv)
{
puts(*args.argv);
args.argv++;
}
这里有一些类型问题。
simple_client
需要一个void*
。为了将传入的值用作 arg_list
,您需要将其转换为 1。
void * simple_client(void * argp){
arg_list* arg = (arg_list*) argp;
在 arg_list
中不需要额外的间接级别。它应该包含与 main.
//in main:
args->argc = argc;
args->argv = argv;
//in simple_client:
int argc = arg->argc;
char** argv = arg->argv;
在您的原始代码中,您将 "address of a pointer to a char*" 存储在 "pointer to a char *" 中。