c++ linux fork
判断父子进程的参考博客:https://blog.csdn.net/cckluv/article/details/109169941
等待子进程的参考博客:https://blog.csdn.net/Mmmmmmmrr/article/details/97825932
在父进程中,fork返回新创建子进程的进程ID; 在子进程中,fork返回0; 如果出现错误,fork返回一个负值;
fork 是基于写时拷贝的,所以,fork得到的两个进程,一开始状态是一模一样的。
1 判断父子进程的例子:
int main()
{
pid_t fpid; //fpid表示fork函数返回的值
int count = 0;
fpid = fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n", getpid());
printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d/n", getpid());
printf("我是孩子他爹/n");
count++;
}
printf("统计结果是: %d/n", count);
return 0;
}
2 等待子进程的例子
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <error.h>
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork");
exit(1);
}
if(id == 0)
{
printf("I am child...\n");
sleep(20);
exit(10);
}
else
{
int st;
int ret = wait(&st);
if(ret > 0 && (st & 0x7F) == 0)
{
//正常终止
printf("child exit code:%d\n",(st >> 8)&0x7F);
}
else if(ret > 0)
{
//异常退出
printf("sig code:%d\n",st&0x7F);
}
}
}
3 在for循环中使用时要小心,错误的例子展示
for(int i=0;i!=cmds.size();++i) {
pid_t fpid; //fpid表示fork函数返回的值
fpid = fork();
if(fpid==0) {
TV st = getTime();
system(cmds[i].c_str());
TV et = getTime();
string costTimeStr = getCTS(st, et);
saveCmdTime(costTimeStr);
} else {
int st;
int ret = wait(&st);
}
}
作者的本意(没错就是我,2333)是父进程去分派任务,子进程干活。
但程序实际的意思是,父进程分派任务,子进程干完当前cmds[i]的任务后,开始分派i往后的任务。
所以第0个任务执行一次,第1个任务会执行2次,第三个任务会执行3次,等等。
我当时任务个数是17,所以就是17+16+15+14+13+12+11+...+1=((17+1)*8)+9=144+9=153
然后这153个进程就把服务器给干的动不了了。
要我说啊这个服务器就是菜(233333)。
3 for循环正确写法
for(int i=0;i!=cmds.size();++i) {
pid_t fpid; //fpid表示fork函数返回的值
fpid = fork();
if(fpid==0) {
TV st = getTime();
system(cmds[i].c_str());
TV et = getTime();
string costTimeStr = getCTS(st, et);
saveCmdTime(costTimeStr);
break;
} else {
int st;
int ret = wait(&st);
}
}