分享
 
 
 

linux 下C函数部分(11)

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

函数说明

ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

返回值

当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

错误代码

EBADF 参数stream无效或可移动读写位置的文件流。

范例

参考fseek()。

fwrite(将数据写至文件流)

相关函数

fopen,fread,fseek,fscanf

表头文件

#include<stdio.h>

定义函数

size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明

fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。

返回值

返回实际写入的nmemb数目。

范例

#include<stdio.h>

#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}

#define nmemb 3

struct test

{

char name[20];

int size;

}s[nmemb];

main()

{

FILE * stream;

set_s(0,”Linux!”);

set_s(1,”FreeBSD!”);

set_s(2,”Windows2000.”);

stream=fopen(“/tmp/fwrite”,”w”);

fwrite(s,sizeof(struct test),nmemb,stream);

fclose(stream);

}

执行

参考fread()。

getc(由文件中读取一个字符)

相关函数

read,fopen,fread,fgetc

表头文件

#include<stdio.h>

定义函数

int getc(FILE * stream);

函数说明

getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。

返回值

getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

范例

参考fgetc()。

getchar(由标准输入设备内读进一字符)

相关函数

fopen,fread,fscanf,getc

表头文件

#include<stdio.h>

定义函数

int getchar(void);

函数说明

getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char转换成int后返回。

返回值

getchar()会返回读取到的字符,若返回EOF则表示有错误发生。

附加说明

getchar()非真正函数,而是getc(stdin)宏定义。

范例

#include<stdio.h>

main()

{

FILE * fp;

int c,i;

for(i=0li<5;i++)

{

c=getchar();

putchar(c);

}

}

执行

1234 /*输入*/

1234 /*输出*/

gets(由标准输入设备内读进一字符串)

相关函数

fopen,fread,fscanf,fgets

表头文件

#include<stdio.h>

定义函数

char * gets(char *s);

函数说明

gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。

返回值

gets()若成功则返回s指针,返回NULL则表示有错误发生。

附加说明

由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。

范例

参考fgets()

mktemp(产生唯一的临时文件名)

相关函数

tmpfile

表头文件

#include<stdlib.h>

定义函数

char * mktemp(char * template);

函数说明

mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。

返回值

文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

附加说明

参数template所指的文件名称字符串必须声明为数组,如:

char template[ ]=”template-XXXXXX”;

不可用char * template=”template-XXXXXX”;

范例

#include<stdlib.h>

main()

{

char template[ ]=”template-XXXXXX”;

mktemp(template);

printf(“template=%s\n”,template);

}

putc(将一指定字符写入文件中)

相关函数

fopen,fwrite,fscanf,fputc

表头文件

#include<stdio.h>

atexit(设置程序正常结束前调用的函数)

相关函数

_exit,exit,on_exit

表头文件

#include<stdlib.h>

定义函数

int atexit (void (*function)(void));

函数说明

atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。

返回值

如果执行成功则返回0,否则返回-1,失败原因存于errno中。

范例

#include<stdlib.h>

void my_exit(void)

{

printf(“before exit () !\n”);

}

main()

{

atexit (my_exit);

exit(0);

}

执行

before exit()!

execl(执行文件)

相关函数

fork,execle,execlp,execv,execve,execvp

表头文件

#include<unistd.h>

定义函数

int execl(const char * path,const char * arg,....);

函数说明

execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值

如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

范例

#include<unistd.h>

main()

{

execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);

}

执行

/*执行/bin/ls -al /etc/passwd */

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execlp(从PATH 环境变量中查找文件并执行)

相关函数

fork,execl,execle,execv,execve,execvp

表头文件

#include<unistd.h>

定义函数

int execlp(const char * file,const char * arg,……);

函数说明

execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值

如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码

参考execve()。

范例

/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */

#include<unistd.h>

main()

{

execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);

}

执行

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execv(执行文件)

相关函数

fork,execl,execle,execlp,execve,execvp

表头文件

#include<unistd.h>

定义函数

int execv (const char * path, char * const argv[ ]);

函数说明

execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。

返回值

如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码

请参考execve()。

