1. 程式人生 > >關於一直卡死的兩段程式碼,望對LDD3有興趣者戳開這個blog : )

關於一直卡死的兩段程式碼,望對LDD3有興趣者戳開這個blog : )

       想來都有點恨自己,前幾個月遇到的"難題".還是沒有解決.一直卡死,又找不出原因.

吐個槽,那些只貼程式碼不附上執行結果的toturial, 我表示...我就不明白,既然有些bloger程式碼都給出來了

讓我這種渣渣看一下腫麼用的會怎麼樣?看一下你執行結果會怎麼樣?

說明:額...這個問題"貼"沒有附上執行結果,是因為直接會卡死我的Linux主機,然後我壓根沒辦法截圖給大家看,也沒辦法debug. 希望諒解

------------------------------------------------

問題程式碼一:

/***********************************************************
code writer	: EOF
code date	: 2014.09.02
code file	: proc_time_delay.c
e-mail		: 
[email protected]
code purpose: This code is programmed for how to delay 1 second by jiffies and HZ. If there is something wrong with my code, please touch me by e-mail. Thank you. ************************************************************/ #include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/fs.h> #include <linux/proc_fs.h> /* for procfs */ #include <linux/seq_file.h> /* for 'struct seq_file' */ #include <linux/types.h> #include <linux/jiffies.h> /* for jiffies */ #define PROC_NAME "delay_one_second" MODULE_AUTHOR("Jason Leaster"); MODULE_LICENSE("Dual BSD/GPL"); static int proc_demo_seq_show(struct seq_file* sfile,void* v) { int tmp = 0; unsigned long jif = jiffies; unsigned long one_second_later = jiffies + HZ; for(tmp = 0; tmp < 10;tmp++) { while(time_after(one_second_later,jif)) { jif = jiffies; } one_second_later = jif + HZ; seq_printf(sfile,"Hello world! jiffies:%lu\n",jif); } return 0; } static void* proc_demo_seq_start(struct seq_file* sfile,loff_t *pos) { return NULL; } static void proc_demo_seq_stop(struct seq_file* sfile,void* v) { /* Nothing to be done. */ } static void* proc_demo_seq_next(struct seq_file* sfile,void* v,loff_t* pos) { return NULL; } static struct seq_operations proc_demo_ops = { .start = proc_demo_seq_start, .next = proc_demo_seq_next, .stop = proc_demo_seq_stop, .show = proc_demo_seq_show, }; static int proc_demo_open(struct inode* inode, struct file* filp) { return single_open(filp,&proc_demo_seq_show,NULL); } struct file_operations proc_demo_fops = { .owner = THIS_MODULE, .open = proc_demo_open, .read = seq_read, .release= seq_release, }; int proc_demo_init(void) { struct proc_dir_entry * entry = NULL; entry = proc_create(PROC_NAME,0,NULL,&proc_demo_fops); if(!entry) { printk(KERN_ALERT "line:%d proc_create failed!",__LINE__); } return 0; } void proc_demo_exit(void) { /* ** The second parameter of 'remove_proc_entry()' is ** a pointer which point to parent directory.We create our ** proc-entry-point in /proc/, so we pass NULL into it. */ remove_proc_entry(PROC_NAME,NULL); } module_init(proc_demo_init); module_exit(proc_demo_exit);
問題程式碼2:
/***********************************************************
code writer	: EOF
code date	: 2014.09.02
code file	: proc_time_delay.c
e-mail		: [email protected]

code purpose:
	
	This code is programmed for how to delay by kernel
timer.

	If there is something wrong with my code, please touch
me by e-mail. Thank you.

************************************************************/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>

#include <linux/fs.h>
#include <linux/proc_fs.h>	/* for procfs */
#include <linux/seq_file.h>	/* for 'struct seq_file' */
#include <linux/types.h>

#include <linux/jiffies.h>	/* for jiffies */
#include <linux/timer.h>	/* for timer*/

#include <linux/sched.h>
#include <linux/slab.h>

#define PROC_NAME "delay_kernel_timer"

