分享
 
 
 

linux 下C函数部分(12)

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

函数说明

getpgrp()用来取得目前进程所属的组识别码。此函数相当于调用getpgid(0);

返回值

返回目前进程所属的组识别码。

范例

#include<unistd.h>

main()

{

printf(“my gid =%d\n”,getpgrp());

}

执行

my gid =29546

getpid(取得进程识别码)

相关函数

fork,kill,getpid

表头文件

#include<unistd.h>

定义函数

pid_t getpid(void);

函数说明

getpid()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。

返回值

目前进程的进程识别码

范例

#include<unistd.h>

main()

{

printf(“pid=%d\n”,getpid());

}

执行

pid=1494 /*每次执行结果都不一定相同*/

getppid(取得父进程的进程识别码)

相关函数

fork,kill,getpid

表头文件

#include<unistd.h>

定义函数

pid_t getppid(void);

函数说明

getppid()用来取得目前进程的父进程识别码。

返回值

目前进程的父进程识别码。

范例

#include<unistd.h>

main()

{

printf(“My parent ‘pid =%d\n”,getppid());

}

执行

My parent pid =463

getpriority(取得程序进程执行优先权)

相关函数

setpriority,nice

表头文件

#include<sys/time.h>

#include<sys/resource.h>

定义函数

int getpriority(int which,int who);

函数说明

getpriority()可用来取得进程、进程组和用户的进程执行优先权。

参数

which有三种数值,参数who 则依which值有不同定义

which who 代表的意义

PRIO_PROCESS who 为进程识别码

PRIO_PGRP who 为进程的组识别码

PRIO_USER who 为用户识别码

此函数返回的数值介于-20 至20之间,代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。

返回值

返回进程执行优先权,如有错误发生返回值则为-1 且错误原因存于errno。

附加说明

由于返回值有可能是-1,因此要同时检查errno是否存有错误原因。最好在调用次函数前先清除errno变量。

错误代码

ESRCH 参数which或who 可能有错,而找不到符合的进程。EINVAL 参数which 值错误。

nice(改变进程优先顺序)

相关函数

setpriority,getpriority

表头文件

#include<unistd.h>

定义函数

int nice(int inc);

函数说明

nice()用来改变进程的进程执行优先顺序。参数inc数值越大则优先顺序排在越后面,即表示进程执行会越慢。只有超级用户才能使用负的inc 值,代表优先顺序排在前面,进程执行会较快。

返回值

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

错误代码

EPERM 一般用户企图转用负的参数inc值改变进程优先顺序。

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

相关函数

_exit,atexit,exit

表头文件

#include<stdlib.h>

定义函数

int on_exit(void (* function)(int, void*),void *arg);

函数说明

on_exit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。参数arg指针会传给参数function函数,详细情况请见范例。

返回值

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

附加说明

范例

#include<stdlib.h>

void my_exit(int status,void *arg)

{

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

printf(“exit (%d)\n”,status);

printf(“arg = %s\n”,(char*)arg);

}

main()

{

char * str=”test”;

on_exit(my_exit,(void *)str);

exit(1234);

}

执行

before exit()!

exit (1234)

arg = test

setpgid(设置进程组识别码)

相关函数

getpgid,setpgrp,getpgrp

表头文件

#include<unistd.h>

定义函数

int setpgid(pid_t pid,pid_t pgid);

函数说明

setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代。

返回值

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

错误代码

EINVAL 参数pgid小于0。

EPERM 进程权限不足,无法完成调用。

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

setpgrp(设置进程组识别码)

相关函数

getpgid,setpgid,getpgrp

表头文件

#include<unistd.h>

定义函数

int setpgrp(void);

函数说明

setpgrp()将目前进程所属的组识别码设为目前进程的进程识别码。此函数相当于调用setpgid(0,0)。

返回值

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

setpriority(设置程序进程执行优先权)

相关函数

getpriority,nice

表头文件

#include<sys/time.h>

#include<sys/resource.h>

定义函数

int setpriority(int which,int who, int prio);

函数说明

setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义

which who 代表的意义

PRIO_PROCESS who为进程识别码

PRIO_PGRP who 为进程的组识别码

PRIO_USER who为用户识别码

参数prio介于-20 至20 之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。

返回值

执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。

