Consider the following issues when writing your application:
No function exists to explicitly create a new project.
A user cannot log in if no default project for the user exists in the project database.
A new task in the user's default project is created when the user logs in.
Process association with a new project applies the new project's resource controls and pools membership to the process.
setproject() requires privilege. The newtask command does not require privilege if you own the process. Either can be used to create a task, but only newtask can change the project of a running process.
No parent/child relationship exists between tasks.
Finalized tasks can be created by using newtask -F or by using setproject() to associate the caller with a new project. Finalized tasks are useful when trying to accurately estimate aggregate resource accounting.
The reentrant functions, getprojent(), getprojbyname(), getprojbyid(), getdefaultproj(), and inproj(), use buffers supplied by the caller to store returned results. These functions are safe for use in both single-threaded applications and multithreaded applications.
Reentrant functions require these additional arguments: proj, buffer, and bufsize. The proj argument must be a pointer to a project structure allocated by the caller. On successful completion, these functions return the project entry in this structure. Storage referenced by the project structure is allocated from the memory specified by the buffer argument. bufsize specifies the size in number of bytes.
If an incorrect buffer size is used, getprojent() returns NULL and sets errno to ERANGE.