hello world

#include <stdio.h>
int main(int argc, char **argv)
{  printf("Hello world, this is my first app!\r\n");  return 0;
}

命令行参数处理函数

http://blog.chinaunix.net/uid-26833883-id-3215592.html

#include <stdio.h>
#include <unistd.h>int main(int argc,char *argv[])
{int ch;while((ch = getopt(argc,argv,"cyg")) != -1){switch(ch){case 'c':printf("optind = %d\n",optind);printf("Option character \'c\'.\n");break;case 'y':printf("optind = %d\n",optind);printf("Option character \'y\'.\n");break;case 'g':printf("optind = %d\n",optind);printf("Option character \'g\'.\n");break;}}printf("Ending...\n");printf("optind = %d\n",optind);return 0;
}
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>int main(int argc,char *argv[])
{int flag_value = 100;while(1){int option_index = 0;int rvalue = 0;static struct option long_option[] = {{"help0",no_argument,0,0},{"help1",required_argument,0,0},{"help2",optional_argument,0,0},{"help3",no_argument,0,10},{0,0,0,0},};long_option[3].flag = &flag_value;rvalue = getopt_long(argc,argv,"a:bc::",long_option,&option_index);if(rvalue == -1){printf("No more argument.\n");return -1;}switch(option_index){case 0:printf("Long option is : %s\n",long_option[option_index].name);break;case 1:printf("Long option is : %s ",long_option[option_index].name);if(optarg){printf("with parm '%s'",optarg);}printf("\n");break;case 2:printf("Long option is : %s ",long_option[option_index].name);if(optarg){printf("with parm '%s'",optarg);}printf("\n");break;case 3:printf("Long option is : %s\n",long_option[option_index].name);break;}printf("flag_value = %d\n",flag_value);}return 0;
}

fork与vfork的区别

#include <sys/types.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{pid_t pid;pid=fork();if(pid<0)printf("error in fork!");else if(pid==0)printf("I am the child process,ID is %d\n",getpid());elseprintf("I am the parent process,ID is %d\n",getpid());
}
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main(void)
{pid_t pid;int count=0;pid=vfork();if(pid==0){count++;_exit(0);}
else
{count++;
}
printf("count= %d\n",count);
return 0;
}

信号处理

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>  int value = 0;  void func(int sig)
{  printf("I get a signal!\n");  value = 1;
}  int main()
{  signal(SIGINT, func);  while(0 == value)  sleep(1);  return 0;
}

文件映射

/*** @file mmap_file.c*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>#define MMAP_FILE_NAME "a.txt"
#define MMAP_FILE_SIZE 10void err_exit(const char *err_msg)
{printf("error:%s\n", err_msg);exit(1);
}/* 信号处理器 */
void signal_handler(int signum)
{if (signum == SIGSEGV)printf("\nSIGSEGV handler!!!\n");else if (signum == SIGBUS)printf("\nSIGBUS handler!!!\n");exit(1);
}int main(int argc, const char *argv[])
{if (argc < 2){printf("usage:%s text\n", argv[0]);exit(1);}char *addr;int file_fd, text_len;long int sys_pagesize;/* 设置信号处理器 */if (signal(SIGSEGV, signal_handler) == SIG_ERR)err_exit("signal()");if (signal(SIGBUS, signal_handler) == SIG_ERR)err_exit("signal()");if ((file_fd = open(MMAP_FILE_NAME, O_RDWR)) == -1)err_exit("open()");/* 系统分页大小 */sys_pagesize = sysconf(_SC_PAGESIZE);printf("sys_pagesize:%ld\n", sys_pagesize);/* 内存只读 *///addr = (char *)mmap(NULL, MMAP_FILE_SIZE, PROT_READ, MAP_SHARED, file_fd, 0);/* 映射大于文件长度,且大于该文件分页大小 *///addr = (char *)mmap(NULL, sys_pagesize + 1, PROT_READ | PROT_WRITE, MAP_SHARED, file_fd, 0);/* 正常分配 */addr = (char *)mmap(NULL, MMAP_FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, file_fd, 0);if (addr == MAP_FAILED)err_exit("mmap()");/* 原始数据 */printf("old text:%s\n", addr);/* 越界访问 *///addr += sys_pagesize + 1;//printf("out of range:%s\n", addr);/* 拷贝新数据 */text_len = strlen(argv[1]);memcpy(addr, argv[1], text_len);/* 同步映射区数据 *///if (msync(addr, text_len, MS_SYNC) == -1)//    err_exit("msync()");/* 打印新数据 */printf("new text:%s\n", addr);/* 解除映射区域 */if (munmap(addr, MMAP_FILE_SIZE) == -1)err_exit("munmap()");return 0;
}

