㈠ C语言中p和p2函数的不同和使用
p返回的新文件描述符一定是当前可以用描述符中的最小值。下面先打开一个文件来看下文件描述符,为保证测试成功,创建一个测试文件log.txt。
1
2
3
4
5
6
7
8
9
10
11
12
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd;
fd = open("./log.txt", O_RDWR);
printf("%d\n", fd);
return 0;
}
上面的代码用读写打开了log.txt这个文件,编译上面的代码然后执行,执行成功的话,应当是输出3,因为0,1,2分别被标准输入,标准输出,标准错误输出占用了。使用p复制这个文件描述符,并尝试移动fd偏移量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd, fd;
fd = open("./log.txt", O_RDWR);
//复制fd
fd = p(fd);
//输出fd,应当为4
printf("%d\n", fd);
//打印出fd和fd的偏移量,都为0
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
//将fd的偏移量+3
lseek(fd, 3, SEEK_SET);
//打印出fd和fd的偏移量,都为3
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
return 0;
}
编译执行上例代码可以发现当移动fd的偏移量时,fd的偏移量也发生了变化。往文件里写入内容试试,先把log.txt内容清空。
㈡ c语言的 p函数
你可以这样做,但是没有必要。
因为 fd是指向你的打开的文件表项(每个打开的文件都有这么一表项),存在多个fd指向一个表项的情况(如你调用p2,p,fcntl),系统采用引用计数的方法,如你有两个fd指向一个文件表现,则计数为2,这样你每次调用close,引用计数减1,减到0是,销毁文件表项以及文件的vnode(inode结构)。即便你不手动关闭文件,进程结束时,系统会自动关闭你打开的文件,所以,试情况而定。有时你可以不必自己close文件。
㈢ 8086汇编中DUP用法
db 21 p('year',0,'summ',0,'ne',0,?,?,0)中间加上逗号就可以了英文状态下输入的才可以
㈣ 汇编语言 数据伪指令 DUP用法
10 p(1)重复定义了10个字符素,初始值为1,占用10*2=20个字节。
5 p(?)重复定义了5个字符素(其初始值实际为0),占用5*2=10个字节
因此总共占用30个字节。
具体分析:在汇编定义变量的时候会用到p,变量名 、类型 、初值表,Dup用于把一个相同值赋值若干次,重复次数 p(数据项),具体比如s db 30 p(0),定义一个字节型变量,该变量占用30个字节,所有字节被初始化成0,equ是一个代码替换指令。
(4)编程方法p函数的使用扩展阅读
在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
比如:用“ADD”代表数字逻辑上的加减,“ MOV”代表数据传递等等,通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的bug修复以及运营维护都变得更加简单方便。
㈤ p2函数的问题
标准输入输出都被p2重定向了(到管道里了),printf不会有输出。
不过你如果单步的话,应该可以看到rc里有值。
㈥ linux下C语言编程,管道,p,fork,疑问的是,为什么连用那么多close必须要close 代码如下
文件描述符0,1,2分别表示标准输入标准输出,标准错误输出, 所以在子进程里close(1)是关闭了标准输出, 然后用p(fda[1]);此时未用的最小文件描述符就是1(被关闭);这里关闭fda[0]就是为了说明在子进程是管道的写端(fda[0],不关闭是可以的为了保险起见关闭).然后子进程退出会调用系统程序ls,于是当前的文件目录就被发送到管道中.父进程同理, 就是将标准输出作为管道的读端,它读到的是子进程ls后的内容,对文件计数,
㈦ p函数干什么用的呢是复制一个文件描述符吗
其实就是这样:
p()或者p2()主要是将某个特定的文件描述字输出输出的重定向!
他们保证将复制的文件描述字到当前未打开的最小描述字!事例代码int fd;if(argc!=2){err_quit("Usage :filename");}if((fd=creat(argv[1],0644))
㈧ unix pipe() 和p2()的使用方法和原理
pipe(),父子进程之间通讯工具。pipe有读写两端,用int表示。0-read, 1-write.一端进程将数据写入write内,另一进程由read段读出。使用参数为一个int数组,共两个元素,用以表示读写两端的状态。
close(),用于关闭清空pipe某端,参数为表示pipe端口数组二元素之一。
p2(),用于redirection, 将pipe某端与标准i/o相连,即将standout information 写入或者pipe内容被standin独出。如p2(data[1], STDOUT_FINENO).是进程与外界相连的一个工具。
㈨ p()是什么意思
DUP表示数据重复定义,也就是复制操作数。?表示所定义的变量未指定初值,就是说定义的单元不存新数据。(而是为以后使用做准备,即保留这些单元)
(9)编程方法p函数的使用扩展阅读:
1、DUP函数功能:数据定义伪指令,它可以按照给定的次数来复制某个(某些)操作数,可以避免多次键入同样一个数据。也就是定义重复的字节、字、双字、结构等内存缓冲区。
2、DUP函数返回值:
成功:p函数返回当前系统可用的最小整数值。
失败:均返回-1,并设置errno。
注意:通过p和p2创建的文件描述符并不继承原文件描述符的属性。比如close-on-exec和non-blocking。
3、举例:
buf1 db 100 p(?)---------开辟100个字节的内存区
buf2 dw 200 p(?)--------开辟200个字的内存区
buf3 dd 300 p(?)--------开辟300个双字的内存区
㈩ VLOODUP函数操作
函数名称:VLOOKUP
主要功能:在数据表的首列查找指定的数值,并由此返回数据表当前行中指定列处的数值。
使用格式:VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
参数说明:Lookup_value代表需要查找的数值;Table_array代表需要在其中查找数据的单元格区域;Col_index_num为在table_array区域中待返回的匹配值的列序号(当Col_index_num为2时,返回table_array第2列中的数值,为3时,返回第3列的值……);Range_lookup为一逻辑值,如果为TRUE或省略,则返回近似匹配值,也就是说,如果找不到精确匹配值,则返回小于lookup_value的最大数值;如果为FALSE,则返回精确匹配值,如果找不到,则返回错误值#N/A。
应用举例:参见图7,我们在D65单元格中输入公式:=VLOOKUP(B65,B2:D63,3,FALSE),确认后,只要在B65单元格中输入一个学生的姓名(如丁48),D65单元格中即刻显示出该学生的语言成绩。
特别提醒:Lookup_value参见必须在Table_array区域的首列中;如果忽略Range_lookup参数,则Table_array的首列必须进行排序;在此函数的向导中,有关Range_lookup参数的用法是错误的。