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返回的文件流做为新进程的标准输出流。