fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入.
编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程.
查看该文件,一些写入混合在一起.
编辑2:我看到的问题似乎可能是由于lighttpd的"工作线程"实际上是单独的进程: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor
问题
通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点:
- mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步.
- mod_status将有n个独立的计数器,每个进程一个.
- mod_rrdtool将失败,因为它收到两次相同的时间戳.
- mod_uploadprogress将不会显示正确的状态.
我现在正在学习C中的字符串.
如何使用scanf来获取你可以做的字符串
scanf("%s",str1);
Run Code Online (Sandbox Code Playgroud)
而对于printf,你可以做到
printf("The string is %s\n", str1);
Run Code Online (Sandbox Code Playgroud)
我理解,对于scanf来说,这是因为字符串只是一个字符数组,它是一个指针,但是对于printf,你怎么能像变换int或float一样放置变量名?
我需要做两次(或更多次)传球va_list.我有一个大小的缓冲区,我想用sprintf写一个格式化的字符串.如果格式化的字符串不适合分配的空间,我想要将分配的空间加倍并重复直到它适合.
(作为旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但我发现可以做到的唯一功能是_snprintf,并且在VS2005中不推荐使用...)
现在,到目前为止没有问题:我在每次调用之前使用vsnprintf和va_start调用.
但我还创建了一个函数,它将a va_list作为参数,而不是"......".然后我不能再使用va_start了!我已经读过了va_copy,但VS2005不支持它.
那么,你会怎么做?
使用printf我可以使用*将精度值指定为额外参数.C#String.Format中是否存在相同的功能?
编辑:例如:
Console.WriteLine("{0:D*}",1,4); // Outputs 0001
Run Code Online (Sandbox Code Playgroud) 给一堂课
struct {
int a1;
bool a2;
...
char* a500;
...
char a10000;
}
Run Code Online (Sandbox Code Playgroud)
我想打印或流出
"a1 value is SOME_VALUE"
"a2 value is SOME_VALUE"
"a500 value is SOME_VALUE"
...
"a10000 value is SOME_VALUE"
Run Code Online (Sandbox Code Playgroud)
成员变量的类型不一样(主要是int,bool,char*等,也就是说,不需要重载<<运算符),成员变量名可以用任何东西命名,即没有遵循的规则.而不是逐个明确地输入(非常繁琐且容易出错的工作),有没有通用的方法?
谢谢你的评论!
我有一个管道分隔的feed文件,它有几个字段.由于我只需要一些,我想用它awk来捕获它们用于我的测试目的.但是,我注意到printf如果我使用它会更改值"%d".如果我使用,它工作正常"%s".
[jaypal:~/Temp] cat temp
302610004125074|19769904399993903|30|15|2012-01-13 17:20:02.346000|2012-01-13 17:20:03.307000|E072AE4B|587244|316|13|GSM|1|SUCC|0|1|255|2|2|0|213|2|0|6|0|0|0|0|0|10|16473840051|30|302610|235|250|0|7|0|0|0|0|0|10|54320058002|906|722310|2|0||0|BELL MOBILITY CELLULAR, INC|BELL MOBILITY CELLULAR, INC|Bell Mobility|AMX ARGENTINA SA.|Claro aka CTI Movil|CAN|ARG|
我有兴趣捕捉second column它是哪个19769904399993903.
[jaypal:~/Temp] awk -F"|" '{printf ("%d\n",$2)}' temp
19769904399993904 # Value is changed
Run Code Online (Sandbox Code Playgroud)
但是,以下两个测试工作正常 -
[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903 # Value remains same
[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903 # Value remains same
Run Code Online (Sandbox Code Playgroud)
所以这是一个"%d"无法处理长整数的限制.如果是这样的话,为什么会在数字中加一个而不是截断呢?
我试过这个BSD和GNU版本的awk. …
我正在用纯C编写通用链表实现.
struct Node {
void *value;
struct Node *next;
};
struct LinkedList {
struct Node *start;
struct Node *end;
};
void LinkedList_new(struct LinkedList* llist) {
llist->start = 0;
llist->end = 0;
return;
}
void addNode( struct LinkedList *ll, void *_value ) {
if ( NULL == ll->start ) {
ll->start = (struct Node *) malloc( sizeof(struct Node) );
ll->end = ll->start;
} else {
ll->end->next = (struct Node *) malloc( sizeof(struct Node) );
ll->end = ll->end->next;
}
ll->end->value = _value; …Run Code Online (Sandbox Code Playgroud) 假设如下:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
Run Code Online (Sandbox Code Playgroud)
对于4字节有符号数,printf2字节有符号数的格式%hd是%d,对于8字节有符号数%ld,但是1字节有符号数的正确格式是什么?
我正在重新编码printf,现在我被精度标志阻止了一会儿。所以我读到类型转换说明符d为 1时的默认精度:

所以我认为%.dand之间没有区别%.1d,但是当我测试时:
printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud)
我确实找到了一个:
printf(".d =%.d, .1d= %.1d", 0, 0);
Run Code Online (Sandbox Code Playgroud) 文档说fmt
\n\n返回一个字符串,其中列表中的每个元素均已根据
\n$format[第一个参数] 进行格式化,并且每个元素均由$separator[第二个参数] 分隔。
根据该描述,我希望能够调用.fmt列表列表,然后传递一个printf-style 格式字符串,其中%包含内部列表中每个元素的指令。但这是行不通的。
如果您告诉我我对 ^^^^ 的看法是错误的,我会期望它.fmt会自动展平其参数,因此每个参数都会被格式化并由$separator. 但事实并非如此。
相反,运行此代码
\n\nsay (<a b c>, <1 2 3>, <X Y Z>).fmt(\'\xe2\x86\x92%03s|\', "\\n=================\\n");\nRun Code Online (Sandbox Code Playgroud)\n产生这个输出:
\n\xe2\x86\x9200a| \xe2\x86\x9200b| \xe2\x86\x9200c|\n=================\n\xe2\x86\x92001| \xe2\x86\x92002| \xe2\x86\x92003|\n=================\n\xe2\x86\x9200X| \xe2\x86\x9200Y| \xe2\x86\x9200Z|\nRun Code Online (Sandbox Code Playgroud)\n也就是说,格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(不使用格式字符串;注意 每个|和\xe2\x86\x92字符之间),然后在每个外部列表之间插入分隔符列表之间插入分隔符。
这给我留下了三个问题:
\n