ESRCH 参数which或who 可能有错,而找不到符合的进程

EINVAL 参数which值错误。

EPERM 权限不够,无法完成设置

EACCES 一般用户无法降低优先权

system(执行shell 命令)

相关函数

fork,execve,waitpid,popen

表头文件

#include<stdlib.h>

定义函数

int system(const char * string);

函数说明

system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

附加说明

在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

范例

#include<stdlib.h>

main()

{

system(“ls -al /etc/passwd /etc/shadow”);

}

执行

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

-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

wait(等待子进程中断或结束)

相关函数

waitpid,fork

表头文件

#include<sys/types.h>

#include<sys/wait.h>

定义函数

pid_t wait (int * status);

函数说明

wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则

参数

status可以设成NULL。子进程的结束状态值请参考waitpid()。

返回值

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

附加说明

范例

#include<stdlib.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/wait.h>

main()

{

pid_t pid;

int status,i;

if(fork()= =0){

printf(“This is the child process .pid =%d\n”,getpid());

exit(5);

}else{

sleep(1);

printf(“This is the parent process ,wait for child...\n”;

pid=wait(&status);

i=WEXITSTATUS(status);

printf(“child’s pid =%d .exit status=^d\n”,pid,i);

}

}

执行

This is the child process.pid=1501

This is the parent process .wait for child...

child’s pid =1501,exit status =5

waitpid(等待子进程中断或结束)

相关函数

wait,fork

表头文件

#include<sys/types.h>

#include<sys/wait.h>

定义函数

pid_t waitpid(pid_t pid,int * status,int options);

函数说明

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:

pid<-1 等待进程组识别码为pid绝对值的任何子进程。

pid=-1 等待任何子进程,相当于wait()。

pid=0 等待进程组识别码与目前进程相同的任何子进程。

pid>0 等待任何子进程识别码为pid的子进程。

参数option可以为0 或下面的OR 组合

WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。

WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。

子进程的结束状态返回后存于status,底下有几个宏可判别结束情况

WIFEXITED(status)如果子进程正常结束则为非0值。

WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。

WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。

WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。

返回值

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

范例

参考wait()。

fprintf(格式化输出数据至文件)

相关函数

printf,fscanf,vfprintf

表头文件

#include<stdio.h>

定义函数

int fprintf(FILE * stream, const char * format,.......);

函数说明

fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。

返回值

关于参数format字符串的格式请参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例

#include<stdio.h>

main()

{

int i = 150;

int j = -100;

double k = 3.14159;

fprintf(stdout,”%d %f %x \n”,j,k,i);

fprintf(stdout,”%2d %*d\n”,i,2,i);

}

执行

-100 3.141590 96

150 150

fscanf(格式化字符串输入)

相关函数

scanf,sscanf

表头文件

#include<stdio.h>

定义函数

int fscanf(FILE * stream ,const char *format,....);

函数说明

fscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结构存于对应的参数内。

返回值

成功则返回参数数目,失败则返回-1,错误原因存于errno中。

附加说明

范例

#include<stdio.h>

main()

{

int i;

unsigned int j;

char s[5];

fscanf(stdin,”%d %x %5[a-z] %*s %f”,&i,&j,s,s);

printf(“%d %d %s \n”,i,j,s);

}

执行

10 0x1b aaaaaaaaa bbbbbbbbbb /*从键盘输入*/

10 27 aaaaa

printf(格式化输出数据)

相关函数

scanf,snprintf

表头文件

#include<stdio.h>

定义函数

int printf(const char * format,.............);

函数说明

printf()会根据参数format字符串来转换并格式化数据,然后将结果写出到标准输出设备,直到出现字符串结束('\0')为止。参数format字符串可包含下列三种字符类型

1.一般文本,伴随直接输出。

2.ASCII控制字符,如\t、\n等。

3.格式转换字符。

格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一printf()的参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。

Printf()格式转换的一般形式如下

%(flags)(width)(.prec)type

以中括号括起来的参数为选择性参数,而%与type则是必要的。底下先介绍type的几种形式

整数

%d 整数的参数会被转成一有符号的十进制数字

%u 整数的参数会被转成一无符号的十进制数字

%o 整数的参数会被转成一无符号的八进制数字

%x 整数的参数会被转成一无符号的十六进制数字,并以小写abcdef表示

%X 整数的参数会被转成一无符号的十六进制数字,并以大写ABCDEF表示浮点型数

%f double 型的参数会被转成十进制数字,并取到小数点以下六位,四舍五入。

%e double型的参数以指数形式打印,有一个数字会在小数点前,六位数字在小数点后,而在指数部分会以小写的e来表示。

%E 与%e作用相同,唯一区别是指数部分将以大写的E 来表示。

%g double 型的参数会自动选择以%f 或%e 的格式来打印,其标准是根据欲打印的数值及所设置的有效位数来决定。

%G 与%g 作用相同,唯一区别在以指数形态打印时会选择%E 格式。

字符及字符串

%c 整型数的参数会被转成unsigned char型打印出。

%s 指向字符串的参数会被逐字输出,直到出现NULL字符为止

%p 如果是参数是“void *”型指针则使用十六进制格式显示。

prec 有几种情况

1. 正整数的最小位数。

2.在浮点型数中代表小数位数

3.在%g 格式代表有效位数的最大值。

4.在%s格式代表字符串的最大长度。

5.若为×符号则代表下个参数值为最大长度。

width为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。

flags 有下列几种情况

#NAME?

+ 一般在打印负数时,printf()会加印一个负号,整数则不加任何负号。此旗标会使得在打印正数前多一个正号(+)。

# 此旗标会根据其后转换字符的不同而有不同含义。当在类型为o 之前(如%#o),则会在打印八进制数值前多印一个o。

而在类型为x 之前(%#x)则会在打印十六进制数前多印’0x’,在型态为e、E、f、g或G 之前则会强迫数值打印小数点。在类型为g 或G之前时则同时保留小数点及小数位数末尾的零。

0 当有指定参数时,无数字的参数将补上0。默认是关闭此旗标,所以一般会打印出空白字符。

返回值

成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例

#include<stdio.h>

main()

{

int i = 150;

int j = -100;

double k = 3.14159;

printf(“%d %f %x\n”,j,k,i);

printf(“%2d %*d\n”,i,2,i); /*参数2 会代入格式*中,而与%2d同意义*/

}

执行

-100 3.14159 96

150 150

sacnf(格式化字符串输入)

相关函数

fscanf,snprintf

表头文件

#include<stdio.h>

定义函数

int scanf(const char * format,.......);

函数说明

scanf()会将输入的数据根据参数format字符串来转换并格式化数据。Scanf()格式转换的一般形式如下

%[*][size][l][h]type

以中括号括起来的参数为选择性参数,而%与type则是必要的。

* 代表该对应的参数数据忽略不保存。

size 为允许参数输入的数据长度。

l 输入的数据数值以long int 或double型保存。

h 输入的数据数值以short int 型保存。

底下介绍type的几种形式

%d 输入的数据会被转成一有符号的十进制数字(int)。

%i 输入的数据会被转成一有符号的十进制数字,若输入数据以“0x”或“0X”开头代表转换十六进制数字,若以“0”开头则转换八进制数字,其他情况代表十进制。

%0 输入的数据会被转换成一无符号的八进制数字。

%u 输入的数据会被转换成一无符号的正整数。

%x 输入的数据为无符号的十六进制数字,转换后存于unsigned int型变量。

%X 同%x

%f 输入的数据为有符号的浮点型数,转换后存于float型变量。

%e 同%f

%E 同%f

%g 同%f

%s 输入数据为以空格字符为终止的字符串。

%c 输入数据为单一字符。

[] 读取数据但只允许括号内的字符。如[a-z]。

[^] 读取数据但不允许中括号的^符号后的字符出现,如[^0-9].

返回值

成功则返回参数数目,失败则返回-1,错误原因存于errno中。

范例

#include <stdio.h>

main()

{

int i;

unsigned int j;

char s[5];

scanf(“%d %x %5[a-z] %*s %f”,&i,&j,s,s);

printf(“%d %d %s\n”,i,j,s);

}

执行

10 0x1b aaaaaaaaaa bbbbbbbbbb

10 27 aaaaa

sprintf(格式化字符串复制)

相关函数

printf,sprintf

表头文件

#include<stdio.h>

定义函数

int sprintf( char *str,const char * format,.........);

第一頁    上一頁    第12頁/共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- 王朝網路 版權所有