[νλ‘μΈμ€μ μ€λ λ λ€μ€ μ²λ¦¬] νλ‘μΈμ€μ μ’ λ£μ μμ±, μ’ λ£ λκΈ°
<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
β νλ‘μΈμ€μ μ’ λ£
CμΈμ΄μ main() ν¨μλ int νμ λ°νκ° κ°λλ€
μ ν리μΌμ΄μ μ΄ μ’ λ£λλ©΄ μ€ν κ²°κ³Όλ₯Ό μ΄μ체μ μ λ°ννκ³ κ·Έ μ΄μ체μ λ κ·Έ νλ‘μΈμ€κ° μ΄μλ (open ν¨μ) νμΌ λμ€ν¬λ¦½ν°λ₯Ό λͺ¨λ λ«λλ€ (close ν¨μ)
νλ‘μΈμ€κ° μ°¨μ§νκ³ μλ€ λ©λͺ¨λ¦¬λ₯Ό κ°μ© λ©λͺ¨λ¦¬ ν (pool) λ‘ λ°ννκ² λλ€
μ ν리μΌμ΄μ μ μ’ λ£ν λ main() ν¨μμμ return μΌλ‘ λ°ννλ κ²½μ° μλμ μΌλ‘ exit() ν¨μκ° νΈμΆλλ€
exit() ν¨μλ νμΌ μ€νΈλ¦Όμ λν΄μλ λμΌν μμ μ μν, μ΄λ € μλ νμΌμ μ€νΈλ¦Όμ λν΄μλ fclose() ν¨μλ₯Ό νΈμΆν΄μ λ²νΌμ λ¨μ λ°μ΄ν°λ₯Ό λͺ¨λ μΆλ ₯ (flush) νλ€
β νλ‘μΈμ€μ μμ±
리λ μ€κ° μ²μ λΆν λλ©΄, 리λ μ€ μ»€λμ΄ μ§μ μ²μ νλ‘μΈμ€λ₯Ό μμ±ν ν λ€μ νλ‘μΈμ€λΆν°λ μ΄μ νλ‘μΈμ€λ₯Ό 볡μ¬ν΄μ μ¬μ©λλ€
fork() ν¨μλ νλ‘μΈμ€λ₯Ό μμ±νλλ°, νΈμΆν νλ‘μΈμ€μ λμΌν νλ‘μΈμ€λ₯Ό μλ‘ μμ±νμ¬ μλ‘μ΄ νλ‘μΈμ€ ID λ₯Ό ν λΉνλ€
μλ‘ μμ±ν νλ‘μΈμ€λ λΆλͺ¨ νλ‘μΈμ€λ₯Ό κ°μ§κ² λλλ°, μκΈ° μμ μ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€κ° λλ€
exec() ν¨μλ νλ‘μΈμ€μ 곡κ°μ μλ‘μ΄ νλ‘κ·Έλ¨μ λ°μ΄λ리 μ½λλ₯Ό μ¬λ €μ, νλ‘μΈμ€μ λ΄μ©μ μλ‘ λ³κ²½νμ§λ§ νλ‘μΈμ€ ID λ λ³κ²½λμ§ μλλ€
βοΈ μμ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ 곡κ°
컀λμ μμ νλ‘μΈμ€κ° μμ±λλ©΄ νλ‘μΈμ€ ν μ΄λΈμ λ±λ‘νκ³ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ€
νλ‘μΈμ€κ° μμ±λλ©΄, μμ νλ‘μΈμ€μ λΆλͺ¨ νλ‘μΈμ€λ ν μ€νΈ μμμ 곡μ νκ³ λ°μ΄ν°, ν, μ€ν μμμ 볡μ¬ν¨
fork() ν¨μλ₯Ό μνν νμ λ°λ‘ exec() ν¨μκ° νΈμΆλκΈ° λλ¬Έμ λλΆλΆμ μμ€ν μμ fork() ν¨μ μν μ λ°μ΄ν°, ν, μ€ν, μμμ λ°λ‘ 볡μ¬νμ§ μλλ€
μμ νλ‘μΈμ€μ λ΄μ©μ΄ λ³κ²½λ λ λλ¨Έμ§ μμμ 볡μ¬νλ λ°©λ² ν΅ν΄μ μ€ν μλλ₯Ό λμΌ μ μλλ°, μ΄λ₯Ό λ³ν μμ λ³΅μ¬ (Copy On-Write, COW) λΌκ³ νλ€
βοΈ fork()
μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλλ°, λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€κ° μμ±λλ€
λ°νκ°μΈ pid_t μ΄μ©ν΄μ ꡬλΆμ΄ λλλ°, λ°νλ PID κ° μμμ΄λ©΄ λΆλͺ¨ νλ‘μΈμ€! 0μ΄λ©΄ μμ νλ‘μΈμ€!
μ€νμ΄ μ€ν¨ν κ²½μ°μλ -1μ λ°ν, errno μ μλ¬ λ΄μ© μ μ₯ν¨
EAGAIN: μμ€ν μμ νμ©νλ μ΅λ νλ‘μΈμ€μ μ μ΄κ³Ό
ENOMEM: μλ‘μ΄ νλ‘μΈμ€λ₯Ό μν λ©λͺ¨λ¦¬μ μ€μ κ³΅κ° λΆμ‘±ν¨
μ€νμ΄ μ±κ³΅ν κ²½μ°μλ μμ±λ μμ νλ‘μΈμ€μ λΆλͺ¨ νλ‘μΈμ€ λͺ¨λ λμΌν νλ‘κ·Έλ¨ μ½λ κ°μ§
fork() ν¨μλ₯Ό νΈμΆνλ©΄ μ μ λ³μλΏλ§ μλλΌ μ΄λ¦° νμΌ λμ€ν¬λ¦½ν°λ ν¨κ» 곡μ λλ€
νΈμΆνκΈ° μ μ open() ν¨μλ₯Ό νΈμΆν ν λ€λ₯Έ νλ‘μΈμ€λ₯Ό μμ±νλ©΄ μ¬μ©μ ꡬ쑰μ νμΌ λμ€ν¬λ¦½ν° ν μ΄λΈμ΄ 볡μ¬λμ΄ κ°μ μ€νμ μ κ°μ§λ€
fork() ν¨μλ λΆλͺ¨ νλ‘μΈμ€μ text μμμ μμ νλ‘μΈμ€λ‘ 볡μ¬νλ€
exec() ν¨μλ₯Ό μννλ©΄ text μμμ λ€λ₯Έ νλ‘κ·Έλ¨μ λ°μ΄λλ¦¬λ‘ μ±μ°κΈ° λλ¬Έμ, fork() ν¨μ μν ν exec() ν¨μλ₯Ό λ°λ‘ νΈμΆνλ€λ©΄ λΆλͺ¨ νλ‘μΈμ€μ text μμμ 볡μ¬νλ μμ μ λΆνμνλ€
// fork() ν¨μλ‘ νλ‘μΈμ€λ₯Ό μμ±νμ
#include <stdio.h>
#include <unistd.h>
static int g_var = 1; /* data μμμ μ΄κΈ°νλ λ³μ */
char str[ ] = "PID";
int main(int argc, char **argv)
{
int var; /* stack μμμ μ§μ λ³μ */
pid_t pid;
var = 92;
if((pid = fork()) < 0) { /* fork( ) ν¨μμ μλ¬ μ μ²λ¦¬ */
perror("[ERROR] : fork()");
} else if(pid == 0) { /* μμ νλ‘μΈμ€μ λν μ²λ¦¬ */
g_var++; /* λ³μμ κ° λ³κ²½ */
var++;
printf("Parent %s from Child Process(%d) : %d\n",
str, getpid(), getppid());
} else { /* λΆλͺ¨ νλ‘μΈμ€μ λν μ²λ¦¬ */
printf("Child %s from Parent Process(%d) : %d\n", str, getpid(), pid);
sleep(1);
}
/* λ³μμ λ΄μ©μ μΆλ ₯ */
printf("pid = %d, Global var = %d, var = %d\n", getpid(), g_var, var);
return 0;
}
/*
μ μ λ³μμ μ§μ λ³μλ₯Ό ν κ° μμ±νκ³ , fork() ν¨μ μ΄μ©ν΄μ 2κ°μ νλ‘μΈμ€λ₯Ό μμ±νλ€
fork() ν¨μλ₯Ό μννλ©΄ νλ‘μΈμ€λ 2κ°μ νλ‘μΈμ€λ‘ λΆν λμ΄μ μ€νλλ€
pid_t μ λ°νκ°μΌλ‘ 0μ΄λ©΄ μμ, μμλ©΄ λΆλͺ¨ νλ‘μΈμ€μ΄λ€
λΆλͺ¨ νλ‘μΈμ€λ μμ νλ‘μΈμ€μ λΆλͺ¨ νλ‘μΈμ€ μμ μ pid λ₯Ό μΆλ ₯νλλ°, μμ νλ‘μΈμ€μ PID λ fork() ν¨μμμ λ°ννλ κ° μ΄μ©ν¨
λΆλͺ¨ νλ‘μΈμ€μμλ 1μ΄κ° μμ νλ‘μΈμ€μ μ’
λ£λ₯Ό κΈ°λ€λ¦° ν μμ λ³μλ€μ κ·Έλλ‘ μΆλ ₯ ν λΆλͺ¨ νλ‘μΈμ€λ μ’
λ£λλ€
λΆλͺ¨ νλ‘μΈμ€λ μμ νλ‘μΈμ€λ³΄λ€ λ¨Όμ μ’
λ£νλ©΄ μλλλ°, λΆλͺ¨ νλ‘μΈμ€κ° λ¨Όμ μ’
λ£λλ κ²½μ°μλ μμ νλ‘μΈμ€λ κ³ μ νλ‘μΈμ€κ° λλ€
μμ€ν
μμ μ£ΌκΈ°μ μΌλ‘ κ³ μ νλ‘μΈμ€λ₯Ό μ°Ύμμ init νλ‘μΈμ€μ μμμΌλ‘ ν¬ν¨μμΌμ€λ€
μμ νλ‘μΈμ€λ λ³μμ κ°λ€μ 1μ© μ¦κ°μν¨ ν λΆλͺ¨ νλ‘μΈμ€μ μμ μ pid λ₯Ό μΆλ ₯νλλ°, λΆλͺ¨ νλ‘μΈμ€μ PID ꡬνκΈ° μν΄ getppid() μ¬μ©νλ€
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o fork fork.c
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./fork
*/
gcc -o fork fork.c
./fork
βοΈ vfork()
So, vfork() ν¨μλ exec() ν¨μλ₯Ό ν΅ν΄μ μλ‘μ΄ νλ‘κ·Έλ¨μ μ€νμν¬ λͺ©μ μΌλ‘ μμ νλ‘μΈμ€λ₯Ό μμ±ν λ λΆλͺ¨ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ μμμ λͺ¨λ 볡μ¬νμ§ μλλ€
μμ νλ‘μΈμ€λ exec(), exit() ν¨μλ₯Ό νΈμΆν λκΉμ§ λΆλͺ¨ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ μμμμ μ€νλλ©°, λΆλͺ¨ νλ‘μΈμ€λ μ€νμ λ©μΆ°λ μμ νλ‘μΈμ€κ° νμ λ¨Όμ μ€νλλ κ²μ 보μ₯νλ€
// vfork() λ‘ νλ‘μΈμ€λ₯Ό μμ±ν΄λ³΄μ
#include <stdio.h>
#include <unistd.h>
static int g_var = 1; /* μ΄κΈ°νλ data μμμ μ μ λ³μ */
char str[ ] = "PID";
int main(int argc, char **argv)
{
int var; /* μ€ν(stack) μμμ μλ λ³μ */
pid_t pid;
var = 88;
if((pid = vfork()) < 0) { /* fork() ν¨μ νΈμΆ μλ¬ */
perror("vfork()");
} else if(pid == 0) { /* μμ νλ‘μΈμ€ */
g_var++; /* λ³μμ κ° λ³κ²½ */
var++;
printf("Parent %s from Child Process(%d) : %d\n",
str, getpid(), getppid());
printf("pid = %d, Global var = %d, var = %d\n", getpid(), g_var, var);
_exit(0);
} else { /* λΆλͺ¨ νλ‘μΈμ€ */
printf("Child %s from Parent Process(%d) : %d\n", str, getpid(), pid);
}
printf("pid = %d, Global var = %d, var = %d\n", getpid(), g_var, var);
return 0;
}
/*
vfork() ν¨μλ μμ νλ‘μΈμ€λ₯Ό μμ±νκ³ λΆλͺ¨ νλ‘μΈμ€λ λκΈ°νκ³ μκΈ° λλ¬Έμ
μμ λΆν° μΆλ ₯λκ³ , λΆλͺ¨ λ΄μ©μ΄ μΆλ ₯λλ€
μμ νλ‘μΈμ€μμ λ³κ²½ν μ μ λ³μμ μ§μ λ³μμ λ΄μ©μ΄ λͺ¨λ λ³κ²½λμ΄ μλ€
λ νλ‘μΈμ€κ° κ°μ 곡κ°μ μ¬μ©νκΈ° λλ¬Έμ fork() μ λ€λ₯΄κ² μμ νλ‘μΈμ€μ λ³κ²½μ΄ λΆλͺ¨μλ μν₯μ μ€λ€
μμ νλ‘μΈμ€λ _exit() ν¨μλ₯Ό ν΅ν΄μ μ’
λ£ν΄μΌ νλλ°, return λ¬ΈμΌλ‘ μ’
λ£λλ κ²½μ° νλ‘μΈλ€ μ¬μ΄μ 곡μ λ ν¨μμ
μ€νλ μμ λλ―λ‘ λΆλͺ¨ νλ‘μΈμ€μ μ’
λ£ μ μλ¬λ₯Ό μΆλ ₯νλ€
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ gcc -o vfork vfork.c
@gani0325 β /workspaces/IoT_Linux_RaspberryPi/Process_Signal (main) $ ./vfork
*/
gcc -o vfork vfork.c
./vfork
β μμ νλ‘μΈμ€μ μ’ λ£ λκΈ°: wait() μ waitpid() ν¨μ
μμ νλ‘μΈμ€λ€μ λΆλͺ¨ νλ‘μΈμ€λ€μ΄ κ΄λ¦¬ν΄μΌνλλ°, μμ νλ‘μΈμ€λ€μ΄ μ’ λ£λκΈ° μ μ λΆλͺ¨ νλ‘μΈμ€λ€μ΄ μ’ λ£λλ©΄ μλλ€
μμ νλ‘μΈμ€κ° μ’ λ£νλ©΄ λΆλͺ¨ νλ‘μΈμ€μκ² SIGCHLD μκ·Έλμ μ λ¬νμ¬ λκΈ° (block) μνλ₯Ό ν΄μ νλ€
μμ νλ‘μΈμ€λ νλ‘μΈμ€κ° μ’ λ£λ ν λΆλͺ¨ νλ‘μΈμ€λ μμ νλ‘μΈμ€μ μνλ₯Ό wait() λ waitpid() ν¨μ λ±μΌλ‘ μ’ λ£ μνμ λν λ°νκ°μ μ½κ³ μ΄μ κ΄λ ¨λ 리μμ€λ₯Ό ν΄μ νκΈ° μν΄μ λκΈ°νλ€
컀λμ΄ νλ‘μΈμ€μ νλ‘μΈμ€ ID, μ’ λ£ μν κ°, CPU μ¬μ© μκ° λ± μ 보λ₯Ό μ μ§νκ³ μκΈ° λλ¬Έμ μ΄λ₯Ό ν΄μ νμ§ μμΌλ©΄ μμ€ν μ λ©λͺ¨λ¦¬κ° λΆμ‘±ν΄μ§λ νμμ΄ λ°μνλ€
μμ νλ‘μΈμ€λ μ’ λ£νμ§λ§ λΆλͺ¨ νλ‘μΈμ€μ wait() λ±μ μ²λ¦¬κ° λλμ§ μμμ μ’ λ£κ° λμ΄ μμ΄λ μμ κ° λμ§ μκ³ λ¨μμλ νλ‘μΈμ€λ₯Ό μ’λΉ νλ‘μΈμ€λΌκ³ νλ€
init νλ‘μΈμ€λ μμ νλ‘μΈμ€κ° μ’ λ£λ λλ§λ€ wait() ν¨μλ₯Ό νΈμΆν΄μ νλ‘μΈμ€μ μ’λΉ μνλ₯Ό ν΄μ νλ€
wait() ν¨μλ λͺ¨λ μμ νλ‘μΈμ€κ° μ€νλκ³ μλ λμ λκΈ°(block) νκ³ μκ³ , μμ νλ‘μΈμ€κ° μ’ λ£νλ©΄ μ’ λ£ μν κ°κ³Ό ν¨κ» μ¦μ λ°νλλ€
wait() ν¨μλ λͺ¨λ μμ νλ‘μΈμ€λ€μ λκΈ°ν λ μ¬μ©νλλ°, μ¬λ¬ μμ νλ‘μΈμ€λ€μ΄ μλ κ²½μ°μ κ·Έμ€ νλλ§ μ’ λ£ν΄λ λ°νλλ€
waitpid() ν¨μλ νΉμ μμ νλ‘μΈμ€λ₯Ό μ§μ ν΄μ λκΈ°ν μ μλλ°, 첫 λ²μ§Έ μΈμ (pid) λ₯Ό μ΄μ©ν΄μ νΉμ νλ‘μΈμ€λ μ¬λ¬ κ·Έλ£Ή νλ‘μΈμ€λ€μ λκΈ°λ₯Ό μ§μ ν μ μλ€. μΈλ² μ§Έ μΈμλ‘ λ¨μ λκΈ°μ λ°©μ§λ μμ μ μ΄ μ§μμ μ΅μ μΌλ‘ μ€μ νλ€
β λ€λ₯Έ νλ‘κ·Έλ¨μ μ€ν: exec() ν¨μ
exec() ν¨μλ μ€ν νμΌμ μ°ΎμΌλ©΄ κΈ°κ³μ΄ μ½λμΈμ§ νμΈνκ³ , κΈ°κ³μ΄ μ½λμΈ κ²½μ°μλ μ§μ μ€ννκ³
κΈ°κ³μ΄ μ½λκ° μλ κ²½μ°μλ μ Έ μ€ν¬λ¦½νΈλ‘ μΈμν΄ "/bin/sh" μ μ€ννκ³ μ£Όμ΄μ§ μ€ν νμΌμ μ Έμ μΈμλ‘ ν΄μ μ Έ μ€ν¬λ¦½νΈλ₯Ό μννλ€
βοΈ system() ν¨μ
리λ μ€μμ μΈλΆ νλ‘κ·Έλ¨μ μ€νμν€κ³ μΆμ κ²½μ° μ¬μ©νλ€
fork(), exec(), waitpid() ν¨μλ‘ κ΅¬μ±λμ΄ μμΌλ©°
fork() μ€ν¨νκ±°λ waitpid() κ° EINTR μ΄μΈμ κ°μ λ°ννλ©΄, system() ν¨μλ errno μ κ°μ μ€μ νκ³ -1 λ°νν¨
exec() ν¨μκ° μ€ν¨ν κ²½μ°μλ μμ±ν νλ‘μΈμ€μ μ’ λ£ μν κ°μΌλ‘ 127μ λ°ννλ€
μΈ ν¨μκ° λͺ¨λ μ±κ³΅νλ©΄ waitpid λ‘ μ»μ΄λΈ μ Έ μ’ λ£ μν κ°μ λ°ννλ€
fork() ν¨μλ₯Ό μ΄μ©ν΄μ νλ‘μΈμ€λ₯Ό μμ±νκ³ execl() ν¨μλ₯Ό μ΄μ©ν΄μ μ¬μ©μκ° μ
λ ₯ν λͺ
λ Ήμ μννλ€
sh μ
Έ λͺ
λ Ήμ΄λ‘ μνν μ μλλ‘ /bin/sh μ μΈμλ‘ λͺ
λ Ήμ΄λ₯Ό μ
λ ₯νμκ³
λΆλͺ¨ νλ‘μΈμ€λ waitpid() ν¨μλ₯Ό μ΄μ©ν΄μ μμ νλ‘μΈμ€μ μνμ κΈ°λ€λ¦¬λλ‘ νλ€
main() ν¨μμ 3λ²μ§Έ μΈμλ‘ νμ¬ μ€μ λ νκ²½ λ³μλ€μ λͺ©λ‘μ κ°μ Έμ¬ μ μλ€
νκ²½ λ³μμ μ¬μ©μ μν΄ main() ν¨μμ 3λ²μ§Έ μΈμλ₯Ό μ¬μ©νμ§ μκ³ κ΄μ λ³μ environ μ μ¬μ©ν μ μλ€
νμ¬ μ€μ λ νκ²½ λ³μλ€μ΄ νλ©΄μ μΆλ ₯λκ³ , who λͺ
λ Ήμ΄μ κ²°κ³Όκ° μΆλ ₯λ ν nocommand λΌλ λͺ
λ Ήμ΄κ° μμΌλ―λ‘ μλ¬κ° μΆλ ₯λλ€
cal λͺ
λ Ήμ΄μ λν κ²°κ³Όκ° μΆλ ₯λλ€
// system() ν¨μλ₯Ό ꡬννλ©΄μ fork(), exec(), waitpid() ν¨μ μ¬μ©νκΈ°
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
int system(const char *cmd) /* fork(), exec(), waitpid() ν¨μλ₯Ό μ¬μ© */
{
pid_t pid;
int status;
if((pid = fork()) < 0) { /* fork( ) ν¨μ μν μ μλ¬κ° λ°μνμ λμ μ²λ¦¬ */
status = -1;
} else if(pid == 0) { /* μμ νλ‘μΈμ€μ μ²λ¦¬ */
execl("/bin/sh", "sh", "-c", cmd, (char *)0);
_exit(127); /* execl( ) ν¨μμ μλ¬ μ¬ν */
} else { /* λΆλͺ¨ νλ‘μΈμ€μ μ²λ¦¬ */
while(waitpid(pid, &status, 0) < 0) /* μμ νλ‘μΈμ€μ μ’
λ£ λκΈ° */
if(errno != EINTR) { /* waitpid( ) ν¨μμμ EINTRμ΄ μλ κ²½μ°μ μ²λ¦¬ */
status = -1;
break;
}
}
return status;
}
int main(int argc, char **argv, char **envp)
{
while(*envp) /* νκ²½ λ³μλ₯Ό μΆλ ₯νλ€. */
printf("%s\n", *envp++);
system("who"); /* who μ νΈλ¦¬ν° μν */
system("nocommand"); /* μ€λ₯μ¬νμ μν */
system("cal"); /* cal μ νΈλ¦¬ν° μν */
return 0;
}
/*
fork() ν¨μλ₯Ό μ΄μ©ν΄μ νλ‘μΈμ€λ₯Ό μμ±νκ³ execl() ν¨μλ₯Ό μ΄μ©ν΄μ μ¬μ©μκ° μ
λ ₯ν λͺ
λ Ήμ μννλ€
sh μ
Έ λͺ
λ Ήμ΄λ‘ μνν μ μλλ‘ /bin/sh μ μΈμλ‘ λͺ
λ Ήμ΄λ₯Ό μ
λ ₯νμκ³
λΆλͺ¨ νλ‘μΈμ€λ waitpid() ν¨μλ₯Ό μ΄μ©ν΄μ μμ νλ‘μΈμ€μ μνμ κΈ°λ€λ¦¬λλ‘ νλ€
main() ν¨μμ 3λ²μ§Έ μΈμλ‘ νμ¬ μ€μ λ νκ²½ λ³μλ€μ λͺ©λ‘μ κ°μ Έμ¬ μ μλ€
νκ²½ λ³μμ μ¬μ©μ μν΄ main() ν¨μμ 3λ²μ§Έ μΈμλ₯Ό μ¬μ©νμ§ μκ³ κ΄μ λ³μ environ μ μ¬μ©ν μ μλ€
νμ¬ μ€μ λ νκ²½ λ³μλ€μ΄ νλ©΄μ μΆλ ₯λκ³ , who λͺ
λ Ήμ΄μ κ²°κ³Όκ° μΆλ ₯λ ν nocommand λΌλ λͺ
λ Ήμ΄κ° μμΌλ―λ‘ μλ¬κ° μΆλ ₯λλ€
cal λͺ
λ Ήμ΄μ λν κ²°κ³Όκ° μΆλ ₯λλ€
gani@gani:~/raspi/Process_Signal $ gcc -o system system.c
gani@gani:~/raspi/Process_Signal $ ./system
*/
gcc -o system system.c
./system
βοΈ posix_spawn() ν¨μ
fork() & exec() μ μ¬μ©νλ κ²λ³΄λ€ posix_spawn() ν¨μλ₯Ό μ¬μ©νλ κ²μ κ°λ ₯ν κΆμ₯ν¨
system() ν¨μλ₯Ό posix_spawn() ν¨μλ‘ λ§λ€λ©΄ κ°λ¨νκ² μμ±ν μ μμ
posix_spawn() ν¨μμ 첫 λ²μ§Έ μΈμλ‘ fork() ν¨μμ κ°μ΄ νλ‘μΈμ€λ₯Ό ꡬλΆν μ μλ pid_t
λ λ²μ§Έ μΈμλ‘ exec() ν¨μμ κ°μ΄ μ€νν νλ‘κ·Έλ¨μ κ²½λ‘λ₯Ό λ£μ΄μ€λ€
μΈ λ²μ§Έ, λ€ λ²μ§Έ μΈμλ₯Ό μ΄μ©ν΄μ posix_spawn() ν¨μμ μμ±μ λ£λλ€ (κΈ°λ³Έκ°μΌλ‘ NULL)
λ€μ― λ²μ§Έ μΈμλ λ λ²μ§Έ μΈμλ‘ λ£μ΄μ μ€νν νλ‘κ·Έλ¨μμ μ¬μ©νλ μΈμ
λ§μ§λ§μΌλ‘λνκ²½ λ³μ
μ€ννλ©΄ fork() & exec() μ λμΌνκ² λμλλ€
posix_spawn() ν¨μμ μμ± λ±μ μ΄μ©νλ©΄ waitpid() ν¨μ μμ΄ λΉλκΈ°μ νλ‘κ·Έλλ°μ ν μ μλ€
// posix_spawan() ν¨μλ system() ν¨μμ²λΌ κ°λ¨ν νλ‘κ·Έλ¨μ μ€νν μ μμ
#include <stdio.h>
#include <sys/wait.h>
#include <spawn.h>
extern char **environ;
int system(char *cmd) /* posix_spawn() ν¨μλ₯Ό μ¬μ© */
{
pid_t pid;
int status;
char *argv[] = {"sh", "-c", cmd, NULL};
posix_spawn(&pid, "/bin/sh", NULL, NULL, argv, environ);
waitpid(pid, &status, 0);
return status;
}
int main(int argc, char **argv, char **envp)
{
while( *envp) /* νκ²½ λ³μλ₯Ό μΆλ ₯νλ€. */
printf( "%s\n", *envp++);
system("who"); /* who μ νΈλ¦¬ν° μν */
system("nocommand"); /* μ€λ₯μ¬νμ μν */
system("cal"); /* cal μ νΈλ¦¬ν° μν */
return 0;
}
/*
fork() & exec() μ μ¬μ©νλ κ²λ³΄λ€ posix_spawn() ν¨μλ₯Ό μ¬μ©νλ κ²μ κ°λ ₯ν κΆμ₯ν¨
system() ν¨μλ₯Ό posix_spawn() ν¨μλ‘ λ§λ€λ©΄ κ°λ¨νκ² μμ±ν μ μμ
posix_spawn() ν¨μμ 첫 λ²μ§Έ μΈμλ‘ fork() ν¨μμ κ°μ΄ νλ‘μΈμ€λ₯Ό ꡬλΆν μ μλ pid_t
λ λ²μ§Έ μΈμλ‘ exec() ν¨μμ κ°μ΄ μ€νν νλ‘κ·Έλ¨μ κ²½λ‘λ₯Ό λ£μ΄μ€λ€
μΈ λ²μ§Έ, λ€ λ²μ§Έ μΈμλ₯Ό μ΄μ©ν΄μ posix_spawn() ν¨μμ μμ±μ λ£λλ€ (κΈ°λ³Έκ°μΌλ‘ NULL)
λ€μ― λ²μ§Έ μΈμλ λ λ²μ§Έ μΈμλ‘ λ£μ΄μ μ€νν νλ‘κ·Έλ¨μμ μ¬μ©νλ μΈμ
λ§μ§λ§μΌλ‘λνκ²½ λ³μ
μ€ννλ©΄ FORK() & exec() μ λμΌνκ² λμλλ€
posix_spawn() ν¨μμ μμ± λ±μ μ΄μ©νλ©΄ waitpid() ν¨μ μμ΄ λΉλκΈ°μ νλ‘κ·Έλλ°μ ν μ μλ€
gani@gani:~/raspi/Process_Signal $ gcc -o spawn spawn.c
gani@gani:~/raspi/Process_Signal $ ./spawn
*/
gcc -o spawn spawn.c
./spawn