[C] huiswerk, progie hetzelfde als cd

Pagina: 1
Acties:

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Opdracht luidt:
[letterlijk overtype mode]
Maak een eigenprogramma dat precies hetzelfde doet als cd, wildvards etc mogen wegelaten worden. Waarom is dit een shell-builtin ?.
[/letterlijk overtype mode]

ok dit heb ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<unistd.h>

int main(int argc,char **argv)
{
      if (argc < 2)
      {
            printf("Usage: %s<pathname>\n",argv[0]);
            exit(1);
      }
      if (chdir(argv[1]) != 0)
      {
            printf("Error in chdir\n");
            exit(1);
      }
}

nu ben ik natuurlijk ook niet op mijn achterhoofd gevallen... deze chdir veranderd alleen de current dir van het huidige proces. Dat moet dus het proces er boven zijn.
Het hoofdstuk gaat over systems calls. Iemand bruikbare hints? Google en Search heb ik al afgelopen.

Steun Elkaar, Kopieer Nederlands Waar!


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
system("cd ...") ofzo ? :+

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
nice :)

ik denk dat dat niet mag, maar ik zal het wel als --extramakelijk er bij zetten :)

Steun Elkaar, Kopieer Nederlands Waar!


Verwijderd

Grappig hoor, ik ben aardig thuis in DOS etc... maar ik wist niet dat je wildcards kon gebruiken voor het 'cd' commando :)

Komt dat even goed uit, nooit meer lange directorynamen typen in een consolevenster *D

---
Microsoft Windows 2000 [versie 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:\>cd pro*

C:\Program Files>cd \win*

C:\WINNT>
---

Het zal wel niet werken in de goedkope zuig-versies van Windows... (dat zijn dus Windows 95/98 en Me :r)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14-09 13:13
Ik vrees dat een aanroep van system() je niet gaat helpen. Dan wordt nog steeds alleen de working directory van het huidige proces (en dus NIET het proces dat het programma aanriep) verandert.

Waarschijnlijk is dat wel het antwoord op de vraag, waarom cd normaliter een built-in commando is: het is niet zo eenvoudig om de working directory van een ander proces te wijzigen.

Ik zou je helaas niet kunnen vertellen hoe het wel zou moeten (ALS hier al een ANSI-C methode voor is; het is waarschijnlijk platformafhankelijk).

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Grappig hoor, ik ben aardig thuis in DOS etc... maar ik wist niet dat je wildcards kon gebruiken voor het 'cd' commando
ik vond weggelaten toch een mooiere fout ;)

Ja de geweldige reader heet:
C coding in the Linux enviroment
(HRO Rotterdam)

Nee ik begrijp ook wel dat je het huidige proces wijzigd... Maar misschien met een systemcall ofzo dat je dan de dir van de parent kan wijzigen. Het gaat dus om Linux.

Steun Elkaar, Kopieer Nederlands Waar!


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Maak een programma dat de directory structuur van je eigen home directory uitleest en deze op het scherm print

Dan denk je natuurlijk... we gaan een directory fysiek uitlezen en we gaan ls letterlijk implementeren... maar nee... de schrijver van de reader brengt zich er ook makkelijk van af dus ik meestal niet...
code:
1
2
3
4
5
6
#include<stdio.h>

int main()
{
      system("ls -als ~");
}

Als iemand een directe implementatie van ls tot zijn beschikking heeft hoor ik het graag.

Steun Elkaar, Kopieer Nederlands Waar!


  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Wat een belachelijke opdracht! Fout boekje heb je daar.

Verwijderd

showoff mode
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

void cd( char *, FILE * );

int main( int argc, char *argv[] ) {
    if( argc >= 2 ) {
        printf( "Parameter given: %s\n", argv[ 1 ] );
        cd( argv[ 1 ], stdout );
    }
    else {
        printf( "No parameter given\n" );
        cd( NULL, stdout );
    }
    return 0;
}

void cd( char *dir, FILE * output ) {
    char old[ BUFSIZ ];
    int n;
    
    getcwd( old, BUFSIZ );
    
    if( dir == NULL )
        n = chdir( getenv( "HOME" ) );
    else
        n = chdir( dir );
    
    if( n == 0 ) {
        fprintf( output, "Working directory gewijzigd van: %s\n", old );
        getcwd( old, BUFSIZ );
        fprintf( output, "                   in: %s\n", old );
    }
    else
        fprintf( output, "%s\n", strerror( n ) );
}

Verwijderd

nog meer de bikkel uithangen :)

ls.c
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>

void ls( char *, FILE * );

int main( void ) {
    ls( NULL, stdout );
    return 0;
}

void ls( char *dir, FILE * output ) {
    struct dirent *dp;
    register DIR *dirp;
    
    if( dir == NULL || !strcmp( dir, "" ) )
        dir = ".";
    if( !strcmp( dir, "~" ) )
        dir = getenv( "HOME" );
    
    if( !( dirp = opendir( dir ) ) ) {
        fprintf( output, "ls: can't read directory\n" );
        return;
    }
    while( ( dp = readdir( dirp ) ) != NULL )
        fprintf( output, "%20s %8ld\n", dp->d_name, dp->d_ino );
}

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

* SchizoDuckie graaft ff in z'n MSDOS 6.0 ASM source >:)

Stop uploading passwords to Github!


Verwijderd

ik heb ook een shell :)

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
;***    ChangeDir - change directory on target drive
;
;   ENTRY   FCB contains drive #
;       DS:DX = ptr to ASCIIZ string w/o drive specifier
;
;   EXIT    Changed current directory on drive
;
;       If error,
;       CY = set
;       DOS Get Extended Error call will get error
;
;   USED    AX,DX,SI,DI
;
;   EFFECTS
;
;     DirBuf is used to build "d:string".

ChangeDir   proc

    mov di,offset TRANGROUP:DirBuf
    call    GetDriveLtr ; AX = "d:"
    stosw           ; put drive specifier in buffer
    mov si,dx       ; SI = ptr to argument string
cdLoop:
    lodsb
    stosb           ; move byte to buffer
    or  al,al
    jne cdLoop      ; continue until null transferred

    mov dx,offset TRANGROUP:DirBuf  ; DX = ptr to "d:string"
    mov ah,CHDIR
    int 21h             ; change directory
    ret                 ; return what CHDIR returns

ChangeDir   endp

O-)

lachen functienamen kom je tegen in die source :D
code:
1
2
3
4
5
6
7
; DOTDOTHARDWAY - change dir to the previous directory using '..'
;
; called by -
;
; inputs - parse string '..'
;
; outputs - new default directory

:D

Stop uploading passwords to Github!


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Thanx guys ik houd ook ff een credits.c bij :)
code:
1
2
3
4
int main(int argc,char **argv) {
      ls( argv[1], stdout );
      return 0;
}


code:
1
2
3
4
5
6
7
8
9
10
11
12
[root@skinkie 10.1.3]# ./credits
Skinkie thanx:
marcusk
Jerome81
Soultaker
Sponz

flader

papa_eend

[root@skinkie 10.1.3]#

Steun Elkaar, Kopieer Nederlands Waar!

Pagina: 1