Linux下写一个c程序,创建一个子进程,利用execl系统调用,若成功则去执行ls-l命令。

Linux下写一个c程序,创建一个子进程,利用execl系统调用,若成功则去执行ls-l命令。,第1张

#include <stdio.h>

#include <unistd.h>

int main()

{

int pid

pid = fork()

if (pid <0)

{

printf("Failed to fork!\裤激埋铅腊n"胡蚂)

return 1

}

if (pid >0)

{

wait(NULL)

}

else

{

execlp("/bin/ls", "/bin/ls", "-l", NULL)

}

return 0

}

ls 指令是Linux下最常用的指令之一。

ls 命令将每个由 Directory 参数指定的目录或者每个由 File 参数指定的名称写到标准输出,以及您所要求的和标志一起的其它信息。

如果不指定 File 或 Directory 参数, ls 命令显示当前目录的内容。

基本介绍中文名 :ls 类属 :指令 所属领域 :计算机 套用范围 :linux 指令释义,描述,许可权表示,标志,注意事项, 指令释义 ls 指令可以说是Linux下最常用的指令之一。它有许多的选项,下面列出了 ls 指令塌知的绝大多数选项。 List information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is specified. 用法:ls [选项]... [档案]... 运用举例:

1.列出具体档案 #ls -al 这个最常用,可是往往又不彻底符合要求,

2.列出一切子目录的档案:#ls -R 上个指令仅仅列出了本目录下的一切目录和档案,可是目录下的档案不会循环的列出。

3.若是档案过多一屏看不完,怎么办?并且,关于想找到许多档案中的某个档案的姓名。

3.1分屏显现:#ls -l|more 能在当时屏退出,很有用,但不能一页一页翻屏

#ls -l|less 能用pgup,pgdw 翻页,但不能在当时方位退出

3.2横向输出尽可能多的显现档案姓名: #ls -m

-a 列出目录下的一切档案,包含以 . 最初的隐含档案。常用  

-m 横向输出档案名称,并以“,”作分格符。

-c 输出档案的 i 节点的修正时刻,并以此排序。

-R 列出一切子目录下的档案。

-l 列出档案的具体信息。

-s 在每个档案名称后输出该档案的巨细。

-k 以 k 位元组的方式表明档案的巨细。

-i 输出档案的 i 节点的索引信息。

2.只显现目录:#ls -l |grep ^d 3.只显现非目录档案:#ls -l |grep ^[^d]

3.对输出档案进行各种排序;

3.1 依照字元序(default): #ls -l

3.2 依照修正时刻排序: #ls -t 近来修正在最上面

3.3 逆排序 : #ls -r

3.4 按档案巨细排序 :#ls -S 大档案的在上

3.5 依照档案扩展名(最终一个.后的字元)排序: #ls -X

3.6 按数字排序 :#ls -lv

-t 以时刻排序。

-r 对目录反向排序

-f -U 对输出的团顷消档案不排序。

-X 以档案的扩展名(最终一个 . 后的字元)排序。

-S 以档案巨细排序。

-u 以档案前次被拜访的时刻排序。 

-n 用数字的 UID,GID 替代称号。

-o 显现档案的除组信息外的具体信息。

-p -F 在每个档案名称后附上一个字元以阐明该档案的类型,“*”表明可执行的一般

档案;“/”表明目录;“@”表明符号连线;“|”表明FIFOs;“=”表明套接字(sockets)。

-q 用?替代不行输出的字元。 

-x 按列输出,横向排序。

暂时无用选项:

-b 把档案名称中不可输出的字元用反斜杠加字元编号(就象在C言语里相同)的方式列出。不常用

-d 将目录象档案相同显现,而不是显现其下的档案。

-e 输出时刻的悉数信息,而不是输出简略信息。 没用

-g 无用。

-A 显现除 “.”和“..”外的一切档案。

-B 不输出以 “~”结束的备份档案。

-C 按列输出,纵向排序。

