linux c语言如何快速知道函数的头文件

linux c语言如何快速知道函数的头文件,第1张

1、要用到unistd.h头文件。

2、 Write函数用法:write函数所在的头文件为 <unistd.h>write有两种用法。一种是:ssize_twrite(int handle, void *buf, int nbyte)handle 是文件描述符;buf是指定的缓冲区,即指针,指向一段内存单元;nbyte是要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.另一种是:write(const char* str,int n)str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。write("string",strlen("string")表示输出字符串常量3、程序示例:

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys\stat.h>

#include <io.h>

#include <string.h>

int main(void)

{

int *handle char string[40]

int length, res/* Create a file named "TEST.$$$" in the current directory and write a string to it. If "TEST.$$$" already exists, it will be overwritten. */

if ((handle = open("TEST.$$$", O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1)

{

printf("Error opening file.\n")

exit(1)

}

strcpy(string, "Hello, world!\n")

length = strlen(string)

if ((res = write(handle, string, length)) != length)

{

printf("Error writing to the file.\n")

exit(1)

}

printf("Wrote %d bytes to the file.\n", res)

close(handle) return 0 }

GLOB

Section: Linux Programmer's Manual (7)

Updated: 12 June

1998

Index

NAME

glob - 形成路径名称

描述 (DESCRIPTION)

很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板.

不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似的 库函数 glob(3), 让 用户程序 实现 同样的 功能.

此 规则 遵循 (POSIX 1003.2, 3.13).

通配符匹配 (WILDCARD MATCHING)

包含 '?', '*' 或 '[' 字符的 字符串 称为 通配符模板(wildcard

pattern). 形成路径名(globbing) 指 一种 *** 作, 把 通配符模板 展开为 匹配 该串的 路径名. 匹配 定义为:

不在 方括弧中 的 '?' 匹配 任意 单个 字符.

不在 方括弧中 的 '*' 匹配 任意 字符串, 包括 空串.

字符集 (Character classes)

对于 表达式 `[...]', 如果 在 第一个 '['符 后面 出现的 第一个 字符 不是

'!', 则 该 表达式 匹配 任意 一个 在 `[...]'内 出现的 字符. 方括弧内 不能 有 空串, 因此 ']' 可以 作为 第一个 字符 出现在

方括弧内. (像 这样, '[][!]' 匹配 下列三个 字符 中的 任意 一个, '[', ']' 和 '!'.)

范围集 (Ranges)

字符集 有一个 特例: 用 '-' 分开的 两个 字符 表示 一个 范围集. (像 这样, `[A-Fa-f0-9]'

等于 `[ABCDEFabcdef0123456789]'.) 把 '-' 放到 方括弧内 的 开头 或 最后 可以 获得 它的 本意. (像 这样,

`[]-]' 匹配 ']'和'-' 中 任意 一个. 而 `[--/]' 匹配 `-', `.' 和`/'中任意 一个.)

补集 (Complementation)

表达式 '[!...]' 表示 一个 字符, 该 字符 不匹配 方括弧内 去掉 开头 '!' 后的

表达式. (像 这样, `[!]a-]' 匹配 除了 ']', 'a' 和 '-' 的 任意 一个 字符.)

要 去掉 '?', '*' 和 '[' 的 特殊 含义, 可以 通过 前面 加 一个 反斜杠或者 在 shell 命令行 中, 通过 引号 来 引用

这些 字符. 在 方括弧内 这些 字符 显露出 本意, 所以, '[[?*\]' 匹配 这 四个字符中 的 一个: '[', '?', '*', '\'.

路径名 (PATHNAME)

形成路径名 功能 应用于 路径 中 的 每一个 成员部分. 路径 中 的 '/' 不能 被通配符 '?' 或

'*', 或 范围集 如 '[.-0]' 匹配. 范围集 不能 直接 包含 '/', 否则 导致 语法错误.

如果 待匹配的 文件名 以'.'开头, 那么 这个 '.' 字符 必须 直接 给出. (比如说, 用 'tar c .' 会 更好.)

空列表 (EMPTY LISTS)

上述的 简单优雅 规则, 把 通配符模板 展开为 匹配的 路径名, 来源于 最初的 UNIX 定义. 它

允许 展开出 空串, 例如 xv -wait 0 *.gif *.jpg

这里 可能 没有 *.gif 文件 (而且 不算 错误).

然而, POSIX 要求 句法 错误 或 路径名 列表 为 空 时, 保留 通配符模板 不变. (译注: 即 不展开.)

在 bash 中 可以 通过 设置 allow_null_glob_expansion=true 把 它 强置为 传统的

风格. (其他 地方 也有 类似的 问题, 例如, 老式的 语句 是

rm `find . -name "*~"`

新的 写法 为

rm -f nosuchfile `find . -name "*~"`

以 避免 由于 空参数调用 rm 而 产生 错误信息.)

注意 (NOTES)

正规表达式 (Regular expressions)

注意, 通配符模板 不是 正规表达式, 尽管 它们 有点象. 首先, 它 匹配 文件名,

而 不是 正文其次, 规则 不一样, 例如 正规表达式 里 的 '*' 代表 零个或多个 前面内容的 重复.

正规表达式 的 方括弧表达式 用 '^' 引导 取反 *** 作, (而不是 '[!...]'). POSIX 声明, 在 通配符模板 中, '[^...]'

未做 定义.

字符集 和 国际化 (Character classes and Internationalization )

当然, 范围集 最初 指

ASCII的 范围, 因此 '[ -%]' 意思是 '[ !"#$%]',

一些 UNIX实现 把 这个 归纳为: 范围 X-Y 指 X的编码 到 Y的编码 之间的编码字符. 可是, 这 要求 用户 知道 他们 本地系统的

字符编码, 此外, 如果本地的 字母表顺序 和 字符集顺序 不对应, 那 就 更不方便了.

因此, POSIX 对 通配符模板 和 正规表达式 的 方括弧表达法 作了 重大扩展, 上面 我们 知道了 方括弧表达式 中 的 三个 类型, 它们是

(i) 取补集 (ii) 直接列出的 单个字符 和 (iii) 范围集.

POSIX 对 范围集 在 国际化 方面 作了 更有力的 说明, 并且 增加了 三个 类型:

(iii) 范围 X-Y 由 X 和 Y 之间 所有的字符 组成 (包括X和Y), X 和 Y 的 当前编码序列 由 当前场合的 LC_COLLATE

分类定义.

(iv) 命名字符集, 象

[:alnum:] [:alpha:] [:blank:] [:cntrl:]

[:digit:] [:graph:] [:lower:] [:print:]

[:punct:] [:space:] [:upper:] [:xdigit:]

因此 可以 用 '[[:lower:]]' 代替 '[a-z]', 它 在 丹麦语 里 同样 有效, 虽然 丹麦的 字母表 里 'z' 后面 还有

三个 字母. 这些 字符集 由 当前场合的 LC_CTYPE 分类定义.

(v) 符号对映, 象 '[.ch.]' 或 '[.a-acute.]', 在 '[.' 和 '.]' 之间的 字符串 是 定义 在 当前场合的

对映元素. 注意 这 可以 是 多字符元素.

(vi) 等类表达式, 象 '[=a=]', 在 '[=' 和 '=]' 之间的 字符串 是 任意 等类 中 的 对映元素, 它 定义在 当前场合.

例如, '[[=a=]]' 可以 等同于 `[a徉溻]' (警告: 这里 有 Latin-1 字符), 也就是

`[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'.

SEE ALSO

sh(1), glob(3), fnmatch(3),

locale(7), regex(7)

linux c system函数介绍:

system(执行shell 命令)

相关函数

fork,execve,waitpid,popen

表头文件

#i nclude

定义函数

int system(const char * string)

函数说明

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

返回值

=-1:出现错误

=0:调用成功但是没有出现子进程

>0:成功退出的子进程的id

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

附加说明

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

范例

#i nclude

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/shado

例2:

char tmp[]

sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev)

system(tmp)

其中dev是/dev/sda1。

system函数的源码

#include <syspes.h>

#include <sys/wait.h>

#include <errno.h>

#include <unistd.h>

int system(const char * cmdstring)

{

pid_t pid

int status

if(cmdstring == NULL){

return (1)

}

if((pid = fork())<0){

status = -1

}

else if(pid = 0){

execl("/bin/sh", "sh", "-c", cmdstring, (char *)0)

-exit(127)//子进程正常执行则不会执行此语句

}

else

{

while(waitpid(pid, &status, 0) <0){

if(errno != EINTER)

{

status = -1

break

}

}

}

return status

}

那么如何获得system的返回值呢??

char buf[10]

char * ps="ps -ef|grep -c root"

FILE *ptr

int i

if((ptr = popen(ps, "r")) != NULL)

{

fgets(buf, 10 , ptr)

i = atoi(buf)

pclose(ptr)

}

可以man下waitpid查看下如何检查status的值

int ret = system("ls -al /etc/passwd /etc/shadow")

if(WIFSIGNALED(ret))

具体的这些宏查看man waitpid


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存