fl2440——fork()函数简单应用实例
来源:互联网 发布:淘宝上下架什么意思 编辑:程序博客网 时间:2024/06/07 06:00
今日诗词分享:
南宋▪辛弃疾 《鹧鸪天·晚日寒鸦一片愁》
晚日寒鸦一片愁,柳塘新绿却温柔。若教眼底无离恨,不信人间有白头。
肠已断,泪难收,相思重上小红楼。情知已被山遮断,频倚栏干不自由。
===============================================================================================================
开发平台:fl2440
===================================================================================================
进入正题,之前在播放器的应用程序中提到了fork()函数和wait()函数,写了个简单的应用程序。
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
- 在父进程中,fork返回新创建子进程的进程ID;
- 在子进程中,fork返回0;
- 如果出现错误,fork返回一个负值;
/********************************************************************************* * Copyright: (C) 2017 qicheng * All rights reserved. * * Filename: fork.c * Description: This file * * Version: 1.0.0(05/04/2017) * Author: yangni <497049229@qq.com> * ChangeLog: 1, Release initial version on "05/04/2017 03:04:56 PM" * ********************************************************************************/#include <stdio.h>#include<linux/input.h> //for input_event#include <sys/types.h> //for pid//for open()#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h> //for fork() and write() and execl()#include <sys/wait.h> //for wait()#include <errno.h> //for perror()int main(){ pid_t pid; int ret; int fd_beer; int fd_led[4]; int i,k,j; char buf[50]; struct input_event event; if ((fd_beer = open("/dev/event0", O_RDWR)) < 0) { //打开蜂鸣器设备 printf("beep test"); return 1; } for(i=1;i<=4;i++) { snprintf((char *)buf,sizeof(buf),"/sys/class/leds/led%d/brightness",i); fd_led[i] = open(buf, O_RDWR); if(fd_led[i]<0) { printf("can't open the file led%d",i); return -1; } } /*创建子进程*/ pid = fork(); if(pid > 0) {/*蜂鸣器部分*/ event.type = EV_SND; event.code = SND_TONE; event.value = 2000; //打开蜂鸣器 ret = write(fd_beer, &event, sizeof(struct input_event)); sleep(2); event.value = 0; //关闭蜂鸣器 ret = write(fd_beer, &event, sizeof(struct input_event));/*播放一首歌*/ if(pid==wait(NULL)) { execl("/mp3/madplay","madplay","/mp3/song/feihua.mp3","NULL"); } }/*led部分*/ else if(0 == pid) { for(k=0;k<2;k++) //循环两次 { for(i=1;i<=4;i++) { write(fd_led[i],"1",1); //循环点亮4个led灯 sleep(1); } for(j=1;j<=4;j++) { write(fd_led[j],"0",1); } } }close(fd_beer);for(i=1;i<=4;i++){close(fd_led[i]);} return 0;}起初,只有一个进程在运行。当执行到 pid = fork();时,立即创建了一个子进程,然后子进程拿到和父进程一样的资源(相当于克隆),然后各自做各自的事(同时进行)。pid > 0,父进程部分打开了蜂鸣器,此时子进程(pid==0)也循环打开led灯,两秒后父进程关闭蜂鸣器。父进程此时调用wait()来等待子进程结束,等到子进程完成for循环,则执行wait函数体内的命令(播放一首歌)。
0 0
- fl2440——fork()函数简单应用实例
- fl2440——Platform_Button实例
- linux进程编程(一)-- fork()函数简单应用
- fl2440——Platform-LED实例
- linux中fork()函数实例详解
- linux中fork()函数实例详解
- fork函数实例
- fork函数实例
- FL2440—基于platform 模型的DS18B20驱动实例
- FL2440—基于platform 模型的DS18B20驱动实例
- linux fork() 函数实例详解
- linux fork() 函数实例详解
- Linux——fork()函数
- FL2440下的fork实验
- Selenium1.0—简单实例应用
- QTP—简单的实例应用
- linux中fork()函数详解(原创!!实例讲解)
- linux中fork()函数详解(原创!!实例讲解)
- Python3.6中的简单抓取百度网页源代码
- tensorflow:NameError: name 'input_data' is not defined
- 解决Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly
- 界面简单开发
- android SlidingMenu侧滑的简单使用
- fl2440——fork()函数简单应用实例
- The Law of Leaky Abstractions
- 常用连接嵌入式设备的工具方法
- 2个createBitmap之PorterDuffXfermode
- QT的QMessageBox的使用
- 2017年ACM模板(常用)弱渣整理 五、数学相关
- Codeforces Round #363 (Div. 2) C. Vacations —— DP
- 四月是谁的谎言啊
- 如果