时间编程

http://www.ibm.com/developerworks/cn/linux/1307_liuming_linuxtime1/

time的使用

#include <time.h>
int main ()
{time_t time_raw_format;time ( &time_raw_format ); //获取当前时间printf (" time is [%d]\n", time_raw_format);//用 ctime 将时间转换为字符串输出printf ( "The current local time: %s", ctime(&time_raw_format));return 0;
}

时间显示转换

int main ()
{time_t time_raw_format;struct tm * time_struct;char buf [100];time ( &time_raw_format );time_struct = localtime ( &time_raw_format );strftime (buf,100,"It is now: %I:%M%p.",time_struct);puts (buf);return 0;
}

gettimeofday

void function()
{ unsigned int i,j; double y; for(i=0;i<1000;i++) for(j=0;j<1000;j++) y=sin((double)i); //耗时操作
} main()
{ struct timeval tpstart,tpend; float timeuse; gettimeofday(&tpstart,NULL); //记录开始时间戳function(); gettimeofday(&tpend,NULL); //记录结束时间戳timeuse = 1000000*(tpend.tv_sec-tpstart.tv_sec)+
tpend.tv_usec-tpstart.tv_usec; //计算差值timeuse /= 1000000; printf("Used Time:%f\n",timeuse); exit(0);
}

RDTSC

unsigned long long get_cycles()
{unsigned low, high;unsigned long long val;rdtsc(low,high);val = high;
val = (val << 32) | low; //将 low 和 high 合成一个 64 位值return val;
}double get_cpu_mhz(void)
{FILE* f;char buf[256];double mhz = 0.0;f = fopen("/proc/cpuinfo","r"); //打开 proc/cpuinfo 文件if (!f)return 0.0;while(fgets(buf, sizeof(buf), f)) {double m;int rc;
rc = sscanf(buf, "cpu MHz : %lf", &m); //读取 cpu MHzif (mhz == 0.0) {mhz = m;break;}}fclose(f);
return mhz; //返回 HZ 值
}int main()
{double mhz;mhz = get_cpu_mhz();cycles_t c1, c2;for(;;){c1 = get_cycles(); sleep(1);c2 = get_cycles();//c2 和 c1 的差值应该为 1000000us,即 1 秒printf("1 sec = %g usec\n", (c2 - c1) / mhz); }
}

定时器

void print_info(int signo)
{ printf(“timer fired\n”); //简单的打印,表示 timer 到期
} void init_sigaction(void)
{ struct sigaction act; act.sa_handler= print_info; act.sa_flags=0; sigemptyset(&act.sa_mask); sigaction(SIGPROF,&act,NULL); //设置信号 SIGPROF 的处理函数为 print_info
} void init_time()
{ struct itimerval value; value.it_value.tv_sec=2; value.it_value.tv_usec=0; value.it_interval=value.it_value; setitimer(ITIMER_PROF,&value,NULL); //初始化 timer,到期发送 SIGPROF 信号
} int main()
{ len=strlen(prompt); init_sigaction(); init_time(); while(1); exit(0);
}

音频编程

http://www.hzlitai.com.cn/article/ARM9-article/example/1518.html

一个利用声卡上的DSP设备进行声音录制和回放的基本框架,它的功能是先录制几秒种音频数据,将其存放在内存缓冲区中,然后再进行回放,其所有的功能都是通过读写/dev/dsp设备文件来完成的

/*
* sound.c
*/
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>#define LENGTH 3 /* 存储秒数 */
#define RATE 8000 /* 采样频率 */
#define SIZE 8 /* 量化位数 */
#define CHANNELS 1 /* 声道数目 *//* 用于保存数字音频数据的内存缓冲区 */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];int main()
{
int fd; /* 声音设备的文件描述符 */
int arg; /* 用于ioctl调用的参数 */
int status; /* 系统调用的返回值 *//* 打开声音设备 */
fd = open("/dev/dsp", O_RDWR);
if (fd < 0) {
perror("open of /dev/dsp failed");
exit(1);
}/* 设置采样时的量化位数 */
arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");/* 设置采样时的声道数目 */
arg = CHANNELS;
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");/* 设置采样时的采样频率 */
arg = RATE;
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");/* 循环,直到按下Control-C */
while (1) {
printf("Say something:\n");
status = read(fd, buf, sizeof(buf)); /* 录音 */
if (status != sizeof(buf))
perror("read wrong number of bytes");printf("You said:\n");
status = write(fd, buf, sizeof(buf)); /* 回放 */
if (status != sizeof(buf))
perror("wrote wrong number of bytes");/* 在继续录音前等待回放结束 */
status = ioctl(fd, SOUND_PCM_SYNC, 0);
if (status == -1)
perror("SOUND_PCM_SYNC ioctl failed");
}
}

一个对混音器进行编程的基本框架,利用它可以对各种混音通道的增益进行调节,其所有的功能都是通过读写/dev/mixer设备文件来完成的

/*
* mixer.c
*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/soundcard.h>/* 用来存储所有可用混音设备的名称 */
const char *sound_device_names[] = SOUND_DEVICE_NAMES;int fd; /* 混音设备所对应的文件描述符 */
int devmask, stereodevs; /* 混音器信息对应的位图掩码 */
char *name;/* 显示命令的使用方法及所有可用的混音设备 */
void usage()
{
int i;fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"
" %s <device> <gain%%>\n\n"
"Where <device> is one of:\n", name, name);
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i )
if ((1 << i) & devmask) /* 只显示有效的混音设备 */
fprintf(stderr, "%s ", sound_device_names[i]);
fprintf(stderr, "\n");
exit(1);
}int main(int argc, char *argv[])
{
int left, right, level; /* 增益设置 */
int status; /* 系统调用的返回值 */
int device; /* 选用的混音设备 */
char *dev; /* 混音设备的名称 */
int i;name = argv[0];/* 以只读方式打开混音设备 */
fd = open("/dev/mixer", O_RDONLY);
if (fd == -1) {
perror("unable to open /dev/mixer");
exit(1);
}/* 获得所需要的信息 */
status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
if (status == -1)
perror("SOUND_MIXER_READ_DEVMASK ioctl failed");
status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);
if (status == -1)
perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");/* 检查用户输入 */
if (argc != 3 && argc != 4)
usage();/* 保存用户输入的混音器名称 */
dev = argv[1];/* 确定即将用到的混音设备 */
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i )
if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))
break;
if (i == SOUND_MIXER_NRDEVICES) { /* 没有找到匹配项 */
fprintf(stderr, "%s is not a valid mixer device\n", dev);
usage();
}/* 查找到有效的混音设备 */
device = i;/* 获取增益值 */
if (argc == 4) {
/* 左、右声道均给定 */
left = atoi(argv[2]);
right = atoi(argv[3]);
} else {
/* 左、右声道设为相等 */
left = atoi(argv[2]);
right = atoi(argv[2]);
}/* 对非立体声设备给出警告信息 */
if ((left != right) && !((1 << i) & stereodevs)) {
fprintf(stderr, "warning: %s is not a stereo device\n", dev);
}/* 将两个声道的值合到同一变量中 */
level = (right << 8) left;/* 设置增益 */
status = ioctl(fd, MIXER_WRITE(device), &level);
if (status == -1) {
perror("MIXER_WRITE ioctl failed");
exit(1);
}/* 获得从驱动返回的左右声道的增益 */
left = level & 0xff;
right = (level & 0xff00) >> 8;/* 显示实际设置的增益 */
fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);/* 关闭混音设备 */
close(fd);
return 0;
}

