创建一个从命令行获取参数arg1,arg2,...,argn的父进程。 arg1是源C的名称,arg2是源自compile arg1的可执行文件的名称,arg3,...,argn是要启动的参数。
父进程编译arg1并创建可执行文件arg2,之后将其运行到子进程中。
我尝试使用一些示例来解决问题,但我并不是真的理解它们,所以程序无效。我真的需要一些帮助...
#include<unistd.h>
#include<stdio.h>
#include<sys/wait.h>
#include<string.h>
int main(int argc, char* argv[]){
char com[200];
int p;
p=fork();
strcpy(com,"gcc -o prog.c");
strcat(com,argv[1]);
if(p==0){
if(WEXITSTATUS(system(com))==0)
execl("./prog.c","./prog.c",argv[3],argv[4],argv[5],NULL);
}
wait(0);
exit(0);
return 0;
}
我想要使用的C程序,从两个文件中读取一些输入数据并将数据存储到另一个文件中。
答案 0 :(得分:1)
此代码或多或少地执行您所说的程序应该执行的操作。特别是,它使用argv[2]
作为程序名称。它使用snprintf()
来避免长参数溢出(但不验证它没有溢出)。它打印各种状态消息 - 部分作为调试辅助,部分是为了给程序的各个部分赋予意义。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int p;
if (argc != 6)
{
fprintf(stderr, "Usage: %s source program file1 file2 file3\n", argv[0]);
return(1);
}
if ((p = fork()) == 0)
{
char com[200];
snprintf(com, sizeof(com), "gcc -o %s %s", argv[2], argv[1]);
if (system(com) == 0)
{
printf("Compilation of %s successful\n", argv[2]);
fflush(0);
execl(argv[2], argv[2], argv[3], argv[4], argv[5], (char *)NULL);
fprintf(stderr, "Failed to execute %s\n", argv[2]);
return(1);
}
fprintf(stderr, "Compilation of %s from %s failed\n", argv[2], argv[1]);
return(1);
}
int status;
wait(&status);
printf("Compilation and execution of %s yielded status %d\n",
argv[2], WEXITSTATUS(status));
return 0;
}
当此文件命名为gc.c
并编译为gc
时,可以将其作为:
$ ./gc gc.c ./gc2 gc.c gc.c gc.c
Compilation of ./gc2 successful
Usage: ./gc2 source program file1 file2 file3
Compilation and execution of ./gc2 yielded status 1
$
来自gc2
的使用消息是正确的;该程序需要6个参数,而不是程序给出的4个参数。
答案 1 :(得分:0)
您应该查看exec
的手册,它将告诉您如何运行exec来分叉另一个根据规范运行的进程。此代码可以帮助您将变量传递给子进程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int main()
{
/*Spawn a child to run the program.*/
pid_t pid=fork();
if (pid==0) { /* child process */
static char *argv[]={"echo","Foo is my name.",NULL};
execv("/bin/echo",argv);
exit(127); /* only if execv fails */
}
else { /* pid!=0; parent process */
waitpid(pid,0,0); /* wait for child to exit */
}
return 0;
}