I assume that you are asking in terms of performance, since in many cases the execution time is completely dependent on system calls.
Now, although it depends on the implementation (it even depends on the implementation, regardless of whether "system calls" exist), a good way to reason and make an educated guess is to use a "system call" as meaning "user-kernel-to-user" since this is really a system call.
Consider the strcpy example. It copies a string from one array (in your process space) to another array (also in your memory space). None of this makes any data other than these lines, so it would be pretty pathological to introduce kernel space as part of this operation.
On the other hand, consider the time function from time.h It returns the current system time. This is a shared system resource, so you can expect it to need to enter kernel space to read the current time kernel record. And traditionally, you would be right. However, modern versions of Linux, at least on some arches, display the kernel memory page in each user process as read-only - a page containing certain information that only the kernel can update, for example, system time, but all processes can read freely from user space without leakage of any sensitive data. Therefore, this question is more ambiguous.
Finally, you have operations, such as open or unlink , which must include switching from user to kernel to user, since they deal with shared resources (file system) on which permissions must be respected.
If you need a more empirical approach to answering your question, you can simply write a short program to call each function you are interested in and run it under strace .
source share