嵌入式开发完整体系课程(含项目) 扫二维码继续学习 二维码时效为半小时

(170评价)
价格: 598.00元

1、对于int main(void){}主函数书写方式

2、字符型常量和字符串常量

字符:'a','\0'

字符串:"a","hello world",一般处理为char型指针(数组->指针)。""空字符串占一个字节

整型数字int a; 32位第一位为符号位

long long int b; 8 bytes;

long int c; 4 bytes;

float d; 4 bytes(表示比整型范围大)

double f1; 8 bytes;

long double f2; 12 bytes;

[展开全文]
天亮了 · 3天前 · 0

ubuntu 12.04 、14.04.半年一更新

Linux的软件后缀    .bed    格式

sudo apt-get update 

 命令安装最新版的vim编辑器:

sudo apt-get install vim

 

关于APT

1.software center --> software sources -->Download from, 选择合适的服务站点

2.执行sudo apt-get update,下载远端服务器的软件列表

3.在联网的情况下, 

所有的软件安装包统一放置在这里:/var/cache/apt/archives

 

 

[展开全文]
高帅 · 14天前 · 0

 posix·

#include <stdlib.h>
#Include <stdio.h>
#include <string.h>
#Include <pthread.h>

void *routine(void *arg)
{
   pthread_detach(pthread_self());
   sleep(1);
   char *msg = "abcd";
   pthread_exit((void *)msg);
}

int main(void)
{
   pthread_attr_t attr;
   pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

   pthread_t tid;
   pthread_create(&tid,NULL,routine,NULL);

   void *ret;
   if((errno = pthread_join(tid,&err))==0)
   {
      printf("ret:%s\n",(char *)ret);
   }
   else 
   {
      perror("pthread_join() faild");
   }
   pthread_exit(NULL);
}

 

[展开全文]
117期黄帅文 · 16天前 · 0

posix线程

每一个线程有自己独特的状态(阻塞等),但资源时共享的

pthread_create

线程的id只有在当前进程中才有效

出了这个进程就无效。

 

 

 

 

 

 

 

 

[展开全文]
117期黄帅文 · 17天前 · 0

posix有名信号量->编译时需要链接-lpthraed线程库,使用在线程间的

操作步骤

sem_open->sem_wait(P操作)/sem_post(V操作)->sem_close->sem_unlink

信号量创建后就有一个空间分别存放数据和空间内存

#include "head.h"
void shutdown_sem(int sig)
{
   sem_close(data);
   sem_close(space);

   sem_unlink(DATA);
   sem_unlink(SPACE);
   exit(0);
} 

int main(int argc,char **argv)
{
   signal(SIGINT,shutdown_sem);  
 
   int shmid = shmget(ftok(".",1),SHMSIZE,IPC_CREAT|0666);
   char *addr = shmat(shmid,NULL,0);

   sem_t *data = sem_open("/data",O_CREAT,0666,0);
   sem_t *space = sem_open("/space",O_CREAT,0666,1);
  
   char *msg = "0123456789";
   int i = 0;

   while(1)
   {
     sem_wait(space);
     memcpy(addr,msg+i,1);
     i = (i+1)%10;
     sem_post(data);
   }
   return0;
}
#include "head.h"

void shutdown_sem(int sig)
{
   sem_close(data);
   sem_close(space);

   sem_unlink(DATA);
   sem_unlink(SPACE);
   exit(0);
} 


int main(int argc,char **argv)
{
   signal(SIGINT,shutdown_sem);    //把在信号接收到的时候删除掉信号量,为的时下一次再运行的时候还可以正常跑起来
   int shmid = shmget(ftok(".",1),SHMSIZE,IPC_CREAT|0666);
   char *addr = shmat(shmid,NULL,0);

   sem_t *data = sem_open("/data",O_CREAT,0666,0);
   sem_t *space = sem_open("/space",O_CREAT,0666,1);
  
   char *msg = "0123456789";
   int i = 0;

   while(1)
   {
     sem_wait(space);
     fprintf(stderr,"%c",*addr);
     sem_post(data);
   }
   return0;
}
---------------head.h--------------
#include <>

#define static sem_t *data
#define static sem_t *space

#define DATA "/data"
#define SPACE "/space"

#define SHMSIZE 2

 

[展开全文]
117期黄帅文 · 17天前 · 0

信号量操作

int main(int argc,char **argv)
{
   int shmid = shmget(ftok(".",1),SHMSIZE,IPC_CREAT|0666);  //在当前目录下获取第一个编号的共享内存
   char *addr = shmat(shmid,NULL,0);   //注册共享内存
 
   int semid = semget(ftok(".",2),2,IPC_CREAT|0666);   //注册信号量
   union semun a;
   a.val = 0;
   semctl(semid,0,SETVAL,a);   //对信号量第一个成员设置初始值
   a.val = 1;
   semctl(semid,1,SETVAL,a);

   char *msg = "0123456789";
   int i =0;
   while(1)
   {
      memcpy(addr,msg+i,1);
      i = (i+1)%10;
   }
   return 0;
}

 

[展开全文]
117期黄帅文 · 17天前 · 0

消息队列

struct msgbuf
{
   long msgtype;
   char msg[SIZE];
}


int main(int argc,char **argv)
{
   msgget(ftok(".",1),IPC_CREAT|0666);
   struct msgbuf;
   while(1)
   { 
     bzero(&msgbuf,sizeof(msgbuf));
     fgets(msgbuf.msg,SIZE,stdin);
     msgbuf.msgtype = JACK2ROSE;

     msgsnd(msgid,msg,0);
   }
   return 0;
}
#define JACK2ROSE 1  //定义消息类型

struct msgbuf
{
   long msgtype;
   char msgtext[SIZE];
}


int main(int argc,char **argv)
{
   msgget(ftok(".",1),IPC_CREAT|0666);  //创建消息队列
//
   struct msgbuf msg;
   while(1)
   { 
     bzero(&msg,sizeof(msg));
     //fgets(msg.msg,SIZE,stdin);
     //msg.msgtype = JACK2ROSE;
     msgrcv(msgid,&msg,SIZE,JACK2ROSE,0);

//     msgsnd(msgid,msg,0);
     printf("from jack: %s",msg.msgtext);
   }
   return 0;
}

 

[展开全文]
117期黄帅文 · 18天前 · 0

信号的生命周期?

信号发送

killall xxx :杀死xxx名的进程

#include <stdio.h>
#Include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
   pid_t p1;
   scanf("%d",&p1);   //p1是接受的进程号
   kill(p1,SIGINT);  //向p1进程发送SIGINT信号
//如果采用kill发送的信号不可以携带发送者的一些信息,使用sigqueue可以将发送者想要告知接收者的的信息发送出去
//其相应的接收者的处理信息函数就是采用void f(int sig,struct siginfifo....)的格式,而不是void f(int sig)
//(int sig 这个参数就是信号)。另外接收者相应的就不可以使用signal()这个函数去注册接收了,而是sigaction()
   return 0;
}
#include <stdio.h>
#Include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

void f(int sig)
{

}

int main(int argc,char **argv)
{
   pid_t p1;
   char i;
   //scanf("%d",&p1);   //p1是接受的进程号
   //kill(p1,SIGINT);  //向p1进程发送SIGINT信号
   signal(SIGINT,SIG_IGN);   //SIG_IGN忽略接收到的SIGINT信号
//   signal(SIGINT,f);   //接收到中断信号SIGINT,请内核帮忙自动执行f函数,记住f函数不是这个进程调用的,是内核调用
   sigset_t set;
   sigemptyset(&set);  //清空信号集
   sigaddset($set,SIGINT);  //往信号集添加感兴趣的信号
   sigaddset(&set,SIGHUP);
   sigprocmask(SIG_BLOCK,&set,NULL);   //将这些信号阻塞掉  //man 2 xxx查函数使用方式

   while(i<9)
   {
     i++;
     sleep(1);
   }
   sigprocmask(SIG_UNBLOCK,&set,NULL);   //解除信号阻塞,此时之前接收到的SIGINT这些信号就开始执行
   pause();   //暂停,直到信号到来
   return 0;
}
#include <stdio.h>
#Include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

//信号携带信息的用法
void f(int sig,siginfo_t *info,void arg)
{
   printf("catch sig :%d\n",sig);
   printf("extre info: %d\n",info->si)
}

int main(int argc,char **argv)
{
   pid_t p1;
   
   struct sigaction act;
   bzero(&act, sizeof(act));
   act.sa_sigaction = f;
   act.sa_flags = SA_SIGINFO;   //这个位设置位SA_SIGINFO,的时候,才会把act.sa_sigaction替换掉act.handle函 
   //数,函数才可以使用void f(int sig,siginfo_t *info,void arg)这种格式。
   sigaction(SIGINT,&act,NULL);
   pause();   //暂停,直到信号到来
   return 0;
}
#include <stdio.h>
#Include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