-G 输出档案的组的信息。

-L 列出连线档案名称而不是连线到的档案。

-N 不约束档案长度。

-Q 把输出的档案名称用双引号括起来。 

-1 一行只输出一个档案。

--color=no 不显现五颜六色档案名称

--help 在规范输出上显现协助信息。

--version 在规范输出乎凯上输出版别信息并退出 描述 ls 命令将每个由 Directory 参数指定的目录或者每个由 File 参数指定的名称写到标准输出,以及您所要求的和标志一起的其它信息。如果不指定 File 或 Directory 参数, ls 命令显示当前目录的内容。 在互斥对中指定多个选项不看成错误。每对中最后一个指定的选项确定输出格式。 预设情况下,ls 命令按照档案名称的字母顺序显示所有信息。整理顺序由环境变数 LANG 或 LC_COLLATE 环境变数确定。在 AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的 "National Language Support Overview for Programming" 包含更多细节。 当 ls 命令显示目录内容时,它不显示名称以 .(点)开头的档案项,除非使用了 -a 或者 -A 标志。如果命令由 root 用户执行,它预设使用 -A 标志。 格式化输出有三种主要方式: * 每行列出一项。 * 通过指定 -C 或 -x 标志以多列列出各项。当向 tty 输出时,-C 标志是预设格式。如果档案或目录名太长,ls 命令显示单列输出。 * 通过指定 -m 标志可以以逗号分隔系列列出项。 要确定输出行中字元位置的数目,ls 命令使用环境变数 COLUMNS。如果没有设定此变数,命令获取显示的当前列值。如果使用这些方法,ls 命令还不能确定字元位置的数量,它就使用预设值 80。 使用 -e 和 -l 标志所显示的方式解释如下: 如果第一个字元是: d 此项为目录。 b 此项为块特殊档案。 c 此项为字元特殊档案。 l 此项为符号连结,或者指定 -N 标志,或者符号连结不指向现有档案。 p 此项为一个先进先出(FIFO)特殊档案。 s 此项为本地套接字。 - 此项为普通档案。 接下来的 9 个字元被分成 3 个集合,每个集合 3 个字元。第一组 3 字元集合显示所有者许可权。下一组 3 字元集合显示了组中其它用户的许可权。最后 3 字元集合显示了访问此档案的其它任何人的许可权。每个集合中的三个字元各自表示了档案的读、写和执行许可权。目录的执行许可权让您可以搜寻目录中的指定档案。 许可权表示 如下: r 读 w 写(编辑) x 执行(搜寻) - 没有授予相应的许可权 如果档案有 set-group-ID 方式,那么组执行许可权字元是 s。如果档案有 set-user-ID 方式,则用户执行许可权字元是 s。如果方式位被设定为 01000(八进制)(请参阅 chmod 命令以获得此方式的含义),最后一个方式字元(通常 x 或者 -)是 T。如果没有设定相应的执行许可权,set-ID 的指示和方式位 01000 以大写字母开头(分别为 S 和 T)。方式 t 表示粘滞位是为档案或目录而设定的。 当使用 -e 标志时,其显示方式与使用 -l 标志一样,除了多出了第 11 个字元,其解释如下: + 表示档案有扩展安全性信息。例如,档案可能在方式中有扩展的 ACL、TCB 或者 TP 属性。 通过使用 aclget 命令,可以显示档案的访问控制信息(ACL)。通过使用 chtcb 命令,可以显示 TCB 和 TP 属性的值。 - 表示档案没有扩展安全性信息。 当列出目录中档案大小时,ls 命令显示块总数,包括间接块。 标志 -A 列出所有条目,除了 .(点)和 ..(点-点)。 -a 列出目录中所有项,包括以 .(点)开始的项。 -b 以八进制 ( \nnn) 表示法显示非列印字元。 -c 使用索引节点最近一次修改的时间,用以排序(当带 -t 标志使用时)或者用以显示(当带 -l 标志使用时)。该标志必须和 -t 或 -l 标志或者两者一起使用。 -C 以多列纵向排序输出。当往终端输出时,此为预设方法。 -d 仅仅显示指定目录信息。目录和档案一样处理,这在当使用 -l 标志获取目录状态时非常有用。 -e 显示方式(包括安全信息)、连结数目、所有者、组、大小(按位元组)、最近修改时间和每个档案名称称。如果档案是特殊档案,大小栏位包含主要和次要设备数目。如果档案是符号连结,会列印所连结到的档案的路径名,其前有 ->(减号,大于号)符号。显示符号连结的属性。 -E 列出档案的保留空间、固定范围大小和范围分配标志信息。使用该标志时,必须指定 -l 标志。 -f 在每个存储槽中列出 Directory 参数指定的每个目录的名称。该标志关闭 -l、-t、 -s 和 -r 标志并且开启 -a 标志。列表的顺序就是项出现在目录中的顺序。 -F 如果档案是目录,在档案名称后面放置一个 /(斜杠),如果档案可执行,则放置一个 *(星号),如果档案为套接字,则放置一个 =(等号),如果为 FIFO,则放置一个 |(管道)符号,如果是符号连结,则放置一个 @。 注:只有在使用 -N 标志或者连结指向一个不存在的档案时,符号连结显示时才后跟 ->。否则,显示目标档案的有关信息。通过输入 ls -f 命令,也可以调用此选项。 -g 与使用 -l 标志时显示同样的信息,除了 -g 标志禁止显示所有者和符号连结信息。 -H 如果在命令行上指定了引用类型目录档案的符号连结,ls 命令将档案信息和档案类型估计为由连结引用的档案的信息和类型,而非连结本身;然而,ls 命令将写连结本身的名称,而非由连结引用的档案。 -i 显示每个档案报告第一列中的索引节点数目。 -L 列出连结引用的档案或目录内容。此为预设 *** 作。后跟符号连结。如果使用 -l 选项,-N 选项就成为预设值,不后跟符号连结。当使用 -l 选项时,仅有 -L 选项能够覆盖 -N 预设值。 -l (L 的小写)显示方式、连结数目、所有者、组、大小(按位元组)和每个档案最近一次修改时间。如果档案是特殊档案,大小栏位包含主要和次要设备数目。如果最近一次修改时间大于六个月之前,时间栏位以 月份 日期 年份 的格式显示,然而六个月内修改的档案以 月份 日期 时间 的格式显示。 如果档案是符号连结,,列印所连结到的档案的路径名,其前跟 ->。显示符号连结的属性。-n、-g、和 -o 标志覆盖 -l 标志。 注意事项 1. 符号连结档案后跟一个箭头,然后是符号连结的内容。 2. 当使用 -l 选项时,通过执行 mkpasswd 命令,可以提高 ls 命令的执行性能。当目录包含不同用户拥有的档案时,这非常有用,比如 /tmp 目录。 -m 使用流输出格式(逗号分隔系列)。 -n -n 标志除显示用户和组 ID 而不是用户和组名称以外,它显示和 -l 标志同样的信息。 -N 当确定档案状态时,不跟在符号连结之后。 注:如果使用 -L 和 -N 两个标志,最后一个标志起作用。同样的,任何时候给定一个包含以 /(斜杠)作为最后字元的符号连结,不管使用何种选项,后面都会跟有连结。 -o -o 标志除禁止显示组和符号连结信息之外,它显示和 -l 标志同样的信息。 -p 如果档案是目录,在每个档案名称后面放置一个斜杠。当将 ls 命令的输出通过管道传递到 pr 命令时,这很有用,如下所示: ls -p | pr -5 -t -w80 -q 将档案名称中的非列印字元显示成 ?(问号)。 -r 反转排序顺序,适当的按字母逆向排序或者首先排序最旧的档案。 -R 递归列出所有子目录。 -s 按照千位元组(包括间接块)给出每一项的大小。 -t 按照最近一次修改时间(最近的最先)而不是名称排序。 -u 使用最近访问时间,而不是最近修改时间用以排序(当使用 -t 标志)或者显示(当使用 -l 标志)。如果不和 -t 或 -l 标志或两者一起使用,则该标志无效。 -x 以多列格式横向排序输出。 -1 强制输出为每行一项格式。当输出没有定向到终端时,此为预设值。 退出状态 此命令返回以下退出值: 0 写所有档案成功。 >0 产生错误。 示例 1. 要列出当前目录中的所有档案,请输入: ls -a 列出所有档案,包括 .(点)、..(点点)和其他以点开头的档案。 2. 要显示详细信息,请输入: ls -l chap1 .profile 显示一个长列表,包括关于 chap1 和 .profile 的详细信息。 3. 要显示有关目录的详细信息,请输入: ls -d -l . manual manual/chap1 显示目录 . 和 manual 以及档案 manual/chap1 的长列表。不使用 -d 标志时,会列出 . 和 manual 目录中的所有档案,而不是关于目录本身的详细信息。 4. 要按照修改时间列出档案,请输入: ls -l -t 显示最近被修改档案的长列表,较旧的档案跟在后面。 档案 /usr/bin/ls 包含 ls 命令。 /etc/passwd 包含用户 ID。 /etc/group 包含组 ID。 /usr/share/lib/terminfo/* 包含终端信息。

四路原理很薯虚简单,这在电子技术相关书籍上都有的介绍。我也懒得去翻书了,帮你找到点资料,参考一下:

也许加上你自己的想法可以得到一些改进。

http://www.jusi.cc/Sjjc/ShowArticle.asp?ArticleID=77

实战四《简易四路抢答器》

该抢答器供不多于4个参赛队或者个人的抢答比赛场合使用。每个参赛队的座位前

安装1只抢答按钮开关(用板上的S9、S10、S11、S12)和一个信号灯(D4、D5、D6、D7)斗仔。

主持人座位前装一只复原开关(板上S3)、1只蜂鸣器(板上BUZ1)和一个抢答器工作状态

指示灯(D10),每当主持人口头发出号令之后.哪个队先按下座位上的按钮开关,该座位的信

号灯就先被点亮,同时封锁其他按钮开关的活动.并且熄灭主持人座位上的状态指示灯和发出

三声类似于电话振铃的提示声,以声明此次抢答动作已经完成.在主持人确认后,按下复原按钮

,状态指示灯重新点亮,并且同时发出"笛-笛-"声,为下一次抢答作好准备.

PIC单片机学习网 陈学乾 http://www.pic16.com

程序文件名:"MCD-INTBUZ.ASM"

*********************************************************************

程序清单

*********************************************************************

tmr0 equ1h定义定时器/计数器0寄存器地址

status equ3h定义状态寄存器地址

option_reg equ 81h定义选项寄存器地址

option_temp equ 0a6h (在BACK1)定义选项寄存器的备份寄存器的地址

intcon equ 0bh定义中断控制寄存器地址

portcequ 7h 定义端口RC的数据寄存器地址

triscequ 87h定义端口RC的方向控制寄存器地址

portbequ 06h定义端口RB的数据寄存器地址

trisbequ 86h定义端口RB的方向控制寄存器地址

cequ 0 定义进位标志位的位地址

zequ 2 定义0标志位的位地址

wequ 0 定义传送目标寄存器为W的指示位

fequ 1 定义传送目标寄存器为RAM的指示位

t0if equ 2 定义TMR0中断标志位的位地址

t0ie equ 5 定义TMR0中断使能位的位地址

inte equ 4 定义外部中断使能位的位地址

intf equ 1 定义外部中断标志位的位地址

countequ 20h定义一个计数器变量

count1 equ 24h定义一个计数器变量

count2 equ 25h定义一个计数器变量

count3 equ 27h定义一个计数器变量

count4 equ 28h定义一个计数器变量

portb_b equ 21h为PORTC定义一个备份寄存器

w_temp equ 7fh为W在体0和体1定义2个备份寄存器

w_temp equ 0ffh (若是16F873/4,则需保留FFH单元)

status_temp equ 23h为STATUS定义一空手汪个备份寄存器

rp0 equ 5h 定义状态寄存器中的页选位RP0

******************复位向量和中断向量***********************

org 000h

nop 设置一条ICD必须的空 *** 作指令

goto main

org 0004h

goto serv跳转到中断服务子程序

*******************主程序************************************

main

bsf status,rp0

movlw 0

movwf trisc 设置RC口全部为输出

movlw 0ffh

movwf trisb 设置RB口全部为输入

movlw 02h设置选项寄存器:上拉电阻启用;INT下降沿触发

movwf option_reg 分频器给TMR0;分频比1:8

bcf status,rp0

movlw 90h

movwf intcon 开发INT中断

clrf portc RC口灯全灭

loop

movf portb,w 读取RB口数据

iorlw b'11100001' 送RB口的数到备份寄存器并将除S9、S10、S11、S12以外的位全部送1

movwf portb_b

xorlw 0ffh 没有键按下转LOOP继续检测

btfsc status,z

goto loop

call delay10ms 防抖动廷时

movf portb,w

iorlw b'11100001'

xorwf portb_b,0再次读取RB口的数据,与前一次读的数相同则键值有效

btfsc status,z

goto loop

comf portb_b,w 取反以便使被按下按键的位为1,其它位为0

movwf portc送RC口显示

call tone3t调用发声三次子程序

loop1

comf portb,w 检测按键是否有松开

andlw b'00011110'

btfsc status,z

goto loop 松开了返回

goto loop1 没松开继续检测

*********************中断服务子程序*****************************

serv

********************保存护现场部分*******************************

movwf w_temp保护W

swapf status,w 保护STATUS

clrf status 选择体0

movwf status_temp 将STATUS存入体0的备份寄存器

********************* 调查中断源**********************************

btfsc intcon,intf检查不是INT中断,返回

goto intserv 是!转到INT中断处理部分

goto retfie0

*********************INT中断处理部分******************************

intserv

clrf portc 令全部灯熄灭

bsf portc,7 点亮D10,表示就绪

call tone630 调用高音子程序

call delay 调用1S廷时子程序

call tone630 调用低音子程序

bcf intcon,intf 清除INT中断标志位

*************************恢复现场部分*****************************

retfie0

swapf status_temp,w 恢复STATUS

movwf status

swapf w_temp,f恢复W

swapf w_temp,w

retfie中断返加

*************************低音调发生子程序(500HZ/50MS)*************

tone500

movlw .50 循环次数寄存器赋初值

movwf count 50=500HZx0.05Sx2

t5lop

bcf intcon,t0if 清除TRM0溢出中断标志位

movlw .131给TMR0装入初值256-125=131

movwf tmr0启动定时器

t5here

btfss intcon,t0if 定时器溢出否

goto t5here 否!循环栓测

movlw b'01000000' 只将BIT6置位

xorwf portc,f 只将RC6(BUZ)脚电平反转,其余不变

decfsz count,f循环次数递减,为0,跳一步

goto t5lop不为0,跳回

return返回

**************************高音调发生子程序(630HZ/50MS)*****************

tone630

movlw .63循环次数寄存器赋初值

movwf count1 63=630HZx0.05Sx2

t6lop

bcf intcon,t0if 清除TRM0溢出中断标志位

movlw .157 给TMR0装入初值157=256-99

movwf tmr0 启动定时器

t6here

btfss intcon,t0if 定时器溢出否

goto t6here 否!循环栓测

movlw b'01000000' 只将BIT6置位

xorwf portc,f 只将RC6(BUZ)脚电平反转,其余不变

decfsz count1,f 循环次数递减,为0,跳一步

goto t6lop不为0,跳回

return返回

*********************发声1S子程序(1S=10x(50ms+50ms)***********

tonels

movlw .10 循环次数寄存器赋初值

movwf count2

t1lop

call tone500 调用低音子程序

call tone630 调用高音子程序

decfsz count2,f循环次数递减,为0,跳一步

goto t1lop不为0,跳回

return返回

*********************TMR0廷时子程序1S(1S=16x256x(256-12)US)********

delay

bsf status,rp0设置文件寄存器体1

movf option_reg,w 保护选项寄存器内容

movwf option_temp

movlw 07h 重设选项寄存器;上拉电阻启用,INT下降沿触发

movwf option_reg 分频器给TRM0;分频比值设为1:256

bcf status,rp0恢复到文件寄存器体0

movlw .16 循环利用TMROP定时16次

movwf count3 溢出次数寄存器

d1lop

bcf intcon,t0if清除TMR0溢出中断标志位

bcf intcon,t0ie清除TMR0溢出中断使能位

movlw .12 给TMR0装入初值12=256-244

movwf tmr0 启动定时器

here

btfss intcon,t0if 用查询法检测TMR0溢出否

goto here 否!返回

decfsz count3,f是!溢出次数减1,为0,跳一步

goto d1lop 否!循环利用TMR0

bsf status,rp0 设置文件寄存器体1

movf option_temp,w 恢复选项寄存器内容

movwf option_reg

bcf status,rp0 恢复到文件寄存器体0

return 返回

*************************断续发声3次报警子程序***********************

tone3t

movlw .3 循环次数寄存器赋初值

movwf count4

t3lop

call tonels调用发声1S子程序

call delay 调用廷时1S子程序

decfsz count4,f循环次数递减,为0,跳一步

goto t3lop 不为0,跳回

return 返回

**************************软件廷时10MS子程序****************************

delay10ms

movlw .13 将外层循环参数值送到30H

movwf 30h

lp0

movlw 0ffh 将内层循环参数值送到31H

movwf 31h

lp1

decfsz 31h,1 变量31H内容递减,若为0则跳跃

goto lp1 跳转到LP1

decfsz 30h,1 变量30H内容递减,若为0则跳跃

goto lp0 跳转到LP0

return 返回主程序

end源程序结束

***************************************************

进入该实战演练的工序流程如下:

1.创建源文件和编辑源文件在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”

这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的

分号””必须用西文半角输入二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.

2.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB

并进入MPLAB的桌面.

3.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将

用记事本创建的源文件加入到该项目中.

4.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目

文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).

5.ICD参数设置:通过菜单命令Project>Edit Project或者Option>Development Mode,将开发模式设置为

”MPLAB ICD Debugger”,点击OK按钮,打开ICD的工作窗口,在调试阶段,可以按照说明书图2-10设置各项,但需注意

OSCILLATOR应设置为XT方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目

标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用ICD方式调试。

6.电路设置:将演示板的S1全部拔到ON,S4全部拔到OFF,S13的第1、第5拔到ON,第6、第7拔到OFF ,LCD不要插在演示板上,

以使端口C只与8只发光二极管接通将用于选择频率的插针跳线插到”XT OSC”位置上,板上93CXX、24CXX应拿下。

7.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,

并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X单片机的FLASH程序存储器的擦写

周期是有限的,大约为1000次,应尽量节省它的使用寿命。

8.运行和调试用户程序和用户电路:在各项参数设置好后,将ICD的工作窗口最小化,利用前面讲的”运行及调试”中介

绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在CALL DELAY指

令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模

仿单片机端口引脚的片内或片外故障.

9.定型烧写目标单片机经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行

定型烧写,即将ICD窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.

10.独立运行验收:上一步中的烧写过程完成后,即可将ICD模块和ICD仿真头(或演示板)之间的6芯电缆断开,让单片机在

演示板独立运行,观察实际效果.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12305429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存