当前位置:首页 » 编程语言 » c语言ioctl
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言ioctl

发布时间: 2022-06-13 14:22:36

Ⅰ 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函数的用法.急...

这个函数本身没什么特别的, 但是参数的使用跟具体设备和驱动有关系, 所以其实没法解释这个东西具体该怎么用, 你要操作什么设备就得仔细去读这个设备驱动的文档