前言
进程和线程,我在本科学习的时候就常常会听到大家谈论的时候说起来。我也很清楚一个进程可以由很多个线程。程序同样可以有很多个进程,等等巴拉巴拉一堆的。不过鉴于我本科的时候专心拉加权,无心代码,所以这么基础的玩意我一直都没有亲手实现过。。
好吧,现在终于到了彻底弄明白这些问题的时候了。并且,不仅仅是创立几个线程或者进程这么简单,我还要学习他们之间的通信方式。
第11章:进程和信号
首先第一个启动新进程的方式是通过system函数。
int system(const char *string)
等同于在shell命令行中输入如下命令
sh -c string
其实也就是启动了一个新的shell,字符串指针里放要执行的命令就行了。并且如果输入的命令不带有符号 &(即在后台运行),那么程序会在system调用这一行阻塞。因此这样的建立新进程的方式不太合适。
第二种方式
使用execl函数,该函数一共有6种变体
execl execlp execle
execv execvp execve
第一行是通过list参数来实现,所以末尾用使用 l, 第二种使用字符串数组来代替list参数。显得更加的简洁。不过需要自己建立参数字符串数组。如果要列出运行程序的路径,使用带p的,如果要加入环境参数,使用带e的函数。总之这个函数能够做到非常细致的配置。十分好用。
在程序中调用此函数时,原来的进程就会被替换掉了。所以execl函数后面的代码都不会继续运行了。
我在调用这个函数的时候我尝试给它加上&后运行的参数,但是程序报错,暂时没有找到别的方法,不过要实现这个功能可以通过system函数。
为了实现保留原有进程,并且开启一个新的进程,我们需要用到另一个函数了
fork()
fork函数的返回值是pid_t型的变量