|
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; }
|