Using C language to use system calls


 
Thread Tools Search this Thread
Homework and Emergencies Homework & Coursework Questions Using C language to use system calls
# 1  
Old 11-21-2012
Using C language to use system calls

I need to write a C program (not a C++ program) that allows some tasks to be preformed automatically from a menu-driven interface. Automate the following tasks:
1. Rename a file
2. Delete a file or a directory
3. Output Process Information
4. Execute “mode 644 ls -l”
5. Exit

I need to know what steps should I follow to achieve the result. is it possible to ask the user to enter all the names and commands in 1 line or I should ask him one by one.
thank you

Code:
#include <stdio.h>
#include <fcntl.h>
#include <sys/errno.h>

int main (void) 
{
	int ch;
	char oldfn;
	char newfn;
	
	printf("\tMenu:\n");
	printf("\t1: Rename a file\n");
	printf("\t2: Delete a file or a directory\n");
	printf("\t3: Output Process Information\n");
	printf("\t4: Execute \"mode 644 ls -l\"\n");
	printf("\t5: Exit\n");
	printf("\t Enter your choice: \n");
	scanf("%d",&ch); 
	do
	{
		switch (ch)
		{
			case 1:printf("Enter the name of file and the new name :\n");
			printf("old file name: ");
			scanf("%s",&oldfn);
			printf("new file name: ");
			scanf("%s",&newfn);
			if ( rename(const char *oldfn, const char *newfn) == 0  )
			{
				printf("file is renamed");
			}
			break;
			case 2:printf("case 2\n");
			break;
			case 3:printf("case 3\n");
			break;
			case 4:printf("case 4\n");
			break;
			case 5:printf("exit\n");
			break;
			default:printf("Enter a number between 1-5\n");
			exit(0);
		}
		scanf("%d",&ch);
		
	}
	while ((ch>=1)||(ch<=5));
		
}

Langara college, Vancouver, Canada - Miss Hengame Hamavand - CPSC 1280
# 2  
Old 11-21-2012
It's possible to do it either way. Line-by-line is probably easier.

Your using scanf incorrectly every time you use it. You can't store a string in a char, since a string is a char array, and you shouldn't be using scanf to read raw data. Read lines then feed them into sscanf, or your code may get stuck in infinite loops whenever the user types something wrong.

I'd do this:

Code:
while(1)
{
        char buf[512];
        int selection;
        if(fgets(buf, 512, stdin) == NULL) break; // Read line, quit on error
        // Convert line into number
        if(sscanf(buf, "%d", &selection) != 1)
        {
                fprintf(stderr, "you did not type a number\n");
                continue;
        }

        switch(selection)
        {
...
        }
}

Also, you cannot store an entire string inside a single character. You'll need to feed sscanf an array for the filenames. Something like this:

Code:
char fname[512];
printf("Please enter a filename:\n");
// Read a line
fgets(fname, 512, stdin);
// chop the newline off the end of the line
for(n=0; fname[n]; n++) if(fname[n] == '\n') fname[n]='\0';

System calls you'll need are unlink to remove files, open to read or create files, read to read from files, write to write to files, and close to close file descriptors once you're done.

Include files you'll need for all those are

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 11-21-2012
How should I implement this code inside the c script by using execl function?

Code:
find . Maxdepth 1 -perm 0644

# 4  
Old 11-21-2012
That is just like writing a script, not calling system calls

find is based on the nftw() call and uses stat semantics - it returns among other things a struct stat.

To answer your question--
You should consider system(). It calls execl for you and then calls waitpid.

Code:
system("find . maxdepth 1 -perm 0644 ");

The reason to call syscalls directly in C instead of using execl() is to eliminate process creation which has a lot of overhead that you have in a shell script. system() and execl() are doing nothing you cannot do in a shell script in this case.
# 5  
Old 11-22-2012
Problem is I am not supposed to use system

---------- Post updated 11-22-12 at 12:38 AM ---------- Previous update was 11-21-12 at 10:51 PM ----------

Code:
execl("/usr/bin/find","find . -maxdepth 1 -perm 644",(char *)NULL);

it doesnt work properly. do you know what is the problem?

it doesnt look for files in the current directory and list all the files in the hard disk with permisoon 644
# 6  
Old 11-22-2012
Quote:
Originally Posted by femchi
Code:
execl("/usr/bin/find","find . -maxdepth 1 -perm 644",(char *)NULL);

it doesnt work properly. do you know what is the problem?
Each argument to the executable should be a different argument to execl. Give the execl man page a closer read.

Regards,
Alister
This User Gave Thanks to alister For This Post:
# 7  
Old 11-22-2012
It really looks to me like you are expected to use system calls like chmod(), unlink(), and
nftw() or readdir(). Embedding shell commands does not appear (to me) to be what is expected.

When you delete a directory, you have to delete all the files in the directory first. Then unlink the directory itself. Exactly what
Code:
rm -R ./directory_name

does
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

System calls and C language low-level qualities???

Hi friends, I hope everyone is fine and doing well. I queried in my previous thread about the low-level qualities of C/C++ languages.I really thank you people for explaining, it was really helpful. One more ambiquity that I have in my mind is regarding the unix system calls like open, creat,... (1 Reply)
Discussion started by: gabam
1 Replies

2. Programming

Are system calls in c language only????

Hi friends, I have three questions. 1) What are system calls? 2) Is it necessary that system calls be in c language (in unix operating system)? 3) Importance of c language when programming in unix environment??? Looking forward to your wonderful replies! ... (2 Replies)
Discussion started by: gabam
2 Replies

3. UNIX for Dummies Questions & Answers

system calls in C

Hello, how would i be able to call ps in C programming? thanks, ---------- Post updated at 01:39 AM ---------- Previous update was at 01:31 AM ---------- here's the complete system call, ps -o pid -p %d, getpit() (2 Replies)
Discussion started by: l flipboi l
2 Replies

4. UNIX for Dummies Questions & Answers

About system calls.

Hi all, I am new here . I want to know about system call in detail. As system calls are also function .How system identifies it.:) (2 Replies)
Discussion started by: vishwasrao
2 Replies

5. BSD

system calls

what is the functions and relationship between fork,exec,wait system calls as i am a beginer just want the fundamentals. (1 Reply)
Discussion started by: sangramdas
1 Replies

6. Programming

System calls

why user is not able to switch from user to kernel mode by writing the function whose code is identical to system call. (1 Reply)
Discussion started by: joshighanshyam
1 Replies

7. UNIX Desktop Questions & Answers

Using system calls

Hi, I'm new to UNIX system calls. Can someone share your knowledge as to how exactly system calls should be executed? Can they be typed like commands such as mkdir on the terminal itself? Also, are there any websites which will show me an example of the output to expect when a system call like... (1 Reply)
Discussion started by: ilavenil
1 Replies

8. Solaris

System calls ?

where can i find the differences in System calls between solaris and aix? also is it possible to find a comprehensive list of them? (1 Reply)
Discussion started by: TECHRAMESH
1 Replies

9. UNIX for Dummies Questions & Answers

System calls?

open, creat, read, write, lseek and close Are they all primitive? :confused: *Another Question: is there a different between a system call, and an i/o system call? (2 Replies)
Discussion started by: PlunderBunny
2 Replies

10. UNIX for Dummies Questions & Answers

System calls for cp and mv

Which system calls are made for operations cp and mv (2 Replies)
Discussion started by: gaurava99
2 Replies
Login or Register to Ask a Question