`size_t`, `ssize_t`とは何か

size_t Used for sizes of objects.

size_tはオブジェクトのサイズを表すために使われる。unsignedな整数値である。

ssize_tsize_tにエラーを表す負の値が加わっている。signedな整数値である。

http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

詳しく

https://stackoverflow.com/questions/15739490/should-use-size-t-or-ssize-t

のベストアンサーより。

ssize_t is used for functions whose return value could either be a valid size, or a negative value to indicate an error. It is guaranteed to be able to store values at least in the range [-1, SSIZE_MAX] (SSIZE_MAX is system-dependent).

So you should use size_t whenever you mean to return a size in bytes, and ssize_t whenever you would return either a size in bytes or a (negative) error value.

See: http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

ssize_tはvalidなサイズであるか、エラーを示す負の値となる関数の戻り値として使われる。これは少なくとも[-1, SSIZE_MAX]の範囲の整数値を取ることができることが保証されている(SSIZE_MAXはシステム依存)。

サイズをバイト数で返すことができることを意味するときは常にsize_tを使い、バイト数で表されるサイズあるいは(負の)エラー値を返すときは常にssize_tを使うべきである。

この回答に付いたコメント

Well, this answer fails to fully explain the consequences of basing such decisions on pure interface considerations. It is unlikely that any implementation will use wider type for ssize_t than it uses for size_t. This immediately means that the price you will pay for the ability to return negative values is halving of the positive range of the type. I.e. SSIZE_MAX is usually SIZE_MAX / 2. This should be kept in mind. In many cases this price is not worth paying just for the ability to return -1 as a negative value.

signedな符号付き整数を使うと単純にコストが2倍になるのでssize_tが使われる場面は少ないと言っている。が、以降コメントにコメントが付いて若干荒れている。