Я только что столкнулся с той же проблемой. Код, который вызывал его для меня, был ...
execl("/bin/bash", "/bin/bash", fname, '\0');
но это должно быть ...
execl("/bin/bash", "/bin/bash", fname, (char *)0);
Проблема с первой версией заключается в том, что список параметров должен заканчиваться нулевым указателем. Но '\ 0' - это не нулевой указатель, это нулевой символ. Таким образом, значение (0) является правильным, это просто неправильный тип.
(char *) 0 также равен нулю, но приводится как char указатель , который является нулевым указателем (т.е. он указывает на адрес 0). Это необходимо для того, чтобы система могла определить, где заканчивается список параметров, чтобы она не продолжала сканировать параметры после последнего. Это приведет к недействительным указателям, которые могут указывать на любую память, что, вероятно, приведет к ошибке сегментации.
То, что (char *) 0 называется часовым, и это то, чего не хватало в первом примере.
Наконец, обратите внимание, что NULL определяется как (void *) 0, поэтому
execl("/bin/bash", "/bin/bash", fname, NULL);
Работает так же хорошо и немного удобнее. (Спасибо @mah за это).