我有一个多线程应用程序,在其中创建这样的线程:
int main(int argc,char *argv[]) { pthread_t thread_id[argc-1]; int i; struct parameter thread_data[argc-1]; int status; for(i=0;i<argc-1;i++) { thread_data[i].ip_filename = argv[i+1]; strcpy (thread_data[i].op_filename,argv[i+1]); strcat (thread_data[i].op_filename,".h264"); } for(i=0;i<argc-1;i++) { pthread_create (&thread_id[i], NULL , &thread_function, &thread_data[i]); } }
现在在线程函数中, 我想 根据每个线程将stderr&重定向stdout到一个单独的文件中。类似于线程日志文件。
stderr
stdout
我该怎么办?
编辑:
如果可以在其他终端上显示特定于线程的打印。我的意思是,如果有2个线程,那么它将打开2个终端并在不同的终端上打印每个线程的数据。
如果您 真的 必须这样做…
首先,您需要创建2 pthread_key_ts,一个用于stdout,一个用于stderr。这些可以使用创建pthread_key_create,并且必须可以从所有线程访问。我们称它们为stdout_key和stderr_key。
pthread_key_t
pthread_key_create
stdout_key
stderr_key
创建线程时:
FILE *err = ..., *out = ...; pthread_setspecific(stdout_key, out); pthread_setspecific(stderr_key, err);
然后在您的头文件中:
#define stdout (FILE*)pthread_getspecific(stdout_key) #define stderr (FILE*)pthread_getspecific(stderr_key) #define printf(...) fprintf(stdout, ##__VA_ARGS__)
然后只需使用:
fprintf(stderr, "hello\n"); fprintf(stdout, "hello\n"); printf("hello\n");
我不推荐这种方法。