范例

/* 执行/bin/ls -al /etc/passwd */

#include<unistd.h>

main()

{

char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};

execv(“/bin/ls”,argv);

}

执行

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execve(执行文件)

相关函数

fork,execl,execle,execlp,execv,execvp

表头文件

#include<unistd.h>

定义函数

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

函数说明

execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

返回值

如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码

EACCES

1. 欲执行的文件不具有用户可执行的权限。

2. 欲执行的文件所属的文件系统是以noexec 方式挂上。

3.欲执行的文件或script翻译器非一般文件。

EPERM

1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。

2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。

E2BIG 参数数组过大

ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。

EFAULT 参数filename所指的字符串地址超出可存取空间范围。

ENAMETOOLONG 参数filename所指的字符串太长。

ENOENT 参数filename字符串所指定的文件不存在。

ENOMEM 核心内存不足

ENOTDIR 参数filename字符串所包含的目录路径并非有效目录

EACCES 参数filename字符串所包含的目录路径无法存取,权限不足

ELOOP 过多的符号连接

ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中

EIO I/O 存取错误

ENFILE 已达到系统所允许的打开文件总数。

EMFILE 已达到系统所允许单一进程所能打开的文件总数。

EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区

EISDIR ELF翻译器为一目录

ELIBBAD ELF翻译器有问题。

范例

#include<unistd.h>

main()

{

char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};

char * envp[ ]={“PATH=/bin”,0}

execve(“/bin/ls”,argv,envp);

}

执行

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

execvp(执行文件)

相关函数

fork,execl,execle,execlp,execv,execve

表头文件

#include<unistd.h>

定义函数

int execvp(const char *file ,char * const argv []);

函数说明

execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。

返回值

如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

错误代码

请参考execve()。

范例

/*请与execlp()范例对照*/

#include<unistd.h>

main()

{

char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};

execvp(“ls”,argv);

}

执行

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

exit(正常结束进程)

相关函数

_exit,atexit,on_exit

表头文件

#include<stdlib.h>

定义函数

void exit(int status);

函数说明

exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。

返回值

范例

参考wait()

_

exit(结束进程执行)

相关函数

exit,wait,abort

表头文件

#include<unistd.h>

定义函数

void _exit(int status);

函数说明

_exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。

返回值

附加说明

_exit()不会处理标准I/O 缓冲区,如要更新缓冲区请使用exit()。

vfork(建立一个新的进程)

相关函数

wait,execve

表头文件

#include<unistd.h>

定义函数

pid_t vfork(void);

函数说明

vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意

死锁或竞争条件的发生。

返回值

如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork 失败则直接返回-1,失败原因存于errno中。

错误代码

EAGAIN 内存不足。ENOMEM 内存不足,无法配置核心所需的数据结构空间。

范例

#include<unistd.h>

main()

{

if(vfork() = =0)

{

printf(“This is the child process\n”);

}else{

printf(“This is the parent process\n”);

}

}

执行

this is the parent process

this is the child process

getpgid(取得进程组识别码)

相关函数

setpgid,setpgrp,getpgrp

表头文件

#include<unistd.h>

定义函数

pid_t getpgid( pid_t pid);

函数说明

getpgid()用来取得参数pid 指定进程所属的组识别码。如果参数pid为0,则会取得目前进程的组识别码。

返回值

执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中。

错误代码

ESRCH 找不到符合参数pid 指定的进程。

范例

/*取得init 进程(pid=1)的组识别码*/

#include<unistd.h>

mian()

{

printf(“init gid = %d\n”,getpgid(1));

}

执行

init gid = 0

getpgrp(取得进程组识别码)

相关函数

setpgid,getpgid,getpgrp

表头文件

#include<unistd.h>

定义函数

pid_t getpgrp(void);

第一頁    上一頁    第11頁/共20頁    下一頁    最後頁
第01頁 第02頁 第03頁 第04頁 第05頁 第06頁 第07頁 第08頁 第09頁 第10頁 
第11頁 第12頁 第13頁 第14頁 第15頁 第16頁 第17頁 第18頁 第19頁 第20頁 
 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有