MODULE_AUTHOR("Jason Leaster");
MODULE_LICENSE("Dual BSD/GPL");

#define LOOP 5

/*
**	First of all, you should make abstract a model
** for our device driver and include the timer.
*/

struct timer_delay_model
{
	struct timer_list timer;
	wait_queue_head_t wait;
	unsigned long prevjiffies;
	struct seq_file	* output;

	int loops ;
	/*	...	*/
};

void jif_timer_fn(unsigned long arg)
{
	struct timer_delay_model* p_model = (struct timer_delay_model*)arg;
	unsigned long jif = jiffies;

	seq_printf(p_model->output,"Hello world! jiffies:%lu\n",jif);

	printk(KERN_ALERT "in jif_timer_fc %d\n",p_model->loops);

/*
	if(--(p_model->loops))
	{
		p_model->timer.expires += HZ;
		p_model->prevjiffies	= jif;

		add_timer(&p_model->timer);
	}
	else
	{
		wake_up_interruptible(&p_model->wait);
	}
*/

	p_model->loops = 0;
}

static int proc_demo_seq_show(struct seq_file* sfile,void* v)
{
	unsigned long jif = jiffies;

	struct timer_delay_model* p_model;

	p_model = kmalloc(sizeof(struct timer_delay_model),GFP_KERNEL);

	if(!p_model)
	{
		printk(KERN_ALERT "kmalloc error in %d %s\n",__LINE__,__FUNCTION__);
		return -ENOMEM;
	}
	else
	{
		printk(KERN_ALERT "start to initialization %lu\n",jiffies);
		init_timer(&p_model->timer);
		init_waitqueue_head(&p_model->wait);
	
		p_model->prevjiffies	= jif;
		p_model->output		= sfile;
		p_model->loops		= LOOP;
		p_model->timer.data	= (unsigned long) sfile;
		p_model->timer.function = jif_timer_fn;
		p_model->timer.expires	= jif + HZ;// delay 1 second
		printk(KERN_ALERT "add_timer  ing %lu\n",jiffies);
		add_timer(&p_model->timer);
	}

	printk(KERN_ALERT "add_timer  finished %lu\n",jiffies);

//	wait_event_interruptible(p_model->wait,!(p_model->loops));

	while(time_after(p_model->prevjiffies + HZ,jif))
	{
		jif = jiffies;
	}		

	printk(KERN_ALERT "wait finished\n");

	kfree(p_model);

	if (signal_pending(current))
		return -ERESTARTSYS;

	return 0;
}

static void* proc_demo_seq_start(struct seq_file* sfile,loff_t *pos)
{
	return NULL;
}

static void proc_demo_seq_stop(struct seq_file* sfile,void* v)
{
	/* Nothing to be done. */
}

static void* proc_demo_seq_next(struct seq_file* sfile,void* v,loff_t* pos)
{
	return NULL;
}

static struct seq_operations proc_demo_ops = 
{
	.start	=	proc_demo_seq_start,
	.next	=	proc_demo_seq_next,
	.stop	=	proc_demo_seq_stop,
	.show	=	proc_demo_seq_show,
};

static int proc_demo_open(struct inode* inode, struct file* filp)
{
	return single_open(filp,&proc_demo_seq_show,NULL);
}

struct file_operations proc_demo_fops = 
{
	.owner	=	THIS_MODULE,
	.open	=	proc_demo_open,
	.read	=	seq_read,
	.release=	single_release,
};

int proc_demo_init(void)
{
	struct proc_dir_entry * entry = NULL;
	
	entry =	proc_create(PROC_NAME,0,NULL,&proc_demo_fops);
	if(!entry)
	{
		printk(KERN_ALERT "line:%d proc_create failed!",__LINE__);
	}

	return 0;
}

void proc_demo_exit(void)
{
	/*
	**       The second parameter of 'remove_proc_entry()' is 
	** a pointer which point to parent directory.We create our
	** proc-entry-point in /proc/, so we pass NULL into it.
	*/
	remove_proc_entry(PROC_NAME,NULL);
}

module_init(proc_demo_init);
module_exit(proc_demo_exit);


