Ⅰ linux下怎麼用c獲取硬碟物理序列號
1、在Linux系統中通過c語言獲取硬碟序列號,可以藉助於ioctl()函數,該函數原型如下:
intioctl(intfd,unsignedlongrequest,...);
ioctl的第一個參數是文件標識符,用open()函數打開設備時獲取。
ioctl第二個參數為用於獲得指定文件描述符的標志號,獲取硬碟序列號,一般指明為HDIO_GET_IDENTITY。
ioctl的第三個參數為一些輔助參數,要獲取硬碟序列號,需要藉助於structhd_driveid結構體來保存硬碟信息,該結構體在Linux/hdreg.h中,structhd_driveid的聲明如下
structhd_driveid{
unsignedshortconfig;/lotsofobsoletebitflags*/
unsignedshortcyls;/*Obsolete,"physical"cyls*/
unsignedshortreserved2;/*reserved(word2)*/
unsignedshortheads;/*Obsolete,"physical"heads*/
unsignedshorttrack_bytes;/*unformattedbytespertrack*/
unsignedshortsector_bytes;/*unformattedbytespersector*/
unsignedshortsectors;/*Obsolete,"physical"sectorspertrack*/
unsignedshortvendor0;/*vendorunique*/
unsignedshortvendor1;/*vendorunique*/
unsignedshortvendor2;/*Retiredvendorunique*/
unsignedcharserial_no[20];/*0=not_specified*/
unsignedshortbuf_type;/*Retired*/
unsignedshortbuf_size;/*Retired,512byteincrements
*0=not_specified
*/
……
};
2、源代碼如下
#include<stdio.h>
//ioctl()的聲明頭文件
#include<sys/ioctl.h>
//硬碟參數頭文件,hd_driveid結構聲明頭文件
#include<linux/hdreg.h>
//文件控制頭文件
#include<sys/fcntl.h>
intmain()
{
//用於保存系統返回的硬碟數據信息
structhd_driveidid;
//這里以第一塊硬碟為例,用戶可自行修改
//用open函數打開獲取文件標識符,類似於windows下的句柄
intfd=open("/dev/sda",O_RDONLY|O_NONBLOCK);
//失敗返回
if(fd<0){
perror("/dev/sda");
return1;}
//調用ioctl()
if(!ioctl(fd,HDIO_GET_IDENTITY,&id))
{
printf("SerialNumber=%s ",id.serial_no);
}
return0;
}
編譯完成後,執行效果如下:
Ⅱ c語言求翻譯
int main(int argc, char **argv)
{
float v;
unsigned int value;
// char *da_dev;
// unsigned int da_num=0;
if(argc < 3){ //如果參數小於三個 提示錯誤並退出
printf("\n");
printf("Error parameter\n");
printf("Input as:\n");
printf("[~]./ad_main da_id num\n");
printf(" da_id: select between 0 and 1\n");
printf(" num: range 0.0 ~ 4.096\n");
printf("\n");
return 1;
}
sscanf(argv[2], "%f",&v); //將第三個參數num保存至變數v
if(v<0 || v>Max504_FULL){ //檢查v是否滿足要求的范圍
printf("DA out must between: 0 to %f\n", Max504_FULL);
return 1;
}
value=(unsigned int)((v*1024.0f)/Max504_FULL);//對v進行運算
if((da_fd=open(DA_DEV, O_WRONLY))<0){ //打開DA_DEV指定的設備文件
printf("Error opening /dev/exio/0raw device\n");
return 1;
}
if(strcmp(argv[1],"0") == 0){ //檢查第二個參數da_id是否為0
ioctl(da_fd, DA_IOCTRL_CLR, 0); //clear da清除數據操作.
ioctl(da_fd, DA0_IOCTRL_WRITE, &value); //寫數據value
}else if (strcmp(argv[1],"1") == 0){ //檢查da_id是否為1
ioctl(da_fd, DA_IOCTRL_CLR, 1); //clear da.
ioctl(da_fd, DA1_IOCTRL_WRITE, &value);
}
#if 0//不會被編譯,調試用
ioctl(da_fd, DA_IOCTRL_CLR, 0); //clear da.
for(;;)
{
ioctl(da_fd, DA0_IOCTRL_WRITE, &value);
Delay(500);
}
#endif
close(da_fd); //關閉設備文件
printf("Current Voltage is %f v\n", v);//列印值v
return 0;
}
整個程序就是描述向設備da_id中寫入一個值value並列印出v
Ⅲ 在嵌入式開發平台上使風扇的轉速從慢到快。使用C語言程序編寫實現上述過程,謝謝!!!
#include<stdio.h>
#include<fcntl.h>
#defineDCM_SP(16384)
#defineMAX_LEVEL(100)//最大級數,這個需要確定是多少
#defineMIN_LEVEL(0)//最小級數
intcur_level=10;
//延時子函數
staticvoiddelay(intn)
{
for(inti=0;i<n;i++)
{
for(intj=0;j<1000;j++);
}
}
//從慢到快,level是變化的級數
voiddcm_slow_2_fast(intlevel)
{
for(inti=0;i<level;i++)
{
delay(100);
cur_level=(cur_level+1>MAX_LEVEL)?MAX_LEVEL:(cur_level+1);
ioctl(dcm_fd,0x10,cur_level*factor)
}
}
//從快到慢,level是變化的級數
voiddcm_fast_2_slow(intlevel)
{
for(inti=0;i<level;i++)
{
delay(100);
cur_level=(cur_level<=MIN_LEVEL)?MIN_LEVEL:(cur_level-1);
ioctl(dcm_fd,0x10,cur_level*factor)
}
}
main()
{
intdcm_fd=-1;
intfactor=DCM_SP/1024*10;
//打開DCM設備
if((dcm_fd=open("/dev/dcm/0raw",O_WRONLY))<0)
{
printf(" devopenerror ");
return0;
}
//控制過程
while(1)
{
//從慢到快
dcm_slow_2_fast(50);
delay(1000);
//從快到慢
dcm_fast_2_slow(50);
delay(1000);
}
}
DCM的控制我不是很清楚,如果不是這樣控制的話,那個ioctl函數的參數需要改。
這個程序我自己寫的,沒有編譯過,僅供參考。
Ⅳ C語言函數的診斷函數
所在函數庫為assert.h、math.h
void assert(int test) 一個擴展成if語句那樣的宏,如果test測試失敗,
就顯示一個信息並異常終止程序,無返回值
void perror(char *string) 本函數將顯示最近一次的錯誤信息,格式如下:
字元串string:錯誤信息
char *strerror(char *str) 本函數返回最近一次的錯誤信息,格式如下:
字元串str:錯誤信息
int matherr(struct exception *e)
用戶修改數學錯誤返回信息函數(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數學錯誤返回信息函數(沒有必要使用) 輸入輸出子程序,函數庫為io.h、conio.h、stat.h、dos.h、stdio.h、signal.h
int kbhit() 本函數返回最近所敲的按鍵
int fgetchar() 從控制台(鍵盤)讀一個字元,顯示在屏幕上
int getch() 從控制台(鍵盤)讀一個字元,不顯示在屏幕上
int putch() 向控制台(鍵盤)寫一個字元
int getchar() 從控制台(鍵盤)讀一個字元,顯示在屏幕上
int putchar() 向控制台(鍵盤)寫一個字元
int getche() 從控制台(鍵盤)讀一個字元,顯示在屏幕上
int ungetch(int c) 把字元c退回給控制台(鍵盤)
char *cgets(char *string) 從控制台(鍵盤)讀入字元串存於string中
int scanf(char *format[,argument…])從控制台讀入一個字元串,分別對各個參數進行
賦值,使用BIOS進行輸出
int vscanf(char *format,Valist param)從控制台讀入一個字元串,分別對各個參數進行
賦值,使用BIOS進行輸出,參數從Valist param中取得
int cscanf(char *format[,argument…])從控制台讀入一個字元串,分別對各個參數進行
賦值,直接對控制台作操作,比如顯示器在顯示時字元時即為直接寫頻方式顯示
int sscanf(char *string,char *format[,argument,…])通過字元串string,分別對各個
參數進行賦值
int vsscanf(char *string,char *format,Vlist param)通過字元串string,分別對各個
參數進行賦值,參數從Vlist param中取得
int puts(char *string) 發關一個字元串string給控制台(顯示器),
使用BIOS進行輸出
void cputs(char *string) 發送一個字元串string給控制台(顯示器),
直接對控制台作操作,比如顯示器即為直接寫頻方式顯示
int printf(char *format[,argument,…]) 發送格式化字元串輸出給控制台(顯示器)
使用BIOS進行輸出
int vprintf(char *format,Valist param) 發送格式化字元串輸出給控制台(顯示器)
使用BIOS進行輸出,參數從Valist param中取得
int cprintf(char *format[,argument,…]) 發送格式化字元串輸出給控制台(顯示器),
直接對控制台作操作,比如顯示器即為直接寫頻方式顯示
int vcprintf(char *format,Valist param)發送格式化字元串輸出給控制台(顯示器),
直接對控制台作操作,比如顯示器即為直接寫頻方式顯示,
參數從Valist param中取得
int sprintf(char *string,char *format[,argument,…])
將字元串string的內容重新寫為格式化後的字元串
int vsprintf(char *string,char *format,Valist param)
將字元串string的內容重新寫為格式化後的字元串,參數從Valist param中取得
int rename(char *oldname,char *newname)將文件oldname的名稱改為newname
int ioctl(int handle,int cmd[,int *argdx,int argcx])
本函數是用來控制輸入/輸出設備的,請見下表:
┌───┬────────────────────────────┐
│cmd值 │功能 │
├───┼────────────────────────────┤
│ 0 │取出設備信息 │
│ 1 │設置設備信息 │
│ 2 │把argcx位元組讀入由argdx所指的地址 │
│ 3 │在argdx所指的地址寫argcx位元組 │
│ 4 │除把handle當作設備號(0=當前,1=A,等)之外,均和cmd=2時一樣 │
│ 5 │除把handle當作設備號(0=當前,1=A,等)之外,均和cmd=3時一樣 │
│ 6 │取輸入狀態 │
│ 7 │取輸出狀態 │
│ 8 │測試可換性;只對於DOS 3.x │
│ 11 │置分享沖突的重算計數;只對DOS 3.x │
└───┴────────────────────────────┘
int (*ssignal(int sig,int(*action)())()執行軟體信號(沒必要使用)
int gsignal(int sig) 執行軟體信號(沒必要使用)
int _open(char *pathname,int access)為讀或寫打開一個文件,
按後按access來確定是讀文件還是寫文件,access值見下表
┌──────┬────────────────────┐
│access值 │意義 │
├──────┼────────────────────┤
│O_RDONLY │讀文件 │
│O_WRONLY │寫文件 │
│O_RDWR │即讀也寫 │
│O_NOINHERIT │若文件沒有傳遞給子程序,則被包含 │
│O_DENYALL │只允許當前處理必須存取的文件 │
│O_DENYWRITE │只允許從任何其它打開的文件讀 │
│O_DENYREAD │只允許從任何其它打開的文件寫 │
│O_DENYNONE │允許其它共享打開的文件 │
└──────┴────────────────────┘
Ⅳ 嵌入式開發平台上使風扇的轉速從慢到快.使用C語言程序編寫出現如下錯誤,求解!
你試試 void main() ,return 0; 換成 return ;
還有他說你的ioctl()函數沒有聲明
Ⅵ 進程激活過程用C語言描寫
/*以下是我寫的一個簡單的進程創建過程,VC6.0下編譯通過,注釋我就沒寫了,如果你看不懂的話網路追問我一下,如果幫上你了的話就選我吧*/
#include "windows.h"
#include "stdio.h"
int main()
{
char a;
PROCESS_INFORMATION processInfo;
DWORD ExitCode;
STARTUPINFO startInfo;
GetStartupInfo(&startInfo);
CreateProcess(NULL,"notepad.exe a.txt",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,
NULL,NULL,&startInfo,&processInfo);
printf("是否結束線程?Y/N\n");
if(getchar(a)=='Y')
{
GetExitCodeProcess(processInfo.hProcess,&ExitCode);
if(ExitCode==STILL_ACTIVE)
{
TerminateProcess(processInfo.hProcess,0);
CloseHandle(processInfo.hProcess);
processInfo.hProcess=0;
}
else
printf("進程已被關閉\n");
}
else
{
printf("您選擇不關閉進程,如需結束進程請自行手動關閉!\n");
}
return 0;
}
Ⅶ 怎麼用C語言獲取Linux系統的網卡IP地址
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<net/if.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<sys/ioctl.h>
//獲取地址
//返回IP地址字元串
intgetlocalip(char*outip)
{
inti=0;
intsockfd;
structifconfifconf;
charbuf=(char)malloc(512);
structifreq*ifreq;
char*ip;
//初始化ifconf
ifconf.ifc_len=512;
ifconf.ifc_buf=buf;
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
return-1;
}
ioctl(sockfd,SIOCGIFCONF,&ifconf);//獲取所有介面信息
close(sockfd);
//接下來一個一個的獲取IP地址
ifreq=(structifreq*)buf;
i=ifconf.ifc_len/sizeof(structifreq);
char*pos=outip;
intcount;
for(count=0;(count<5&&i>0);i--)
{
ip=inet_ntoa(((structsockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
if(strncmp(ip,"127.0.0.1",3)==0)//排除127.x.x.x,繼續下一個
{
ifreq++;
continue;
}else
{
printf("%s ",ip);
strcpy(pos,ip);
intlen=strlen(ip);
pos=' ';
pos+=len+1;
count++;
ifreq++;
}
}
free(buf);
return0;
}
//——————————-函數的調用方式————————————-
intmain(intargc,char**argv)
{
charip={'*'};
if(getlocalip(ip)==0)
{
printf("本機IP地址是:%s ",ip);
}
else
{
printf("無法獲取本機IP地址");
}
return0;
}
Ⅷ C語言如何獲取嵌入式linux網卡上的mac地址
全對應的
getmacaddress.c
#include<stdio.h>
#ifdefined(WIN32)||(!defined(__GNUC__)&&!defined(__clang__))
#include<winsock2.h>
#include<iphlpapi.h>
#include<stdlib.h>
#pragmacomment(lib,"IPHLPAPI.lib")
#elifdefined(__linux__)
#include<string.h>//strncpy
#include<sys/ioctl.h>
#include<sys/socket.h>
#include<net/if.h>
#else
//bsd
#include<sys/types.h>//FreeBSDu_int
#include<ifaddrs.h>
#include<net/if.h>
#include<net/if_dl.h>
#include<net/if_types.h>
#endif
voidgetmacaddress(char*mac_address){
#ifdefined(WIN32)||(!defined(__GNUC__)&&!defined(__clang__))
PIP_ADAPTER_INFOpAdapterInfo;
PIP_ADAPTER_INFOpAdapter;
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
unsignedchar*addr;
mac_address[0]=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
if(!pAdapterInfo)return;
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==ERROR_BUFFER_OVERFLOW){
free(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);
if(!pAdapterInfo)return;
}
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)==NO_ERROR){
pAdapter=pAdapterInfo;
if(pAdapter){
addr=pAdapter->Address;
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
}
free(pAdapterInfo);
#elifdefined(__linux__)
mac_address[0]=0;
structifreq*ifr,*ifend;
structifreqifreq;
structifconfifc;
structifreqifs[16];
intfd;
unsignedchar*addr;
fd=socket(AF_INET,SOCK_DGRAM,0);
ifc.ifc_len=sizeof(ifs);
ifc.ifc_req=ifs;
if(ioctl(fd,SIOCGIFCONF,&ifc)<0){close(fd);return;}
ifend=ifs+(ifc.ifc_len/sizeof(structifreq));
for(ifr=ifc.ifc_req;ifr<ifend;ifr++){
if(ifr->ifr_addr.sa_family==AF_INET){
strncpy(ifreq.ifr_name,ifr->ifr_name,sizeof(ifreq.ifr_name));
if(ioctl(fd,SIOCGIFHWADDR,&ifreq)<0)continue;
addr=ifreq.ifr_hwaddr.sa_data;
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
}
}
close(fd);
#else
//bsd
mac_address[0]=0;
structifaddrs*ifa_list,*ifa;
structsockaddr_dl*dl;
unsignedchar*addr;
if(getifaddrs(&ifa_list)<0)return;
for(ifa=ifa_list;ifa;ifa=ifa->ifa_next){
dl=(structsockaddr_dl*)ifa->ifa_addr;
if(dl->sdl_family==AF_LINK&&dl->sdl_type==IFT_ETHER){
addr=(unsignedchar*)LLADDR(dl);
sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
return;
}
}
freeifaddrs(ifa_list);
#endif
}
Ⅸ linux c語言如何實現修改mac地址,不是使用系統命令。
用ioctl控制,通過SIOCGIFHWADDR獲取MAC地址,SIOCSIFHWADDR設置MAC地址,不過在設
置MAC地址之前,要先把網卡down掉,設置好了以後,再UP起來,具體細節你可以查查相關資
料,收獲的會更多
Ⅹ 請教c語言ioctl函數的用法.急...
這個函數本身沒什麼特別的, 但是參數的使用跟具體設備和驅動有關系, 所以其實沒法解釋這個東西具體該怎麼用, 你要操作什麼設備就得仔細去讀這個設備驅動的文檔