文章列表
 
您正在查看 "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 {  
 
   
 
 
文章分类
 
 
 
Kernel(41)
 
 
C(11)
 
Life(43)
 
 
 
   
 
文章存档
 
     
 
最新文章评论
  

我觉得你应该来高校、研究机构,10年之前系统安全还是很火热的。不过只是系统安全在
 

原来博主是阿里的人呀!佩服
 

支持楼主,敬佩楼主的钻研精神
 

不知道怎么使用
 

博主你好!请问这个bug有没有可能造成down机,我的2.6.30.10内核发生了down 机,task
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu