ok, this is all of my code, im working in ubuntu and compiling by writing "gcc -o 23 23.c" in the shell. i dont get any warnings but i dont know how to turn up the warning lvl.
thanks for helping me!
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 70
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
int main()
{
char *inputString; /*strängen som användaren matar in*/
inputString = malloc(MAXSIZE);
int pid;
char word2[20] = {"exit"}; /*för att kolla om man matade in kommandot exit*/
char word1[20] = {"cd"}; /*för att kolla om man matade in kommandot cd*/
int i = 0;
int status;
int x = 1;
int count; /*används för att hacka upp strängen som användaren matar in*/
char * argv[5];
int return_value; /*returvärde för systemanrop*/
char * home_d = malloc(MAXSIZE); /*hemkatalogen*/
char * work_d = getenv("HOME"); /*arbetskatalogen*/
char * endcheck; /*Variabel för att få reda på adress för möjligt &-tecken som anger om det är en bakgrundsprocess*/
int bgpro; /*sätts till 1 om det är en bakgrundsprocess (annars 0)*/
struct timeval tv1, tv2; /*gettimeofday, så att man kan så hur länge en process har jobbat*/
int time;
home_d = strcpy(home_d, work_d); /*sparar home directory så att den ej ändras när man ändrar working directory*/
return_value = chdir(work_d); /*börjar med att gå till home_d*/
if(return_value==-1){
perror("Error in changing to home directory");} /*om det inte funkade*/
/*sigignore(SIGINT);*/ /*så att man ej kan avsluta med det klassiska control+c*/
pid = 0;
while (1){
bgpro = 1;
printf("%s>",work_d);
printf("$ ");
fgets(inputString, MAXSIZE, stdin);
int len = strlen(inputString);
if (inputString[len-1] == '\n') {
inputString[len-1] = '\0';
}
/*hacka upp strängen*/
argv[0] = (char *)strtok (inputString," \n"); /*det första värdet i listan av parametrar*/
count = 0; /*en variabel som räknar antalet...*/
/*WHAT IS WRONG WITH THIS ONE???*/
if(pid = waitpid(-1, &status, WNOHANG) > 0){
if (WIFEXITED(status)){
printf("bakgrundsprocess med pid: %i har avslutats!\n", pid);
}
}
/*hacka upp strängen forts...*/
while (argv[count] != NULL){ /*hackar upp strängen*/
count++;
argv[count] = (char *)strtok (NULL, " \n");
}
argv[count] = 0; /*Den sista parametern blir noll för att signalera att listan är slut*/
if (argv[0] == NULL){ /*om man inte skriver något så startar whileloopen om igen*/
continue;
}
/* exit */
if(strcmp(argv[0],word2) == 0){
printf("exiting\n");
exit(0);
}
/* cd */
else if(strcmp(argv[0],word1) == 0){
return_value = chdir(argv[1]); /*byter dir*/
if (return_value==0){ /*om det gick bra*/
if (strcmp(argv[1],"..") == 0){
printf("du backar ett steg\n");
endcheck = (char *) strrchr(work_d,'/');
*endcheck = '\0';
}
else {
printf("du vill till: %s\n", argv[1]);
work_d = strcat(work_d,"/");
work_d = strcat(work_d,argv[1]);
}
}
else{
/*om man angett en ogiltig sökväg*/
printf("Mappen finns inte eller så har du stavat fel.\n");
return_value = chdir(home_d);
work_d = strcpy(work_d,home_d);
}
}
/*skapar en barnprocess*/
else{
endcheck = (char *) strrchr(argv[0],'&');
if (endcheck==NULL){
bgpro = 0;
}
else{
bgpro = 1;
*endcheck='\0';
}
pid = fork();
if ( pid == 0 ){
/* child-process code */
sleep(5);
return_value = execvp(argv[0], argv);
printf("har gjort execvp/barnet\n");
if(return_value == -1){
printf("Kommandot finns ej\n");
}
exit(0);
}
else if ( pid > 0){
/* parent-process code */
if (bgpro==0){
printf("skapar en förgrundsprocess med pid: %i\n", pid);
return_value = gettimeofday(&tv1, NULL);
if( -1 == return_value ){ /* felkontroll */
perror( "gettimeofday() misslyckades" );
exit( 1 );
}
waitpid(-1, &status, 0);
return_value = gettimeofday(&tv2, NULL);
if( -1 == return_value ){ /* felkontroll */
perror( "gettimeofday() misslyckades" );
exit( 1 );
}
time = tv2.tv_usec - tv1.tv_usec;
printf("Processen med pid: %i är nu död, den levde i %d microsekunder.\n", pid,time);
}
else{
printf("skapar en bakgrundsprocess med pid: %i\n", pid);
}
}
else /* if (pid < 0) */
{ /* SYSTEM ERROR */}
}
}
return 0;
}
/*
Frågor:
- statistikutskrifter är vilka processer som terminerats med processid och hur länge de har arbetat.
plan 8 c hissen 2 svata brevlådor, elektronik
*/