當前位置:首頁 » 操作系統 » linux常式

linux常式

發布時間: 2023-11-12 00:27:33

linux C語言怎麼讀取文件指定行內容

1、用fgets函數可以讀取文件中某行的數據,某列數據就必須一個一個讀入每行的第幾個字元,再存入到一個字元串當中。

2、常式:

#include<stdio.h>
#include<string.h>
voidmain()
{
chara[100],b[100],c[100];
inti=3,j=4,k=0;//第三行,第四列
FILE*fp=fopen("data.txt","r");
while(fgets(c,100,fp)){//讀入每行數據
i--;
if(i==0)strcpy(a,c);//讀到第三行數據
b[k++]=c[j-1];//把每行的那列字元拷到b中
}
b[k]=0;
printf("第%d行數據:%s ",i,a);
printf("第%d列數據:%s ",j,b);
fclose(fp);
}

㈡ 如何在linux c 實現list

C語言沒有類的概念。C++有現成的List類, #include<list>即可。
如果要自己實現可以參考C++數據結構的書籍,是最基本的練習。
這里實現一個簡單的常式,請參考:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include<stdio.h>
#include<string>

#include "math.h"

template<class T> class List{
public:
List() //構造函數
{
pFirst = NULL;
}

void Add(T& t) //在Link表頭添加新結點
{
if(pFirst == NULL)
{
pFirst = new Node;
*(pFirst->pT) = t;
}
else
{
Node* pNewNode = new Node;
*(pNewNode->pT) = t;
pNewNode->pNext = pFirst;
pFirst = pNewNode;
}
}

void Remove(T& t) //在Link中刪除含有特定值的元素
{
Node* pNode = pFirst;
if(*(pNode->pT) == t)
{
pFirst = pFirst->pNext;
delete pNode;
return;
}
while(pNode != NULL)
{
Node* pNextNode = pNode->pNext;
if(pNextNode!=NULL)
{
if(*(pNextNode->pT) == t)
{
pNode->pNext = pNextNode->pNext;
delete pNextNode;
return;
}
}
else
return;//沒有相同的

pNode = pNode->pNext;
}
}
T* Find(T& t) //查找含有特定值的結點
{
Node* pNode = pFirst;
while(pNode != NULL)
{
if(*(pNode->pT) == t)
{
return pNode->pT;
}
pNode = pNode->pNext;
}
return NULL;
}
void PrintList() // 列印輸出整個鏈表
{
if(pFirst == NULL)
{
cout<<"列表為空列表!"<<endl;
return;
}
Node* pNode = pFirst;
while(pNode != NULL)
{
cout<<*(pNode->pT)<<endl;
pNode = pNode->pNext;
}
}
~List()
{
Node* pNode = pFirst;
while(pNode != NULL)
{
Node* pNextNode = pNode->pNext;
delete pNode;
pNode = pNextNode;
}
}
protected:
struct Node{
Node* pNext;
T* pT;

Node()
{
pNext = NULL;
pT = new T;
}
~Node()
{
delete pT;
}
};
Node *pFirst; //鏈首結點指針
};

class Student
{
public:
char id[20]; //學號
char name[20]; //姓名
int age; //年齡
Student()
{
}
~Student()
{
}
Student(const char* pid, const char* pname, int _age)
{
strcpy(id, pid);
strcpy(name, pname);
age = _age;
}
bool operator==(const Student& stu)
{
return strcmp(id, stu.id) == 0 && strcmp(id, stu.id) == 0 && age==stu.age;
}
Student& operator=(const Student& stu)
{
strcpy(id, stu.id);
strcpy(name, stu.name);
age = stu.age;
}
friend ostream& operator<< (ostream &out,const Student& stu);
};
ostream & operator<< (ostream &out,const Student& stu)
{
out<<"id:"<<stu.id<<"\tname:"<<stu.name<<"\tage:"<<stu.age<<endl;
}

int main()
{
List<Student> stuList;
cout<<"添加學生前:"<<endl;
stuList.PrintList();

Student stu1("1", "張三", 18);
Student stu2("2", "李四", 18);
Student stu3("3", "王五", 18);
Student stu4("4", "至尊寶", 18);
Student stu5("5", "豬八戒", 18);
Student stu6("6", "唐僧", 18);
Student stu7("7", "沙和尚", 18);
Student stu8("8", "觀音", 18);
stuList.Add(stu1);
stuList.Add(stu2);
stuList.Add(stu3);
stuList.Add(stu4);
stuList.Add(stu5);
stuList.Add(stu6);
stuList.Add(stu7);
stuList.Add(stu8);
cout<<"添加學生後:"<<endl;
stuList.PrintList();
Student stu11("1", "張三", 18);
Student* pStu = stuList.Find(stu11);
cout<<"查找到的同學是:"<<*pStu;

stuList.Remove(stu11);
cout<<"\n\n刪除第一個後:"<<endl;
stuList.PrintList();

return 0;
}

