Are there any alternatives to err() that do not terminate/exit program? - c

Is there an alternative to the err() family of functions found in <err.h> that displays the program name, a semicolon, a space, and the error message... without exiting the program?
Pseudocode
I want
print "<program name>: <error message>"
and not
print "<program name>: <error message>"
exit program
return <status>
EDIT: I cannot use argv[0] (as the program name) to write out the message myself, as I am writing a library

program_invocation_name works just as well for getting the name of the program, as Erdal Küçük mentioned. From this, we can print the full error message, program name included.
The variable is part of glibc and can be retrieved using:
extern char *program_invocation_name;
Because it is not a part of the C standard library, programs using this variable should not be expected to be portable.

See man error.
error is the same as err but will return if status == 0, exit otherwise.
CONFORMING TO
These functions and variables are GNU extensions, and should not be used in programs intended to be portable.

The warn/warnx functions from err.h will do the same thing as err, but will return.
For example:
warnx("message here");
puts("I'm still running!");
Output:
a.out: message here
I'm still running!

Related

C - Linux Char Device openat() returns EINVAL

I'm writing my first Linux LKM. It's a simple chardev that has some basic read, write, open, release functions with a mutex lock. It compiles successfully, but when I try to open the chardev by cat /dev/kbschar, I get the following error
cat: /dev/kbschar: Invalid argument
The source code is on gitlab. I've linked to the main.c file. You can find the Makefile in the repository
The output of dmesg is here. I also used ftrace's function_graph tracer and filtered by :mod:main. Here is the output of that. Finally, I also ran strace cat /dev/kbschar to see where I was getting the EINVAL error. Here is the output to that. We have the EINVAL error at line 32.
Thanks for the help in advance
The last line of your dev_open function:
return true;
is not good. You're supposed to return an error code (negative errno) or zero for success. Whatever true is (probably defined as 1 somewhere?) it's not valid.

Difference between error function and printf function

First of all, sorry if someone already asked about this question.
I did search about this first, but couldn't find one.
I used to see some people doing something like this:
if ( // a certain conditions here ) {
error("ERROR: not bla bla bla")
}
what is error(....)? What is the difference with printf()?
Why they aren't using printf("ERROR: not bla bla bla") instead?
Thank you.
As i know, c language has no function name "error". I think that is a function or a macro is coded or defined by user.
To handle error in c, you can read this link. It has some different points with printf function.
http://www.tutorialspoint.com/cprogramming/c_error_handling.htm
Take a look of standard streams, which includes stdin (for input), stdout for output, and stderr for error messages. Usually stdout and stderr are just terminal output, so there are no differences. However, the output can be redirected to a text file while all error messages are still available output.
Also have look at this question perror vs frintf(stderr..), which gives you a better idea as to why perror should be used.

How to remove this line in language C : "Program ended with exit code: 0"

I wrote a code in C and it executed perfectly but at the end I got a line saying "Program ended with exit code: 0". What does this line signify and how do I get rid of this?
What it is?
an exit code of 0 indicates no error. If a program wants to
indicate there was something wrong when it exited it will exit with
a non-zero value.
How to get rid of it?
Do not use the IDE for program execution. – as BLUEPIXY said.
Basically what it means is that the program ran without any error. A 0 usually says that the program executed properly. Any nonzero number denotes some problem. Use text editors such as emacs or vim etc. and compile and execute your program.
The message doesn't come from your program itself, but from the IDE (e.g. Visual Studio) that launches the program. Try launching it from the command-line or by double-clicking the .exe file.
The meaning of "exit code 0" is usually: Everything went fine, the program exited successfully. Other exit codes usually stand for aborts because of errors and the actual number gives a hint about the type of error that occurred.

Why does perror function return success value?

i write a code for tcp connection in c language, and in some place i added two perrors:
perror("FAIL1: ...");
perror("FAIL2: ...");
and the output is:
FAIL1: ..: Success FAIL2: ..: Invalid argument
Just want to understand - what does it mean the "Success"? TNX!
Take a look at the man page below.
http://man7.org/linux/man-pages/man3/perror.3.html
The first two paragraphs have the content you need.
Essentially the string representation of "errno" a global variable is printed out along with your arguments. If you have no errors (errono = 0). This is causing your program to print "SUCCESS".

Rename file in Fortran 77

Is there a way to rename a file in fortran 77? such as:
RENAME(old name, new name)
or something like:
call system("rename" // trim(old name) // " " // trim(new name))
Thanks
I think you nailed it with the first one:
CALL RENAME('oldname','newname')
More here. And here.
You can use the modFileSys library for that. In contrast to non-standard compiler extensions, it can be compiled with any Fortran 2003 compiler and can be used an all POSIX compatible systems. You could also check for errors, if needed:
program test
use libmodfilesys_module
implicit none
integer :: error
! Renaming with error handling
call rename("old.dat", "new.dat", error=error)
if (error /= 0) then
print *, "Error happened"
end if
! Renaming without explicit error handling, stops the program
! if error happens.
call rename("old2.dat", "new2.dat")
end program test

Resources