linux 用C语言管理进程

vfh0ocws  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(180)

我试图测试如何创建和管理进程与程序什么应该创建一个进程和执行一个命令2次(每次执行不同的命令)。
我想做的就是:

  • 创建新PID
  • 打印PID
  • 执行命令
  • 退出

奇怪的是,当我执行一个命令时,它工作正常,但是当我执行两次例程时,第二个命令也被执行了两次。这意味着执行了3个命令。
下面是我的代码:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>


void launch_command(char command[]) {
  pid_t pid;

  pid = fork();
  if(pid==0)

  {
    printf("Creating process %d from %d\n", getpid(),getppid());
    system(command);
    exit(0);

  }
  else {
    if ((pid = fork()) == -1)
       perror("Error while creating a new process");
  }

}

int main () {
  printf("Root process: %d\n",getpid());

  launch_command("/bin/ls -l");
  while(wait(NULL) >= 0);

  launch_command("/bin/date");
  while(wait(NULL) >= 0);

  return 0;

}

输出:

$ ./a.out 
Root process: 8924
Creating process 8925 from 8924
Creating process 8928 from 8926
Sun 13 Nov 2022 23:54:51 EST
total 128
-rwxr-xr-x  1 gg  staff  49784 13 Nov 23:54 a.out
-rw-r--r--  1 gg  staff   3499 11 Nov 10:59 create_process.c
Creating process 8931 from 8924
Sun 13 Nov 2022 23:54:51 EST

有人能解释一下我的这种行为吗?
所需结果应为:

$ ./a.out 
Root process: 8924
Creating process 8925 from 8924
total 128
-rwxr-xr-x  1 gg  staff  49784 13 Nov 23:54 a.out
-rw-r--r--  1 gg  staff   3499 11 Nov 10:59 create_process.c
Creating process 8931 from 8924
Sun 13 Nov 2022 23:54:51 EST
ztigrdn8

ztigrdn81#

正如注解中指出的,对fork的第二次调用创建了太多的进程。
在第一次调用launch_command返回后,会有一个父进程和一个新创建的子进程,它们都将调用第二个launch_command函数,产生另外两个调用system的进程,然后每个进程都产生一个额外的进程,这些进程也会从函数返回。
总共将有四个进程执行第二个while循环。
删除第二个fork调用,并再次使用相同的pid值来检查故障。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void launch_command(const char *command)
{
    pid_t pid = fork();

    if (0 == pid) {
        printf("Creating process %d from %d\n", getpid(), getppid());
        system(command);
        exit(EXIT_SUCCESS);
    } else if (-1 == pid) {
        perror("Error while creating a new process");
    }

    while (wait(NULL) >= 0);
}

int main(void)
{
    printf("Root process: %d\n", getpid());

    launch_command("/bin/ls -l");
    launch_command("/bin/date");
}

相关问题