㈢ 《Linux設備驅動程序》(十六)-中斷處理

設備與處理器之間的工作通常來說是非同步,設備數據要傳遞給處理器通常來說有以下幾種方法:輪詢、等待和中斷。

讓CPU進行輪詢等待總是不能讓人滿意,所以通常都採用中斷的形式,讓設備來通知CPU讀取數據。

2.6內核的函數參數與現在的參數有所區別,這里都主要介紹概念,具體實現方法需要結合具體的內核版本。

request_irq函數申請中斷,返回0表示申請成功,其他返回值表示申請失敗,其具體參數解釋如下:

flags 掩碼可以使用以下幾個:

快速和慢速處理常式 :現代內核中基本沒有這兩個概念了,使用SA_INTERRUPT位後,當中斷被執行時,當前處理器的其他中斷都將被禁止。通常不要使用SA_INTERRUPT標志位,除非自己明確知道會發生什麼。

共享中斷 :使用共享中斷時,一方面要使用SA_SHIRQ位,另一個是request_irq中的dev_id必須是唯一的,不能為NULL。這個限制的原因是:內核為每個中斷維護了一個共享處理常式的列表,常式中的dev_id各不相同,就像設備簽名。如果dev_id相同,在卸載的時候引起混淆(卸載了另一個中斷),當中斷到達時會產生內核OOP消息。

共享中斷需要滿足以下一個條件才能申請成功:

當不需要使用該中斷時,需要使用free_irq釋放中斷。

通常我們會在模塊載入的時候申請安裝中斷處理常式,但書中建議:在設備第一次打開的時候安裝,在設備最後一次關閉的時候卸載。

如果要查看中斷觸發的次數,可以查看 /proc/interrupts 和 /proc/stat。

書中講述了如何自動檢測中斷號,在嵌入式開發中通常都是查看原理圖和datasheet來直接確定。

自動檢測的原理如下:驅動程序通知設備產生中斷,然後查看哪些中斷信號線被觸發了。Linux提供了以下方法來進行探測:

探測工作耗時較長,建議在模塊載入的時候做。

中斷處理函數和普通函數其實差不多,唯一的區別是其運行的中斷上下文中,在這個上下文中有以下注意事項:

中斷處理函數典型用法如下:

中斷處理函數的參數和返回值含義如下:

返回值主要有兩個:IRQ_NONE和IRQ_HANDLED。

對於中斷我們是可以進行開啟和關閉的,Linux中提供了以下函數操作單個中斷的開關:

該方法可以在所有處理器上禁止或啟用中斷。

需要注意的是:

如果要關閉當前處理器上所有的中斷,則可以調用以下方法:

local_irq_save 會將中斷狀態保持到flags中,然後禁用處理器上的中斷;如果明確知道中斷沒有在其他地方被禁用,則可以使用local_irq_disable,否則請使用local_irq_save。

locat_irq_restore 會根據上面獲取到flags來恢復中斷;local_irq_enable 會無條件打開所有中斷。

在中斷中需要做一些工作,如果工作內容太多,必然導致中斷處理所需的時間過長;而中斷處理又要求能夠盡快完成,這樣才不會影響正常的系統調度,這兩個之間就產生了矛盾。

現在很多操作系統將中斷分為兩個部分來處理上面的矛盾:頂半部和底半部。

頂半部就是我們用request_irq來注冊的中斷處理函數,這個函數要求能夠盡快結束,同時在其中調度底半部,讓底半部在之後來進行後續的耗時工作。

頂半部就不再說明了,就是上面的中斷處理函數,只是要求能夠盡快處理完成並返回,不要處理耗時工作。

底半部通常使用tasklet或者工作隊列來實現。

tasklet的特點和注意事項:

工作隊列的特點和注意事項:

熱點內容
用戶上傳伴奏 發布:2024-11-30 09:35:33 瀏覽:263
sql伺服器配置失敗 發布:2024-11-30 09:35:21 瀏覽:910
php從傳智播客 發布:2024-11-30 09:33:47 瀏覽:965
硬碟錄像機外接存儲伺服器 發布:2024-11-30 09:27:18 瀏覽:993
雅視修改密碼為什麼失敗 發布:2024-11-30 09:25:46 瀏覽:966
安卓照片大小怎麼改100k內 發布:2024-11-30 09:20:39 瀏覽:431
ups系統如何配置網路 發布:2024-11-30 09:06:14 瀏覽:58
怎麼看pppoe密碼 發布:2024-11-30 08:35:35 瀏覽:510
sandisk16gb存儲卡 發布:2024-11-30 08:34:42 瀏覽:954
eclipsejava反編譯 發布:2024-11-30 08:34:37 瀏覽:900