//信号携带信息的用法
void f(int sig,siginfo_t *info,void arg)
{
   printf("catch sig :%d\n",sig);
   printf("extre info: %d\n",info->si)
}

int main(int argc,char **argv)
{
   pid_t p1;
   
   scanf("%d",&p1);
   union sigval a;
   bzero(&a,sizeof(a));
   a.sival_int = 100;
   sigqueue(p1,SIGINT,a);   //携带参数的发送信号,需要上述的结构体
   return 0;
}

 

[展开全文]
117期黄帅文 · 18天前 · 0

kill -l  可以查看系统的所有信号

非实时信号:可以相互嵌套,没有优先级之分,当一个信号在处理时,再来一个相同的时候时,会被忽略掉

34及之后的是实时信号按次序接收,不嵌套,是可靠信号,一个信号发多少次就响应多少次

利用kill()可以产生任何信号

SIGKILL信号,SIGSTOP无法忽略

task_struct 进程结构体

线程被系统调度的时候才开始执行相应存在share_pending的信号

 

 

[展开全文]
117期黄帅文 · 18天前 · 0

有名管道创建后是存放在磁盘普通文件中,不会消灭

无名管道存放在内存中,会释放

#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

#define FIFONAME "myfifo"
#define SIZE 100

int main(int argc,char ** argv)
{
    if(access(FIFONAME,F_OK))   //判断文件是否存在
    {
       mkfifo(FIFONAME,0777);  //创建有名管道
    }
    int fd = open(FIFONAME,O_RDWR);
    char buf[SIZE];
    while(1)
    {
      bzero(buf ,SIZE);   //清空
      fgets(buf,SIZE,stdin);   //读取控制台的输入内容

      write(fd,buf strlen(buf));
    }
    close(fd);
    return 0;
}
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

#define FIFONAME "myfifo"
#define SIZE 100

int main(int argc,char ** argv)
{
    if(access(FIFONAME,F_OK))   //判断文件是否存在
    {
       mkfifo(FIFONAME,0777);  //创建有名管道
    }
    int fd = open(FIFONAME,O_RDONLY);
    char buf[SIZE];
    while(1)
    {
      bzero(buf ,SIZE);   //清空
    //  fgets(buf,SIZE,stdin);   //读取控制台的输入内容
      read(fd,buf,SIZE)
      //write(fd,buf strlen(buf));
      printf("from xxx %s",buf)
    }
    close(fd);
    return 0;
}

有名管道有写入原子性,也就是多个客户端或多个进程往服务器创建的有名管道写数据的时候不会乱

[展开全文]
117期黄帅文 · 18天前 · 0

fork(void )函数   创建一个新的进程

 

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

atexit( )

 

 

_exit      和exit  区别

[展开全文]
高帅 · 22天前 · 0

fork( )函数

时间片    sched( )

就绪态 -----》》》》执行-----》》》》

 

 

 

wait(   )/waitpid( )

1.父进程回收释放子进程

2.获得子进程退回状态

3.同步父子进程

 

[展开全文]
高帅 · 22天前 · 0

int (*p) (cahr a)

函数指针

 

 

 

任何指针都是4字节

 

 

 

 

[展开全文]
HGhuang · 08-08 · 0

#include“stdio.h”

#include"string.h"

 

 

 

 

 

 

strcpy(a,b)  b覆盖a

strncpy(a,b,sizeof(a)-1  ;

 

 

 

strcat(a,b);

strncat(a,b,sizeof(a)-strlen(a));

 

 

strcmp比较字符串内容

 

strtok();分割字符串

delim分割符

 

 

 

 

 

 

 

 

 

 

 

 

 

[展开全文]
李经鸿 · 07-30 · 0

函数的调用

局部变量

形参与实参

实参 调用者定义的参数

形参 被调函数的参数

 

实参形参是相对独立的

 

[展开全文]
李经鸿 · 07-30 · 0

函数基本语法

程序封装

函数的实现

int max(int a,int b)      函数头(函数接口)(函数的特征标)

{

         int m;

          m=a>b?a:b;

          return m;

}

 

int max(int a,int b);声明函数

 

 

 

 

 

[展开全文]
李经鸿 · 07-30 · 0

控制流

switch多路分支

break 跳出结构

continue 结束本次循环

 

 

 

goto语句

用于出错处理

一种无条件跳转

 

 

 

[展开全文]
李经鸿 · 07-30 · 0

运算符

a^b  异或

 

[展开全文]
李经鸿 · 07-30 · 0