Fourth FAQ

for

Project 2 -- fork, exec, and wait

Q. One more question, with the execlp command, would the following be the correct way to call gimp, cp, ls...etc. :

execlp ("gimp", "gimp", filename, (char *)
0);
would this work to call gimp and if not, what is wrong?

A. This is the correct syntax for using execlp and will work if gimp is in the user's path and filename refers to a file on the filesystem that gimp can read and the user has permission to access. (If filename doesn't refer to such a file, gimp will still run but will give an error message saying that no such file exists.)

For such simple questions about syntax, you are probably better off writing simple pieces of code to test things out, rather than sending your question in email and waiting for a reply. For example, the code to test your question above would (assuming you have a jpeg file named "flower.jpg") simply be:

#include 

int main(void){
    char * filename = "flower.jpg";

    execlp ("gimp", "gimp", filename, (char *)0);
}

Pretty simple, isn't it? Because it is so simple, you can concentrate on the part you don't understand (execlp) without having to worry about the rest of the project. If this didn't work, you could easily add some printing statements to test error conditions.


Q. i don t understand why everything that is after the execl command in my code is not executed :

execl("/bin/ls","ls","-l",(char *)0);

printf("please enter the name of the picture ");
scanf("%s",name);

A. Because execl is succeeding. Remember what we talked about in class for exec family system calls -- they are called once and (if they succeed) they never return. We stressed how this was very different from most other functions or system calls.

Take your call to the printf function, for example. It is a very ordinary function call, in that it is called once and (if it succeeds) returns once. What this means is that if you are following through the control flow of your code, you can ignore how printf does its job -- you simply need to know that it is called with some parameters, does something, then the control moves on to the next line in your code (the scanf, in your case) in a nice, orderly way.

However, we emphasized that exec family system calls don't work that way. Instead, if the call to exec works, your code will never reach the line after the exec. Note that, in class and in the textbook, the line following the exec is almost always a function to print out an error message that says that the exec failed. Why? Because this message won't be printed out unless exec has failed.

Now, recall from class the explanation for how exec family system calls work. What did we say they did? They replace the text (executable code) and variables of the program that is currently running with the text and variables of a different program. So, the printf and scanf that you have coming after the execl system call won't be executed because the execl worked and the code of your program has been replaced in memory by the code of the /bin/ls program.

Understanding this is fundamental, not only to understanding how to complete this programming assignment, but to understanding why not all processes on a UNIX system are running the exact same program.


Q. My teamates and I are confused by the place function.

If I tell the place function to place "oldname.jpg" in the temp folder, should it be renamed to user2673-oldname.jpg or user2673-picshare.jpg, where user2673 is my username.

If you rename it user2673-picshare.jpg, then if you want to place another picture, there will be a conflict, because a file of that name already exists. Could you please clarify...

A. PicShare should rename the file user2673-picshare.jpg when it places it in the /tmp directory. This is because, while you may have as many pictures as you want in your own directories, PicShare will only help you share one picture at a time.


Q. We are having a problem in setting the mode. I have set umask to 0 by typing umask(0). By doing this it only works when we create the file by clicking on create new file icon. It does not work when we use pico command line in Unix. Can you please explain this to us and suggest some solution.

A. It is working fine for me. Perhaps we should ask ourselves what behavior we would expect to see.

First, most programs will not change the permissions of files that they use, unless they have a good reason to. Therefore, we would expect pico to leave the permissions of an existing file alone, because it doesn't have a good reason to change the permissions . (If a user wants to change file permissions, the way to do it is to use chmod, not to run pico and edit the file!)

This is exactly what pico does for me. Regardless of the value of umask, pico leaves the permissions of existing files alone. So, pico works as I would expect.

Second, when a program creates a new file, we'd expect it to create the file with appropriate permissions for the type of file it is creating. Let's see, pico is a text editor. This means that, by default, we'd expect pico to create files that can be read and written but not executed. So, who should be able to read and write these files? The user, group members, others? Well, pico isn't a special purpose utility for editing secret information like passwords or credit card information. Rather, it is just a general purpose text editor, for editing whatever text files the user wants to edit. So, we'd expect it to go with the default values that the user has set up. These values are set up using umask.

You say you set umask to 0. What does this mean? It means you have asked for no restrictions on access. Your default is no restrictions and pico should create files that can be read and written but not executed. When I create a new file with pico after setting my umask to 0, it creates the file with read and write permissions for user, for group, and for other. This is exactly what I would expect to have happen. Again, pico works just as I would expect.

So, is pico not working this way for you? Or, are your expectations wrong?

Perhaps it is your syntax. To change the umask in your shell, you need to type

% umask 0
not
% umask(0)
as you show in your message. The syntax "umask(0)" is the syntax for the system call inside a program, not the command at the shell prompt. Are you trying to set the umask inside a program, then using exec to run pico? If so, it should work just as I have described it above. Or, are you trying to set the umask inside a program, then run pico from a shell prompt, in which case the call to umask will fail to have any effect on pico, which is just as it should be.