gpt4 book ai didi

c - fork多个子进程来运行其他程序

转载 作者:太空宇宙 更新时间:2023-11-04 07:25:34 25 4
gpt4 key购买 nike

我想从父程序(称为守护进程)启动带有 args 的测试程序的 5 个子进程(所有 5 个并行,不等待完成)。

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

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

//missing irrelevant part where argum is set

int status,i;
char cmd[512];
pid_t process_id = 0;
for (i=0; i<=5;i++)
{
process_id = fork();
if (process_id < 0)
{
printf("fork failed - %d!\n",i);
continue;
}
else if(process_id > 0) {
printf("process_id of child process %d \n", process_id);
}
else
{
sprintf(cmd,"./test %s",argum);
status = system(cmd);
exit(0);
}
}
return 0;
}

它启动了它们,但是当我运行 ps -aux 查看进程时,除了好的进程(如:./test [args])还有一些重复的进程,如:sh -c ./test [args]

我怎样才能摆脱以“sh -c”开头的那些?

最佳答案

不要从子级调用 system(),而是使用 exec*() 函数族的成员。

fork() 子进程调用 execXYZ() 会用传递给 execXYZ 的进程创建的新进程替换子进程()调用。

请注意,如果 execXYZ() 成功,它不会返回。


执行/bin/ls -alrt *.c的例子:

  • execl*() 系列的成员希望每个空格分隔的命令行选项作为单个参数。

    execl("/bin/ls", "ls", "-alrt", "*.c", (char*) 0);
    execlp("ls", "ls", "-alrt", "*.c", (char*) 0);
  • execv*() 系列的成员希望在将参数传递给 main() 的方式中每个空格分隔命令行选项:

    char * const argv[] = {
    "ls",
    "-alrt",
    "*.c",
    NULL,
    }

    execv("/bin/ls", argv);
    execvp("ls", argv);

exec*p() 家族成员利用环境变量PATH 来搜索要执行的二进制文件。因此对于此示例(对于系统命令 ls),确实需要指定路径。


在测试程序中:

#include <unistd.h>  
#include <stdio.h>

/* This should list the current working directory. */

int main(void)
{
execl("/bin/ls", "ls", "-al", "-rt", (char*) 0);
perror("execl() failed");
return 0;
}

关于c - fork多个子进程来运行其他程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18699280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com