讀過LDD3或者ELDD的讀者能夠一起交流討論 : )


相關推薦

關於一直程式碼LDD3興趣這個blog : )

       想來都有點恨自己,前幾個月遇到的"難題".還是沒有解決.一直卡死,又找不出原因. 吐個槽,那些只貼程式碼不附上執行結果的toturial, 我表示...我就不明白,既然有些bloger程式碼都給出來了 讓我這種渣渣看一下腫麼用的會怎麼樣?看一下你執行結果會

程式設計師寫了程式碼自稱完美!網友:我現在還在改你的Bug

現在的網際網路技術在飛速進步著,加之有一些程式設計師確實是喜歡程式設計,長久如此,很多程式設計師的技術也得到了一個質的飛躍,於是都想寫出一個堪稱沒有Bug的程式碼! 這不,近日又有一位程式設計師發帖稱: 在這我還是要推薦下我自己的前端學習群:733581373,不管

若還 不懂 java synchronized 同步物件wait,notify問題看完這程式碼解決問題。

<原文地址:http://blog.csdn.net/cnmm22/article/details/44273843> 看程式碼很累,特別看別人滴程式碼,又特別針對新人,但請你忍耐一下,看完這兩個單獨案例。 這兩個個程式碼的功能一樣,都是間斷列印1、2、1、

Kylin新建cube一直停留在第一步等了幾個小時沒反應

我用的版本的kylin2.5.0, hadoop環境為hdp3.0  hadoop3.1的, 試過更換kylin版本為2.5.1, 更換完後結果問題是一樣的,卡住在build cube第一步上 查了下後臺的日誌,一直在刷這幾句,前臺任務那裡看不到有日誌 我的a

用Python寫一程式碼實現接收使用者輸入個的數字並輸出數字相加後的結果要求使用者輸入任何內容程式不會報錯

分別採用基礎方法和異常處理方法實現。 基礎方法程式碼如下: num1 = input('請輸入數字1:') if num1.strip() == '': print('輸入錯誤。') exit() elif num1[0] != '.': for

Maven+SpringMVC+Eclipse軟體安裝配置Maven報外掛異常Eclipse總是的解決方法匯入一個maven工程後 一直顯示importing maven project

1.Maven+SpringMVC+Eclipse軟體安裝配置,Maven報外掛錯誤,Eclipse總是卡死的解決辦法,匯入一個maven工程後 一直顯示importing maven project

vbs整人程式碼表白+提醒 程式碼就OK

在沉悶的工作環境下,有時玩玩整人程式碼也不錯,整人程式碼一般使用VBS指令碼來實現,簡單的兩行程式碼就可以實現表白+提醒了,不過大家也要警惕VBS指令碼的危險性,下面小編分享的只是整人簡單指令碼,大家可以隨便玩!並不損壞電腦檔案。 先來第一段彈窗程式碼:msgbox"內容A"

程式碼倍時差直擊併發程式設計偽共享

## 一、前言 【閒話開篇】:這段時間專案接近尾聲,我終於閒了一點,又拿起了早先未看完的書《JAVA高併發程式設計》,強迫自己學習。看到其中介紹《無鎖的快取框架:Disruptor》時,接觸到了一個概念——偽共享(false sharing),說是會影響併發程式的執行效能,被很多人描述成無聲的效能殺手,突然

寫完這程式碼就被除了……

最近在Java技術棧微信公眾號粉絲微信群裡看到一張圖,說是剛寫完這段下面這段程式碼就被開除了。 開除的原因是因為沒寫註釋嗎? 顯然不是,休眠的邏輯,大家都懂,不需要寫註釋,你註釋寫休眠 1 天也沒意義啊。。。 這個程式設計師的思維不是一般的牛啊,獲取下一天的日期,居然要休眠等到下一天再獲取,欲哭無淚

Java程式設計師剛寫完這程式碼就被除了!網友:程式碼沒毛病啊

