linux 进程控制 sleep (),Linux进程控制(二):进程的创建

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

Linux下有四类创建子进程的函数:system(),fork(),exec*()祖函数,popen()

二.system函数

2.1.原型#include

int system(const char *string);system函数通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve(“/bin/sh”,..)函数来实现的。通过system创建子进程后,原进程和子进程各自运行,相互间关联较少。如果system调用成功,将返回0。

2.2.例子///

/// @file 3_system.cpp

/// @author AverageJoeWang([email protected])

///

#include

#include

#include

#include

using std::cout;

using std::endl;

int main()

{

system("ls -l");//直接调用linux相关命令

sleep(1);

system("clear");

return 0;

}

三.fork函数

3.1.原型#include

pid_t fork(void);在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

它和其他函数的区别在于:它执行一次返回两个值。

其中父进程的返回值是子进程的进程号,而子进程的返回值为0.

若出错则返回-1.因此可以通过返回值来判断是父进程还是子进程。

3.2.说明

fork函数创建子进程的过程为:1.使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有它的进程号、资源使用和计时器等。

2.通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值与子进程的fork返回值不同

3.在原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。

3.3.例子///

/// @file 3_fork1.cpp

/// @author AverageJoeWang([email protected])

///

#include

#include

#include

#include

using std::cout;

using std::endl;

int main()

{

printf("Parent process id :%dn", getpid());

pid_t pc = fork();

if(pc < 0)

printf("create child process failed!n");

else if(pc == 0)//子进程

printf("child process id:%d ppid:%dn", getpid(), getppid());

else//父进程

printf("parent process success, child id: %dn", pc);

return 0;

}

四.exec族函数

4.1.原型

exec由多个函数组成的族函数#include

extern char **environ;

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

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

int execv(const char *path, char *const argv[]);

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

int execvpe(const char *file, char *const argv[], char *const envp[]);exec函数族的工作过程与fork完全不同,fork是在复制一份原进程,而exec函数是用exec的第一个参数指定的程序覆盖现有进程空间(也就是说执行exec族函数之后,它后面的所有代码不再执行)。

path是包括执行文件名的全路径名

arg是可执行文件的命令行参数,多个用,最后一个参数必须为NULL。

4.2.例子加法程序,从命令行接受两个数,输出其和

第一个程序03_exec1.cpp///

/// @file 03_exec1.cpp

/// @author AverageJoeWang([email protected])

///

#include

#include

#include

#include

using std::cout;

using std::endl;

int main(int argc, char* argv[])

{

int a = atoi(argv[1]);//字符转整型

int b = atoi(argv[2]);//分别接收2个输入

printf("%d + %d = %d", a,b,a+b);

return 0;

}

//先编译,g++ 03_exec1.cpp -o add.out

第二个程序03_exec2.cpp///

/// @file 03_exec2.cpp

/// @author AverageJoeWang([email protected])

///

#include

#include

#include

#include

using std::cout;

using std::endl;

int main()

{

execl("./add.out", "add.out", "3", "4", NULL);

return 0;

}

//编译g++ 03_exec2.cpp -o a.out

执行g++ 03_exec1.cpp -o add.out

g++ 03_exec2.cpp -o a.out

./a.out

五.popen函数

5.1.原型

popen函数类似于system函数,与system的不同之处在于它使用管道工作。#include

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

int pclose(FILE *stream);command为可执行文件的全路径和执行参数;

type可选参数为”r”或”w”,如果为”w”,则popen返回的文件流做为新进程的标准输入流,即stdin,如果为”r”,则popen返回的文件流做为新进程的标准输出流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值