C语⾔常见的函数调⽤
C语⾔常见的函数调⽤
isatty,函数名,主要功能是检查设备类型,判断⽂件描述词是否为终端机。
函数名: isatty
⽤法: int isatty(int desc);
返回值:如果参数desc所代表的⽂件描述词为⼀终端机则返回1,否则返回0。
程序例:
#include <stdio.h>
#include <io.h>
int main(void)
{
int handle;
handle = fileno(stdout);
if (isatty(handle))
printf("Handle %d is a device type\n", handle);
else
printf("Handle %d isn't a device type\n", handle);
re
函数名称:fileno(在VC++6.0下为_fileno)
函数原型:int _fileno( FILE *stream );
函数功能:fileno()⽤来取得参数stream指定的⽂件流所使⽤的
返回值:某个数据流的⽂件描述符
头⽂件:
相关函数:open,fopen,fclose
void *memset(void *s, int ch, n);
函数解释:将s中当前位置后⾯的n个字节(typedef unsigned int size_t )⽤ ch 替换并返回 s 。
memset:作⽤是在⼀段内存块中填充某个给定的值,它是对较⼤的或进⾏清零操作的⼀种最快⽅法
函数原型
char *fgets(char *buf, int bufsize, FILE *stream);
参数
*buf: 字符型指针,指向⽤来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的⼤⼩。
*stream: ⽂件结构体指针,将要读取的⽂件流。
返回值
1. 成功,则返回第⼀个参数buf;
2. 在读字符时遇到end-of-file,则eof指⽰器被设置,如果还没读⼊任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
3. 如果发⽣读⼊错误,error指⽰器被设置,返回NULL,buf的值可能被改变。
chdir 是中的⼀个系统调⽤函数(同cd),⽤于改变当前⼯作⽬录,其参数为Path ⽬标⽬录,可以是绝对⽬录或相对⽬录。
write的返回值exec函数
linux下c语⾔编程exec函数使⽤
2012年04⽉10⽇ 09:39:27
阅读数:19800
exec⽤被执⾏的程序完全替换调⽤它的程序的影像。fork创建⼀个新的进程就产⽣了⼀个新的PID,ex
ec启动⼀个新程序,替换原有的进程,因此这个新的被exec执⾏的进程的PID不会改变,和调⽤exec函数的进程⼀样。
下⾯来看下exec函数族:
#include <unid.h>
int execl(cst char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
exec函数族装⼊并运⾏程序pathname,并将参数arg0(arg1,arg2,argv[],envp[])传递给⼦程序,出错返回-1。在exec函数族中,后缀l、v、p、e添加到exec后,所指定的函数将具有某种操作能⼒有后缀:
execl("/bin/ls","ls","-a",NULL)
execv("/bin/ls",arg)
execlp("ls","ls","-a",NULL)
execvp("ls",arg)
execle("/bin/ls","ls","-a",NULL,envp)
execve("/bin/ls",arg,envp)
assert()使⽤
assert()是⼀个调试程序时经常使⽤的宏,在程序运⾏时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终⽌执⾏。如果表达式不为0,则继续执⾏后⾯的语句,它的作⽤是终⽌程序以免导致严重后果,同时也便于查错误。
linux编程之dup与dup2
在linux下,通过open打开以⽂件后,会返回⼀个⽂件描述符,⽂件描述符会指向⼀个⽂件表,⽂件表中的节点指针会指向节点表。看下图:
打开⽂件的内核数据结构
dup和dup2两个函数都可以⽤来复制打开的⽂件描述符,复制成功后和复制源共享同⼀个⽂件表。看
下表
执⾏dup后的内核数据结构
dup函数
fd1和fd共享⼀个⽂件表(对df进⾏什么操作,fd1也会有相应的操作,fd和fd1是同步的)
具体解释:
#inclue<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
char buf[6]={0};
char buf1[6]={0};
int fd = open("file",O_RDWR|O_CREAT,0644);
if(fd < 0)
printf("open error");
printf("fd:%d\n",fd);
/
/输出fd=3;
write(fd,"hello,world",12);
lseek(fd,0,SEEK_SET); //将⽂件偏移量置为0,就是从第⼀个字符开始读(h开始)
read(fd,buf,5);
printf("fd:%s",buf);//输出hello
int fd1 = dup(fd);
read(fd1,buf1,5); //之前做的是对fd的读写操作,并没有对fd1做任何操作。但在这对fd1进⾏了读,如果输出数据。说明fd和fd1是同步的(fd做了什么相当于fd1也做了什么)printf("fd1:%s\n",buf1); //输出,worl
//既然输出的是fd中的内容,说明fd和fd1共⽤⼀个⽂件表,读到的是,worl,⽽不是hello(我们在上⾯将偏移量从第⼀个字符开始,输出hello之后,fd的偏移量距离开始有5个字符当我们再次读fd的时候,它是从第6个字符开始读的,很明显,第6个是逗号,往后读5个,就是,worl),说明偏移量是⼀致的。(其实不⽤写偏移量,因为共⽤⽂件表就意味着⽂件偏移量也共⽤)
printf("fd1:%d\n",fd1);//输出fd1 = 4
//fd=3不等于fd1说明不共⽤同⼀个⽂件描述符。这也是dup和dup2的区别。
close(fd);
close(fd1);
return 0;
}
(2)dup2函数
fd2 = dup2(fd,fd1);
fd2⽤的fd1(第⼆个参数)的描述符,⽤的fd(第⼀个参数)的⽂件(和fd共享⼀个⽂件表,当然也共享⽂件偏移量)
强调第⼏个参数是因为如果你写成fd2=dup2(fd1,fd);那么fd2 =fd,和fd1共享同⼀个⽂件表。
#inclue<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
int fd = open("file",O_RDWR|O_CREAT,0644);
printf("open error");
printf("fd:%d\n",fd);
//输出fd=3;
int fd1 =open("text",,O_RDWR|O_CREAT,0644);
if(fd1 < 0)
printf("open error");
printf("fd1:%d\n",fd1);
//输出fd1=4;
int fd2 = dup2(fd,fd1);
printf("fd2:%d\n",fd2);
//输出fd2=4;
//fd1 =fd2=4;说明fd2使⽤了fd1的⽂件描述符。
char buf[12]="hello,world";
write(fd,buf,12); //我们对fd进⾏了写,并没有对fd2进⾏写
read(fd2,buf,12);//但是我们对fd2读的时候,如果没有写,怎么可能读出来呢
printf("fd2:%s\n",buf);//事实是读出来了
//输出fd2:hello,world //说明fd和fd2共⽤⼀个⽂件表。
lseek(fd,5,SEEK_SET);//距离开始偏移5位,说明下次读的时候是从第6个开始,注意我们是对fd进⾏偏移,没有对fd2偏移
read(fd2,buf,5); //但是如果读fd2结果是从第6个字符开始的
buf[5]=0; //如果不写这句,输出的buf是按照12个字符输出的。因为定义buf的时候数组中可以放12个字符。
printf("fd2:%s\n",buf);//输出fd2:,worl //说明fd2和fd共享⽂件偏移量。
close(fd);
close(fd2);
return 0;
}
dup和dup2的区别
dup:fd1= dup(fd);⽬标描述符使⽤了fd的⽂件表
dup2:fd2 = dup2(fd1,fd)⽬标描述符使⽤了fd1的描述符,使⽤了fd的⽂件表
linux编程之pipe()函数
管道是⼀种把两个进程之间的标准输⼊和标准输出连接起来的机制,从⽽提供⼀种让多个进程间通信的⽅法,当进程创建管道时,每次都需要提供两个⽂件描述符来操作管道。其中⼀个对管道进⾏写操作,另⼀个对管道进⾏读操作。对管道的读写与⼀般的IO系统函数⼀致,使⽤write()函数写⼊数据,使⽤read()读出数据。
#include<unistd.h>
int pipe(int filedes[2])
返回值:成功,返回0,否则返回-1。参数数组包含pipe使⽤的两个⽂件的描述符。fd[0]:读管道,fd[1]写管道。
必须在fork()中调⽤pipe(),否则⼦进程不会继承⽂件描述符。两个进程不共享祖先进程,就不能使⽤pipe。但是可以使⽤命名管道。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<sys/types.h>
6 int main(void){
7 int result=-1;
8 int fd[2],nbytes;
9 pid_t pid;
10 char string[]="hell world, my pipe!";
11 char readbuffer[100];
12 int *write_fd=&fd[1];
13 int *read_fd=&fd[0];
14 result=pipe(fd);;
15 if(-1==result){
16 printf("fail to create pipe\n");
17 return -1;
18 }
19 pid=fork();
20 if(-1==pid){
21 printf("fail to fork\n");
22 return -1;
23 }
24 if(0==pid){
25 close(*read_fd);
26 result=write(*write_fd,string,strlen(string));
27 return 0;
28 }else{
29 close(*write_fd);
30 nbytes=read(*read_fd,readbuffer,sizeof(readbuffer));
31 printf("the parent receive %d bytes data: %s \n",nbytes,readbuffer);
32 }
33 return 0;
34 }
the parent receive 20 bytes data: hell world, my pipe!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define COUNT (10)
int main(int argc, char *argv[])
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论