一般程式設計師寫的程式碼都是非常多的,畢竟這是一個技術活,需要多練習多實踐才能掌握。但是有一位程式設計師卻因為寫了一段程式碼就遭到領導開除! 在分享這篇文章之前呢,我先分享下我總結的一些乾貨,我自己也是一位從事了6年開發的全棧工程師,今年年初我整理了一份最適合2018年學習的java乾貨,包括基

[轉載]用verilog寫一程式碼實現消除一個glitch

  濾掉小於1個週期glitch的原理圖如下:   verilog程式碼實現如下: module digital_filter_(clk_in,rst,host_rst,host_rst_filter); input clk_in; input rst; i

關於影象處理的幾程式碼存此待查

根據源圖RECT、目標Rect計算縮放後(不放大),新的顯示Rect 序列化CImage CImage複製 //根據源圖RECT、目標Rect計算縮放後(不放大),新的顯示Rect static void GetStretchRect(CRect*rcResult, const CRect rcDst

程式設計師晒出實習生的一程式碼表示看不懂!網友:out了新寫法

技術總是在不停的更新迭代,這就是程式設計師為什麼要保持學習能力的原因了,與其他行業相比,程式設計師不學習新知識,只是保持現有的技術,幾年後再回頭看看,就可能與同行落下去一大截,當然,對於技術的更新也是徐徐漸進的,只要有一定的技術嗅覺,多留意一些技術官方網站的最新發布, 多留意一下發展的動向就不會那麼

Java之父22年前寫的一程式碼你見過嗎?

Java之父高斯林是一位加拿大的計算機天才。 他創造了偉大的程式語言——Java,在TIOBE排行榜上,Java常年排名第一。 現在這位63歲高齡的祖師爺依然戰鬥在程式設計最前線,寶刀不老。 1、Java之父找不到工作? 之算是Java之父,也難逃中老年危機。 高斯林曾在Facebook上

網友:沒有一程式碼看起來簡單實則威力無窮程式設計師:

話不多說,直接上圖 程式碼:System.exit(0); 這句程式碼,很簡單,但是也非常暴力。就是結束整個程式。 1、下面先演示下不加上這個語句: 然後控制檯輸出兩個println; 2、現在加這句程式碼放在中間 然後執行的效果就是: 3、現在把語句放在開頭

用python實現一程式碼它的功能是將自己列印

今天看到一道有趣的面試題,用python實現一段程式碼,然後將自己列印,其實很簡單 import sys   首先匯入 sys 模組 f_name = sys.argv[0]              sys.argv[ ]第一個元素是程式本身,sys.argv[0] 

《UNIX環境高階程式設計》中涉及到一程式碼ourhdr.h檔案以後備用!

#ifndef __ourhdr_h   #define __ourhdr_h   #include    <errno.h>               /*for definition of errno                      */ #inc

行”程式碼實現FaceTime的新多人視訊通話效果

一年一度的 WWDC 開幕了。我們看了來自各個勤勞媒體的回顧與解讀。在這些新功能中,最吸引我們的還是最新更新的 FaceTime。 這次 FaceTime 不僅開始支援群組視訊通話,還可以在視訊通話時,判斷誰在說,並自動放大他的視訊視窗。乍看上去,很是驚豔。不過如果是基於聲網視訊通話

程式設計師發了程式碼網友:先容你跑39米40米的大刀收不回了!

程式設計師 — 一個網際網路行業中最苦逼的一個職位。因為他們每天都要幹很多的活,還要加很多的班,掉很多頭髮,背很多的黑鍋(ps:我能怎麼辦我也很絕望啊!ヽ(≧□≦)ノ)。但是程式設計師每天敲敲程式碼,不會很枯燥嗎?是的,如果作為一名程式設計師每天就只敲程式碼,的確很乏味。但是誰說程式設計師每天就只會

Python面試題:寫一程式碼功能是將本程式碼打印出來

前幾日,遇到這麼一道面試題,記錄下來 思路分析: 首先需要獲取檔案路徑,可以使用sys.argv[0],它是命令列引數List,第一個元素是程式本身路徑(更多sys模組的常用方法見https://blog.csdn.net/qq_38276669/article/details/8368