一个测试通过的音频播放程序

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>#define LENGTH 3 /* 存储秒数 */
#define RATE 8000 /* 采样频率 */
#define SIZE 8 /* 量化位数 */
#define CHANNELS 1 /* 声道数目 *//* 用于保存数字音频数据的内存缓冲区 */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];int main()
{int fd;/* 声音设备的文件描述符 */
int id; /*声音输出文件描述符*/
int arg;/* 用于ioctl调用的参数 */
int status; /* 系统调用的返回值 */
int i;
int j;/* 打开声音设备 */
fd = open("/dev/dsp", O_RDWR);//arm下的音频文件是"/dev/sound/dsp";
if (fd < 0) {
perror("open of /dev/dsp failed");
exit(1);
}
/*打开输出文件*/
id=open("Music.wav",O_RDWR);
if(id < 0){
perror("open of sound file failed");
exit(1);
}
/* 设置采样时的量化位数 */
arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size");/* 设置采样时的声道数目 */
arg = CHANNELS;
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels");/* 设置采样时的采样频率 */
arg = RATE;
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
perror("SOUND_PCM_WRITE_WRITE ioctl failed");/* 读取一定数量的音频数据,并将之写到输出文件中去 */
for(i=0;i<10;i ){
j=read(id, buf, sizeof(buf));
if (j > 0){
write(fd, buf, j); /* 放音 */
}
}/* 关闭输入、输出文件 */
close(fd);
close(id);
return 1;
}

Linux 应用编程相关推荐

  1. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  2. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  3. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  4. linux高性能网络编程,Linux高性能网络编程的介绍

    Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...

  5. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)

    寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause   sleep/usleep atexit   on_exit i ...

  6. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  7. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  8. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  9. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  10. linux c一站式编程 pdf,《Linux·C编程一站式学习》·(宋劲杉)·文字版.pdf

    Linux C 编程一站式学习 宋劲杉 北京亚嵌教育研究中心 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心 Permission is granted to copy, distri ...

最新文章

  1. 基于Kubeflow建立的星辰算力训练平台背后的技术架构
  2. Angular CLI 全局 ng.cmd 文件内容分析
  3. 【TensorFlow-windows】投影变换
  4. duration java_Java Duration类| ofHours()方法与示例
  5. 7-5 抓老鼠啊~亏了还是赚了? (20 分)
  6. 年底一大波“优化”来了
  7. PostgreSQL在何处处理 sql查询之二十五
  8. Windows Phone 7 使用Perst数据库的Demo——流水账
  9. 图像质量评估(4) -- 色差(Chromatic Aberration)
  10. cmpp3.0 java 华为_CMPP3.0/2.0完成短信收发功能(引用华为smsproxy开发包)
  11. 由公式抽样检查所想到的...
  12. oracle中insert语句怎,Oracle中Insert语句的总结
  13. 2019新版《龙果学院JavaEE秒杀系统企业级实战应用教程》
  14. dbutils mysql_mysql dbutils
  15. tensorflow gpu环境安装
  16. 数据库设计各阶段任务
  17. Python如何从列表中删除空列表?代码示例
  18. c语言编程绘制空间螺旋线,在UG中绘制变螺距螺旋线的方法
  19. matlab 生成hasse图,Hasse图详解
  20. Python-matplotlib画图,柱状图,双柱图,折线图,散点图,饼图,线柱混合图。附代码模板与详细注释

热门文章

  1. Cookie的特点和作用|| 案例:记住上一次访问时间
  2. servlet——登录练习(登录页面登录请求登录请求处理)
  3. Python 图像处理篇-利用opencv库展示本地图片实例演示
  4. Python 技巧篇-如何避免python报错导致强制关闭窗口
  5. android studio导出apk步骤
  6. CTFshow php特性 web105
  7. Introduction to 3D Game Programming with DirectX 12一书学习记录(第一个例子编译错误)
  8. 关闭Visual Studio中的自动代码分析
  9. Numpy.tile() (Python)
  10. linux的内核是指的什么,[科普] Linux 的内核与 Linux 系统之间的关系