系统调用例子

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LINUX系统调用函数

1、开启子进程

fork

fork()函数,Linux系统调用

头文件:

#include

函数定义:

int fork( void );

返回值:

子进程中返回0,父进程中返回子进程ID,出错返回-1

函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。

示例代码:

#include

#include

int main(int argc, void ** argv )

{

int pid = fork();

if(pid == -1 ) {

// print("error!");

} else if( pid = =0 ) {

// print("This is the child process!");

} else {

// print("This is the parent process! child process id = %d", pid);

}

return 0;

}

Fork()系统在Linux中的返回值是没有NULL的.

Error Codes

出错返回错误信息如下:

EAGAIN

达到进程数上限.

ENOMEM

没有足够空间给一个新进程分配.

EPROCLIM

2、复制

dup2

函数名: dup2

功能: 复制文件句柄

用法: int dup2(int oldhandle, int newhandle);

程序例:

#include

#include

#include

#include

int main(void)

{

#define STDOUT 1

int nul, oldstdout;

char msg[] = "This is a test";

/* create a file */

nul = open("DUMMY.FIL", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);

/* create a duplicate handle for standard

output */

oldstdout = dup(STDOUT);

/*

redirect standard output to DUMMY.FIL

by duplicating the file handle onto the

file handle for standard output.

*/

dup2(nul, STDOUT);

/* close the handle for DUMMY.FIL */

close(nul);

/* will be redirected into DUMMY.FIL */

write(STDOUT, msg, strlen(msg));

/* restore original standard output

handle */

dup2(oldstdout, STDOUT);

/* close duplicate handle for STDOUT */

close(oldstdout);

return 0;

}

3、读取进程的结果

popen

[编辑本段]

Linux C

进程I/O函数,与pclose函数一起使用。

表头文件

#include

函数定义

FILE * popen ( const char * command , const char * type );

int pclose ( FILE * stream );

函数说明

popen() 函数通过创建一个管道,调用fork 产生一个子进程,执行一个shell 以运行命令来开启一个进程。这个进程必须由pclose() 函数关闭,而不是fclose() 函数。pclose() 函数关闭标准I/O 流,等待命令执行结束,然后返回shell 的终止状态。如果shell 不能被执行,则pclose() 返回的终止状态与shell 已执行exit 一样。

type 参数只能是读或者写中的一种,得到的返回值(标准I/O 流)也具有和type 相应的只读或只写类型。如果type 是"r" 则文件指针连接到command 的标准输出;如果type 是"w" 则文件指针连接到command 的标准输入。

command参数是一个指向以NULL 结束的shell 命令字符串的指针。这行命令将被传到bin/sh 并使用-c 标志,shell 将执行这个命令。

popen的返回值是个标准I/O 流,必须由pclose来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用popen的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用popen 的进程相同。

返回值

如果调用fork() 或pipe() 失败,或者不能分配内存将返回NULL,否则返回标准I/O 流。

返回错误

popen没有为内存分配失败设置errno 值。

如果调用fork() 或pipe() 时出现错误,errno 被设为相应的错误类型。

如果type 参数不合法,errno将返回EINVAL。

使用举例

if((fp=popen("/usr/bin/uptime","r"))==NULL);

{

sprintf(buf,"error: %s\n", strerror(errno));

....//异常处理

}

else

{

....

pclose(fp);

}

4、创建管道

pipe

相关文档
最新文档