int
yorumla_ve_calistir (const char *komut, const char **secenekler)
{
wordexp_t sonuc;
pid_t pid
int durum, i;
/* Çalıştırılacak komut için dizgeyi yorumlayalım. */
switch (wordexp (komut, &sonuc, 0))
{
case 0: /* Başarılı. */
break;
case WRDE_NOSPACE:
/* WRDE_NOSPACE hatası varsa, sonuç kısmende olsa
ayrılmıştır. Onu serbest bırakalım. */
wordfree (&sonuc);
default: /* Bazı başka hatalar. */
return -1;
}
/* Argümanları elde etmek için dizgeyi yorumlayalım. */
for (i = 0; secenekler[i] != NULL; i++)
{
if (wordexp (secenekler[i], &sonuc, WRDE_APPEND))
{
wordfree (&sonuc);
return -1;
}
}
pid = fork ();
if (pid == 0)
{
/* Burada bir alt süreç oluşturup komutu çalıştırıyoruz. */
execv (sonuc.we_wordv[0], sonuc.we_wordv);
exit (EXIT_FAILURE);
}
else if (pid < 0)
/* Çatallama başarısız oldu, durumu raporlayalım. */
durum = -1;
else
/* Bu üst süreç, alt sürecin bitmesini bekleyecek. */
if (waitpid (pid, &status, 0) != pid)
durum = -1;
wordfree (&sonuc);
return durum;
}