系统调用例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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