您正在查看 "C" 分类下的文章 2009-05-30 20:56 使用Reader/Writer两个线程操作共享内存是程序设计中经常用到的方法, 共享内存一般是一个队列, 写线程不断的向队列尾中加入元素, 读线程不断的读取队列头, 使用信号量比使用自旋锁有更好的效率。下面是一个使用范例, 简单的cp功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> |
2009-05-28 8:32 最近在写一 个http下载器, 通过读写线程分工来做。 当写线程结束的时候, 通过pthread_join来等待它结束, 函数原型如下:
void start_write_thread(pthread_t thread_id)
{
if (pthread_create(&thread_id, NULL, write_data_to_file, NULL) != 0) {
printf("[-] Create write thread failed.\n");
|
2009-05-14 11:00 最近写的一些程序都会出现莫名其妙的bug, 仔细分析下来都是在一些c语法上的细小疏忽造成的。 这使得我开始重新思考c语法, 重新再巩固下c的知识。 今天说说c中的可变参数用法在实际项目中的运用, 其基本用法可以参考其他网络文章。
1、 在项目中我们经常会要用到debug函数或一些日志函数来方便我们进行调试和查看日志信息, 这些函数无疑用可变参数用法是最合适的了, 看下面这个日志函数:
#define debug_log_info(log_path, log_name, fmt, ...) |
2009-05-12 16:18 linux函数中signal函数的原型就很晦涩难懂了, 看下面这个程序你能否读懂它:
#include <stdio.h>
typedef int (*fptr)(int, char *);
int test(int num, char *s)
{
int i = 0;
for (; i < num; i++)
printf("%s\n", s);
|
2009-05-12 15:24 在x.c中定义了一个字符数组 char s[100],
在l.c中进行引用extern char s[200], 有些c程序新手经常把它写成extern char *s。 这两种写法的含义一样吗?
首先得理解声明与定义的含义:
定义一个变量意味着要给它进行内存分配, 而声明一个变量则可以在其他文件中, 只是进行一种声明, 表示有这个变量存在, 但是在其他文件中定义, 声明后不用分配内存。
我们看一下extern char s[100]与extern char *s在执行s[10]的取值过程是什么样的:
1、 extern char s[100], s是个符号, 它既是一个数组的名称 |
2009-04-02 13:10 项目需要bencoding解码器, 代码库里有现成的c++接口。 但是俺对c++只会写个class, 研究了那个接口半天也不会用。 仔细看了下bencoding编码规则, 发现也不是很难, 于是花了一天的时间写了个c接口的解码器,目前还没发现什么bug. 以后有时间可能在写个torrent文件的解析器。 下一步将仔细研究下高性能并发服务器的编写, 虽然现在的需求可能只要并发100个请求就可以了, 但是一旦客户端安装量变多, 可能就需要nginx那种设计模式了, 需要的话在仔细研究了。 |
2009-03-25 9:56 早上逛论坛的时候, 发现自己的参赛题目得奖了。 都过去快一个月了, 忘了参加比赛这个事了。。。 代码以前在blog上发过, 就是研究内核双链表的时候发的。 没能拿到优秀奖有点遗憾呀, 不过能拿100个积分也不错, 哈哈~ |
2009-02-19 11:20 应用内核双向链表可以方便的建立堆栈和队列, list_add()用来建立堆栈, list_add_tail()用来建立队列。
下面是一个中缀表达式求值的代码, 就用到了堆栈。
/* code by wzt */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "list.h"
#define CALCA_NUM 9
typedef struct calca_struct {
char data;
|
2009-02-16 9:27 最近CU正在举办编程大赛, 里面有道题目正好可以用前几天封装的链表库来完成。
题目:
3.从标准输入中读入N(1<N<10000)行以换行符结束且长度不超过2048的字符串,并在输入结束后输出其中最长10行的输入序号、长度和内容。当有多行长度相等的最长行时,输出最先输入的行的信息。参考【例2-7】的讨论,分别使用不同的方法实现这一程序,比较各种方法的运行效率。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h" |
2009-02-10 11:13 在系统编程的时候经常要用到双向链表, 以前使用的都是内核头文件list.h中的链表库。但是太大了, 于是仔细分析了下内核链表的实现, 仿照它写了个简单的链表库, 基本的功能都有了。 如有需要, 以后在加。
#ifndef LIST_H
#define LIST_H
#include <stddef.h>
struct list_head {
struct list_head *prev, *next;
};
#define INIT_LIST_HEAD(name_ptr) do { |
| | |