Chinaunix首页 | 论坛 | 博客
  • 博客访问: 284796
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: C/C++

2016-07-30 13:59:43

进程控制(系统调用)
pid_t getpid(void);
pid_t getppid(void);
pid_t fork( void);
pid_t 是一个宏定义,其实质是int 被定义在#include中。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。相互独立。也就是子进程拷贝了父进程的数据段,执行顺序不确定,例如:
Count=0;
pid=fork();
count++;
printf(count);
结果为:11(两个进程都有自己的count,所以打印了两边1,不是一个十一..)

pid_t vfork(void);子进程和父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行。如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork失败则直接返回-1,失败原因存于errno中。

说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
int execl(const char *p ath, const char *arg, ...); path是完整路径
execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);

int execlp(const char *file, const char *arg, ...); 不含路径,从PATH中找
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);

int execv(const char *path, char *const argv[]); 参数都在argv里
char*argv[]={”ls”,”-al”,”/home”,NULL};
execv(“/bin/ls”,argv);


int execle(const char *path, const char *arg, char * const envp[]);

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

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

最后一个参数须用空指针NULL作结束,用(char*)0可代替。

int system(const char * string);(执行shell 命令)

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

system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。如果fork()失败 返回-1:出现错误

如果exec()失败,表示不能执行Shell,返回值相当于Shell执行了exit(127)

成功则最后会返回执行shell命令后的返回值

pid_t wait (int * status);wait()会暂时停止进程的执行,直到有信号来到或子进程结束。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status 可以设成NULL。如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。

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);取得子进程exit的返回值
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
阅读(1849) | 评论(0) | 转发(0) |
0

上一篇:linux时间编程

下一篇:linux c进程通信

给主人留下些什么吧!~~