c语言sscanf函数的用法是什么
236
2022-09-01
【github myLocker】线程返回值,重复引用头文件,二进制文件I/O
线程返回值
子线程使用pthread_exit()向调用线程返回数值,函数原型:void pthread_exit(void *retval); 调用线程使用函数pthread_join()的第二个参数void **接收返回值。函数原型:int pthread_join(pthread_t thread, void **retval); 例子: main中创建一个线程pthTextCode,在新线程中用pthread_exit()返回一个值,main接收这个值并打出来。
main.c:
void *retval;//...retval = NULL;ret = pthread_create(&pthTextCode,NULL,pthTextCode_run,NULL);//...pthread_join(pthTextCode,&retval);printf("retval from textCode thread: %d\n",*(int*)(retval));free(retval);//...
pthTextCode.c
int *retval;retval = NULL;//...retval = (int *)malloc(sizeof(int));*retval = 1;pthread_exit((void *)retval);
结果:
main thread wait textCode thread working...[Switching to Thread 0xb7fe7b70 (LWP 9629)]Breakpoint 2, pthTextCode_run (arg=0x0) at pthTextCode.c:103103 retval = (int *)malloc(sizeof(int));Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.i686(gdb) n104 *retval = 1;(gdb) p retval$1 = (int *) 0xb7400488(gdb) p &retval$2 = (int **) 0xb7fe7378(gdb) cContinuing.[Switching to Thread 0xb7fe88d0 (LWP 9626)]Breakpoint 1, main () at main.c:7878 pthread_join(pthTextCode,&retval);(gdb) n[Thread 0xb7fe7b70 (LWP 9629) exited]79 printf("retval from textCode thread: %d\n",*(int*)(retval));Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-17.el6.i686(gdb) p retval$3 = (void *) 0xb7400488(gdb) p &retval$4 = (void **) 0xbffff1e4(gdb) p *retvalAttempt to dereference a generic pointer.(gdb) nretval from textCode thread: 183
可以看出main中的void *reaval和pthTextCode中的int *retval,两个retval都指向同一个地址,即线程pthTextCode malloc出来的内存地址。
重复引用头文件
相关错误: /tmp/XXX.o:(.bss+0x0): multiple definition
通常:
#ifndef XX_H#define XX_H/* ... */#endif //XX_H
用于防止头文件被重复引用,造成编译效率的低下。但它不能保证头文件里的东西就是唯一的。比如在头文件定义全局变量,这份头文件又被多个c源文件引用,那么编译器就会提示你重复定义。 下面的例子中number.h是这样的:
#ifndef NUMBER_H#define NUMBER_H#define LEN 1000010enum BOOL{False,True};typedef enum BOOL bool;bool num_vis[LEN] = {0};int prime_cnt;int prime_number[LEN][2];void get_prime();#endif //NUMBER_H
test.c、number.c都include了number.h,编译:
[edemon@CentOS tmp]$ gcc test.c number.c -o exe/tmp/ccJStRc2.o:(.bss+0x0): multiple definition of `num_vis'
// number.hbool
二进制文件I/O
用fwrite()将2,3,5,7,11写入文件key中,然后通过fread读取。 main.c:
#include "../pthTextRW.h"//...int main(){ prime_stack_cnt = 5; prime_stack[0] = 2; prime_stack[1] = 3; prime_stack[2] = 5; prime_stack[3] = 7; prime_stack[4] = 11; prime_write(); prime_read(); return 0; }
pthTextRW.c中的读写函数:
void prime_write(){ FILE *key_p = NULL; int i; key_p = fopen(key_path,"w"); if(key_p == NULL){ perror("key path w fopen: "); exit(1); } for (i=0; i 用vim打开fwrite生成的二进制文件: ^B^@^@^@^C^@^@^@^E^@^@^@^G^@^@^@^K^@^@^@$ 最后一个特殊的字符$是行尾锚定: $ DO 0x24 36 DOLLAR SIGN 表示一行的终结。 其他字符在vim的help digraph-table能够找到: digraph-tablechar digraph hex dec official name^@ NU 0x00 0 NULL (NUL)^A SH 0x01 1 START OF HEADING (SOH)^B SX 0x02 2 START OF TEXT (STX)^C EX 0x03 3 END OF TEXT (ETX)^D ET 0x04 4 END OF TRANSMISSION (EOT)^E EQ 0x05 5 ENQUIRY (ENQ)^F AK 0x06 6 ACKNOWLEDGE (ACK)^G BL 0x07 7 BELL (BEL)^H BS 0x08 8 BACKSPACE (BS)^I HT 0x09 9 CHARACTER TABULATION (HT)^@ LF 0x0a 10 LINE FEED (LF)^K VT 0x0b 11 LINE TABULATION (VT)^L FF 0x0c 12 FORM FEED (FF)^M CR 0x0d 13 CARRIAGE RETURN (CR)^N SO 0x0e 14 SHIFT OUT (SO) vim显示的是字符结果,特殊字符对应的十进制值刚好是2, 3, 5, 7, 11 EOF的值通常设置成-1 feof()返回的是最后一次读操作完毕后的内容,只有多读才能到达EOF。也就是说,上面的prime_read()函数读取的内容是多于输入内容的。实践操作后,我发现他总是多读一个0: 2 3 5 7 11 0 工程地址:https://github.com/theArcticOcean/CLib/tree/master/myLocker
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~