Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rdemeter
GitHub Repository: rdemeter/so
Path: blob/master/lab3/my_system.c
221 views
1
#include <sys/types.h>
2
#include <sys/wait.h>
3
#include <unistd.h>
4
#include <stdlib.h>
5
6
int my_system(const char *command)
7
{
8
int pid, status;
9
10
switch ((pid=fork()))
11
{
12
case -1:
13
//error forking return -1;
14
case 0:
15
{
16
const char *argv[] = {"/bin/bash", "-c", command, NULL};
17
execv("/bin/bash", (char *const *)argv);
18
/* exec se poate întoarce doar cu cod de eroare (de ex. când
19
nu se găseste fisierul de executat - în cazul nostru
20
/bin/bash. În caz de eroare, terminăm procesul copil */
21
exit(-1);
22
}
23
}
24
25
//doar procesul părinte ajunge aici, si doar dacă fork() s-a terminat cu succes
26
waitpid(pid, &status, 0);
27
28
// obtinem codul de eroare cu care s-a terminat copilul
29
if (WIFEXITED(status))
30
printf("Child %d terminated normally, with code %d\n", pid, WEXITSTATUS(status));
31
32
return status;
33
}
34
35
int main()
36
{
37
my_system("ls");
38
return 0;
39
}
40
41
42