how to use correctly fork() and exec()
One problem is that
if (process = 0){
should read
if (process == 0){
Otherwise you're assigning zero to process
and only calling execl
if result
is non-zero (i.e. never).
Also, you're trying to exec something called process.c
. There's no doubt that one could have an executable called process.c
. However, conventionally names ending in .c
are given to C source code files. If process.c
is indeed a C file, you need to compile and link it first.
Once you've built the executable, you need to either place it somewhere on $PATH
or specify its full path to execle()
. In many Unix environments placing it in the current directory won't be enough.
Finally, it's unclear what n
is in the execle()
call, but the name hints at a numeric variable. You need to make sure that it's a string and not, for example, an integer.
Sicioldr
Updated on October 01, 2020Comments
-
Sicioldr over 3 years
I have this code;
pid_t process; process = fork(); if (process < 0){ //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0){ //i try here the execl execl ("process.c", "process" , n, NULL); } else { wait(NULL); }
I don't know if this use of
fork()
andexec()
combined is correct. When I try to run the program from the bash I do not receive any result, so I thought it could be a problem in this part of code.
Thanks. -
NPE over 12 years@Sorcipuppolo: You don't need to link it to your code, you just need to produce an executable. The compiler often calls the linker by default. E.g. with gcc you simply run
gcc -o process process.c
and you'll get an executable calledprocess
. -
Sicioldr over 12 yearsI made a makefile in which i compile all my functions, i have an executable called 'process'. But i don't know if it is enough. Is it possibile to pass numeric arguments in the ececl without a cast?
-
NPE over 12 years@Sorcipuppolo: A cast won't do you any good as it won't allocate memory for the string... you have to convert everything to strings.
-
Duck over 12 yearsexecl ("/path/process", "/path/process", "5", NULL);
-
Sicioldr over 12 years@aix: But what if i need to pass a numeric argument? (Thanks a lot anyway for the help)
-
Duck over 12 yearsJust sprintf() your numeric to a string and use a pointer to the string. You are setting up the command line for the exec-ed program. All program arguments are strings.
-
Sicioldr over 12 years@Duck: that's true, so i'll try to pass strings instead of integers and the path of my executable file, thanks
-
alk over 10 yearsAs the child writes to
n
aftervfork()
the process runs into undefined behaviour. Usefork()
if modify any variables beforeexec*()
ing.